我可以从包含证书的文件中创建OpenSSL::X509::Certificate
个对象:
blob = IO.binread path
cert = OpenSSL::X509::Certificate.new blob
但是,这会从文件中找到的第一个证书创建证书对象。处理certificate- 捆绑包时,会悄悄忽略同一文件中的后续证书。
我想,我可以将blob
拆分为"\n-----END CERTIFICATE-----\n"
并将每个部分都提供给OpenSSL::X509::Certificate.new
,但我不确定,这将适用于所有文件格式,我的脚本可能会遇到并希望能够继续操作。
有更好的方法吗?
答案 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);