如何使用 Ruby OpenSSL 验证 X.509 证书?
How do I verify an X.509 certificate with Ruby OpenSSL?
我正在尝试验证 Amazon SNS 消息。它由 X.509 证书签名,并为证书提供 URL。
我可以根据证书检查签名,但我怎么知道证书有效?
我看到很多地方展示了如何让 OpenSSL 验证 SSLSocket 上使用的证书,但我看不到如何只检查证书是否有效。
我想我可以 "shell" 输出 运行 类似 openssl x509 -in <file> -text -noout
的东西,然后解析输出,但这似乎是一个蹩脚的解决方案。
所以:
cert = OpenSSL::X509::Certificate.new(Faraday.get(cert_url).body)
# now what?
好吧,一个周末的挣扎,现在更清楚了。
基本顺序是构建一个 OpenSSL::X509::Store,并用可信 CA 的证书填充它。
store = OpenSSL::X509::Store.new
store.set_default_paths # populates with some 'standard' ones
然后,我可以使用以下方法测试证书的有效性:
store.verify(cert)
在我的例子(验证 SNS 通知)中,一个额外的问题是我尝试验证的证书不是由受信任的 CA 直接签署的,所以我需要添加一个额外的级别。
我已经能够通过搜索网络获取签署 SNS 证书的证书来检查完整链。所以最终的代码最终是这样的:
def valid?(cert)
store.verify(cert)
end
def store
@store ||= OpenSSL::X509::Store.new.tap do |store|
store.set_default_paths
store.add_cert(OpenSSL::X509::Certificate.new(File.read('SNS_issuer_cert.cer')))
end
end
我正在尝试验证 Amazon SNS 消息。它由 X.509 证书签名,并为证书提供 URL。
我可以根据证书检查签名,但我怎么知道证书有效?
我看到很多地方展示了如何让 OpenSSL 验证 SSLSocket 上使用的证书,但我看不到如何只检查证书是否有效。
我想我可以 "shell" 输出 运行 类似 openssl x509 -in <file> -text -noout
的东西,然后解析输出,但这似乎是一个蹩脚的解决方案。
所以:
cert = OpenSSL::X509::Certificate.new(Faraday.get(cert_url).body)
# now what?
好吧,一个周末的挣扎,现在更清楚了。
基本顺序是构建一个 OpenSSL::X509::Store,并用可信 CA 的证书填充它。
store = OpenSSL::X509::Store.new
store.set_default_paths # populates with some 'standard' ones
然后,我可以使用以下方法测试证书的有效性:
store.verify(cert)
在我的例子(验证 SNS 通知)中,一个额外的问题是我尝试验证的证书不是由受信任的 CA 直接签署的,所以我需要添加一个额外的级别。
我已经能够通过搜索网络获取签署 SNS 证书的证书来检查完整链。所以最终的代码最终是这样的:
def valid?(cert)
store.verify(cert)
end
def store
@store ||= OpenSSL::X509::Store.new.tap do |store|
store.set_default_paths
store.add_cert(OpenSSL::X509::Certificate.new(File.read('SNS_issuer_cert.cer')))
end
end