2012-02-22 43 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

相關問題