2012-02-22 68 views
0

我有一个网络服务器,我在(www.trailmyx.com)上运行一个小型企业。最近我开始开发一些基本的SSL套接字代码(使用C++),并且我编写了一个与OpenSSl连接并执行http GET的小型测试程序。我可以使用我的客户端在www.google.com 443端口(或任何其他站点)上成功使用,除了我自己的。为什么我的SSL代码只能对MY webserver失败?

当我尝试对我自己的服务器使用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工作得很好。

+1

也许可信CA的浏览器的列表不同的是一个比OpenSSL的使用? – 2012-02-22 18:30:28

+0

@BrendanLong - 如果是这样,为什么SELF_SIGNED_CERT错误?而不是一个更通用的错误,它只是未通过身份验证? – dicroce 2012-02-22 18:35:22

+0

此外,wget https://www.godaddy.com(这对我的服务器失败)对https://www.godaddy.com(谁是CA)工作... – dicroce 2012-02-22 18:37:04

回答

0

根据the documentation

X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:自签名证书

传递的证书是自签名和相同的证书不能在受信任的证书列表中找到。

这听起来好像它可能意味着它不信任您的CA.自从GoDaddy老了并且trusted by just about everyone以来,这很奇怪。

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

编辑:这也可能是你缺少中间证书。请参阅this question。基本上,如果您有:

  • 一个信任B
  • B信任你

,你有一个证书和证书,那么你还需要B的核查工作的证书。

5

我试过openssl s_client -connect www.trailmyx.com:443 -showcerts,它确实说明你的证书自签名:在SSL组合

Server certificate subject=/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=ip-97-74-119-124.ip.secureserver.net/[email protected] issuer=/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=ip-97-74-119-124.ip.secureserver.net/[email protected]

也许您的服务器使用Server Name Indication(SNI),允许基于域名的虚拟主机?

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

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

+0

其实,当我使用该命令即使没有-tls1,它仍然可以验证。 – dicroce 2012-02-22 21:19:08

+0

@dicroce:这可能取决于您的设置,如全局OpenSSL配置。我需要我的Ubuntu服务器上的-tls1。当我用'-no_tls1'显式运行时,我得到了错误的证书,所以很明显TLS是必需的。 – 2012-02-24 17:03:41