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

标签 ruby openssl x509certificate

我正在尝试验证 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?

最佳答案

好吧,一个挣扎的周末,现在更清楚了。

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

关于ruby - 如何使用 Ruby OpenSSL 验证 X.509 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28911200/

相关文章:

ruby-on-rails - 让 'form_for(@something)' 在 new.html.erb 之外工作

在 OpenSSL 中释放/分配上下文的正确方法

ubuntu - 在 Ubuntu 上打开 CA 私钥时出错

linux - 无法使用 OpenSSL 1.0.2k 构建 APR-util 1.5.4

c# - 从 C# 中的 x509 证书字节读取 RSA 公钥

ruby - 为什么实例变量在 block 内时似乎消失了?

ruby-on-rails - Ruby on Rails 身份验证指南

C#,无法将 .p7b 证书导入 Windows 应用商店

ruby - 'gems' 配置选项已重命名为 'plugins' .?

c# - 找不到请求的对象。创建 X509certificate2 时