如何枚举捆绑中的多个证书?

时间:2016-05-02 23:27:50

标签: ruby ssl-certificate x509

我可以从包含证书的文件中创建OpenSSL::X509::Certificate个对象:

blob = IO.binread path
cert = OpenSSL::X509::Certificate.new blob

但是,这会从文件中找到的第一个证书创建证书对象。处理certificate- 捆绑包时,会悄悄忽略同一文件中的后续证书。

我想,我可以将blob拆分为"\n-----END CERTIFICATE-----\n"并将每个部分都提供给OpenSSL::X509::Certificate.new,但我不确定,这将适用于所有文件格式,我的脚本可能会遇到并希望能够继续操作。

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

好的,假设只有PEM编码的证书可以打包到一个包中,我编写了如下代码。如果假设无效 - 或者您可以提供更好的方式,请告诉我!

DELIMITER = "\n-----END CERTIFICATE-----\n"
blob = IO.binread path
blobs = blob.split(DELIMITER)
blobs.each do |blob|
    blob += DELIMITER # Does not break DER
    cert = OpenSSL::X509::Certificate.new blob
    .... process the cert ....
end

不是分割然后重新添加分隔符,而是可以使用scan,但这需要使用正则表达式,这可能比我正在做的更昂贵...

此代码也适用于DER编码的证书 - 但每个文件只能使用一个,因为没有明显的方法可以拆分它们。

答案 1 :(得分:2)

有些挖掘,似乎Ruby openssl绑定不支持这一点。对于原始C绑定来说,这似乎并不常见和/或容易。我在网上找到的所有代码都显示了使用单个证书进行操作,或者使用X509商店来验证其他证书。我没有看到任何一个证书“对象”引用多个证书和/或在商店中迭代证书的示例。

所以我认为简短的回答是:不。至少Ruby绑定提供的任何内容都无法帮助您实现此目的。

如果您的用例是针对一组证书验证证书,则始终OpenSSL::X509::Store,其方法store.add_file将该文件中的所有证书添加到商店,并且具有方法根据捆绑内容验证证书是否有效。

答案 2 :(得分:2)

我不知道ruby,但是使用C你可以加载一个CRT(和CRL)包就像

X509_STORE  *store = X509_STORE_new();
X509_LOOKUP *lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());

X509_LOOKUP_load_file(lookup, argv[i], X509_LU_X509);

并使用

迭代其元素
for (int i = 0; i < sk_X509_OBJECT_num(store->objs); ++i) {
    X509_OBJECT *o = sk_X509_OBJECT_value(store->objs, i);

    switch (o->type) {
    case X509_LU_X509:
        handle_crt(o->data.x509);