【问题标题】:How do I verify an X.509 certificate with Ruby OpenSSL?如何使用 Ruby OpenSSL 验证 X.509 证书?
【发布时间】:2015-03-07 03:56:31
【问题描述】:

我正在尝试验证一条 Amazon SNS 消息。它由 X.509 证书签名,并提供证书的 URL。

根据证书检查签名没有问题,但我怎么知道证书有效?

我看到很多地方展示了如何让 OpenSSL 验证 SSLSocket 上使用的证书,但我不知道如何只检查证书是否有效。

我想我可以“脱壳”运行openssl x509 -in <file> -text -noout 之类的东西,然后解析输出,但这似乎是一个蹩脚的解决方案。

所以:

cert = OpenSSL::X509::Certificate.new(Faraday.get(cert_url).body)
# now what?

【问题讨论】:

    标签: ruby openssl x509certificate


    【解决方案1】:

    嗯,挣扎了一个周末,现在更清楚了。

    基本顺序是构造一个 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
    

    【讨论】:

    • 很高兴知道如何找到一个证书,给定一个颁发者——我希望能够执行诸如递归获取 cert.issuer 之类的操作,直到它失败或我的商店可以验证它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多