【问题标题】:Why does my SSL code fail only against MY webserver?为什么我的 SSL 代码只对我的网络服务器失败?
【发布时间】:2012-02-22 18:28:08
【问题描述】:

我有一个网络服务器,我在 (www.trailmyx.com) 上经营一家小型副业。最近我开始开发一些基本的 SSL 套接字代码(在 C++ 中),我编写了一个与 OpenSSl 连接并执行 http GET 的小型测试程序。除了我自己的以外,我可以在端口 443(或任何其他站点)上成功地使用我的客户端对抗 www.google.com。

当我尝试对自己的服务器进行 SSL_get_verify_result(ssl) 时,我得到了返回:X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT。

现在,当我在浏览器 (https://www.trailmyx.com) 中访问我的网站时,我可以检查证书并且一切正常...它不会显示为自签名。

同样,当我对我的服务器使用 wget 时,我得到了同样的自签名证书错误。

我的直觉是我的网站以某种方式配置错误,但如果是这样,浏览器如何做到这一点?它们是浏览器知道的其他一些 OpenSSL 调用序列吗?

注意:当 wget 针对我的服务器返回时,它会从证书中打印一些信息。这些信息都不是有效的(例如:/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit)我强烈怀疑由于某种原因,在某些情况下 apache 正在返回一个自签名证书... 但为什么?浏览器是如何做到的?顺便说一句-CURL 工作得很好。

【问题讨论】:

  • 也许您浏览器的受信任 CA 列表与 OpenSSL 使用的不同?
  • @BrendanLong - 如果是这样,为什么 SELF_SIGNED_CERT 错误?而不是更一般的错误,它只是未能通过身份验证?
  • 另外,wget godaddy.com(对我的服务器失败)对 godaddy.com(谁是 CA)有效...

标签: c++ openssl


【解决方案1】:

我试过openssl s_client -connect www.trailmyx.com:443 -showcerts,它确实显示你的证书是自签名的:

Server certificate subject=/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=ip-97-74-119-124.ip.secureserver.net/emailAddress=root@ip-97-74-119-124.ip.secureserver.net issuer=/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=ip-97-74-119-124.ip.secureserver.net/emailAddress=root@ip-97-74-119-124.ip.secureserver.net

也许您的服务器正在使用Server Name Indication (SNI) 来允许在 SSL 中组合使用基于名称的虚拟主机?

更新:我的预感是正确的:您需要使用 SNI 和 TLS 才能使其工作。此命令显示预期的证书:

openssl s_client -connect www.trailmyx.com:443 -servername www.trailmyx.com -tls1

【讨论】:

  • 实际上,当我使用该命令时,即使没有 -tls1,它仍然能够验证。
  • @dicroce:这可能取决于您的设置,例如您的全局 OpenSSL 配置。我需要在我的 Ubuntu 服务器上使用 -tls1。当我使用-no_tls1 明确运行时,我得到了错误的证书,因此很明显需要 TLS。
【解决方案2】:

根据the documentation

X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:自签名证书

通过的证书是自签名的,在受信任的证书列表中找不到相同的证书。

在我看来,可能意味着它不信任您的 CA。不过这很奇怪,因为 GoDaddy 已经老了而且trusted by just about everyone

您可以尝试使用 -CAFile option 对不同的 CA 列表运行它。

编辑:您也可能缺少中间证书。见this question。基本上如果你有:

  • A 信任 B
  • B 信任你

而且你有A的证书和你的证书,那么你还需要B的证书才能验证。

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2012-01-12
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多