【问题标题】:Verifying only that a SSL certificate is signed by a CA?仅验证 SSL 证书是否由 CA 签名?
【发布时间】:2014-06-18 10:19:29
【问题描述】:

我正在构建一个库来讨论第三方的 Web 服务,我们直接在 IP 上连接到该服务。该服务受 SSL 保护,我们提供客户证书来识别我们。他们提供的证书是自签名的,我有 CA 公钥,这很好,但他们证书的 CN 是电子邮件地址,因此不被视为有效。

是否只验证证书是由 CA 签署的?如果这有帮助,我正在使用 Ruby,尽管我猜它更像是一个 OpenSSL 的东西。另一种方法是不验证他们的证书,但我显然不想那样做。

(如果您想知道,要求他们更改证书或添加主机名不是一种选择。这是企业:D)

【问题讨论】:

  • "...但他们证书的 CN 是一个电子邮件地址,因此它不被视为有效" - 使用主题备用名称 (SAN),而不是通用名称 (CN)。 IETF 和 CA/B 均不赞成将 DNS 名称放入 CN。所以听起来他们在做正确的事情如果 DNS 名称在 SAN 中。
  • "...如果有帮助,我正在使用 Ruby,..." - Ruby 是一种劣势。当谈到 SSL/TLS 和 PKI 的优点时,它有点蹩脚。它没有暴露足够多的来自 OpenSSL 的东西。
  • 您能提供证书详细信息吗?您可以使用openssl x509 -in <cert> -inform PEM -text -noout。将输出粘贴到问题中。

标签: ruby ssl openssl self-signed ca


【解决方案1】:

只检查 CA 而不是主机名提供的安全性与根本不检查一样多。例如。如果一个 CA 发出 google.com 并且同一个 CA 发出 Attacker.com,如果您不检查证书中的名称是否与目标名称匹配,我可以简单地使用 Attacker.com 的证书来合并 google.com。

如果您已经知道预期的对等证书,并且只想确保连接到提供此证书的主机,则应该可以禁用任何内置的证书验证并在完成后检查证书的指纹SSL 连接已建立。 我不太了解红宝石,但这可能意味着使用peer_cert 方法访问证书,然后使用to_pemto_der 获取字符串表示形式,您可以使用它与您的期望进行比较(或提取公钥进行比较)。

【讨论】:

  • "...而不是主机名提供与不检查一样多的安全性"。 +1。还不如使用匿名 Diffie-Hellman (ADH) 来取消安全剧院。
猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2012-01-15
  • 2015-01-29
  • 2011-12-03
  • 2020-10-27
  • 1970-01-01
  • 2020-03-15
相关资源
最近更新 更多