2009-09-21 37 views
33

我的應用使用SSL與服務器進行安全通信,並且無法驗證證書鏈。鏈是這樣的:理解SSL證書鏈驗證的問題

Entrust.net安全服務器證書頒發機構 - > DigiCert全球CA - > * .ourdomain.com

我們使用的是證書存儲來自Mozilla的拉動。它包含Entrust.net證書,但不包含DigiCert全球CA證書。

我的理解是,中間的權威沒有,只要root權限被信任,但驗證失敗:

% openssl verify -CAfile mozilla-root-certs.crt ourdomain.com.crt 
error 20 at 0 depth lookup:unable to get local issuer certificate 

所以我需要明確地信任DigiCert全球CA在爲了驗證通過?這似乎是錯誤的。但你告訴我!

編輯:我現在明白,證書文件需要預先提供給OpenSSL。像這樣的工作:

% openssl verify -CAfile mozilla-root-certs.crt -untrusted digicert.crt ourdomain.com.crt 
ourdomain.com.crt: OK 

這讓我提供DigiCert CA的副本,而不明確地說:「我相信它」,整個產業鏈仍有待驗證。

但是像Firefox這樣的瀏覽器肯定不會總是附帶它需要的每一個證書的副本。總會有新的CA,關鍵是要使用根證書的安全性來確保所有中間CA都是有效的。對?那麼如何這項工作?它看起來真的很傻嗎?

+0

在OpenBSD上,'-CAfile'可以設置爲'/ etc/ssl/cert.pem'。 – 2015-07-24 12:30:41

回答

16

中級證書必須安裝在您的Web服務器以及您自己的域的證書。上週我遇到了同樣的問題...... Firefox似乎比其他瀏覽器更挑剔。

+4

啊哈...好的。感謝大衛的洞察力。 對於那些來自Google的人來說,配置apache的關鍵詞是SSLCertificateChainFile。看到這個(來自DigiCert本身!) http://www.digicert.com/ssl-certificate-installation-apache.htm – 2009-09-21 18:59:58

+0

最棒的。謝謝,喬希,這幫助了我很多。 – 0xCAFEBABE 2011-08-18 10:00:23

6

這裏是驗證從Web服務器

  • 客戶維護可信CA根證書列表來一個certficate正確的方式
  • 的Web服務器將返回下面的服務器證書 - 要求
  • 中級證書(s) - 必需ROOT CA證書 - 不需要/可選

當客戶端連接到服務器時,它會獲得服務器證書和中介來自服務器的證書。然後,客戶端從服務器證書建立一個信任鏈,通過中間證書到它所信任的其中一個CA ROOT證書。 ROOT證書始終是自簽名的 - 所以這就是鏈條停止的地方。

下面是一個簡單的命令用openssl

openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT 

在虛擬主機,其中多個證書送達同一IP的情況下進行測試的web服務器證書:PORT,服務器名稱指示(SNI)可以使用-servername <FQDN>啓用。否則,將發送默認證書。