如何使用Ruby OpenSSL验证X.509证书?

sco*_*ttb 4 ruby openssl x509certificate

我正在尝试验证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?
Run Code Online (Sandbox Code Playgroud)

sco*_*ttb 7

好吧,一个挣扎的周末,它现在更加清晰.

基本顺序是构造一个OpenSSL :: X509 :: Store,并使用可信CA的证书填充它.

store = OpenSSL::X509::Store.new
store.set_default_paths # populates with some 'standard' ones
Run Code Online (Sandbox Code Playgroud)

然后,我可以用以下方法测试证书的有效性:

store.verify(cert)
Run Code Online (Sandbox Code Playgroud)

在我的情况下(验证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
Run Code Online (Sandbox Code Playgroud)