为什么我的SSL代码仅针对MY webserver失败?

时间:2012-02-22 18:28:09

标签: c++ openssl

我有一个网络服务器,我在(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会返回自签名证书... 但为什么?浏览器是如何做到的? BTW-CURL工作正常。

2 个答案:

答案 0 :(得分:5)

我尝试了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

答案 1 :(得分:0)

根据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的证书才能进行验证。