Apache-2.2

apache客戶端證書身份驗證錯誤:證書驗證:錯誤(18):自簽名證書

  • April 22, 2015

所以我一直在按照說明在 Apache2 w/mod_ssl 中設置客戶端證書身份驗證。這僅用於針對 CAA 測試應用程序的目的,而不是用於任何類型的生產用途。

到目前為止,我已經http://www.impetus.us/~rjmooney/projects/misc/clientcertauth.html聽取了有關生成我的 CA、伺服器和客戶端加密資訊的建議。我把這三個都放進去了/etc/ssl/ca/private。我在我的 default_ssl 站點文件中設置了以下附加指令:

<IfModule mod_ssl.c>
<VirtualHost _default_:443>
...
   SSLEngine on
   SSLCertificateFile    /etc/ssl/ca/private/server.crt
   SSLCertificateKeyFile /etc/ssl/ca/private/server.key
   SSLVerifyClient require
   SSLVerifyDepth 2

   SSLCACertificatePath /etc/ssl/ca/private
   SSLCACertificateFile /etc/ssl/ca/private/ca.crt
   <Location />
           SSLRequireSSL
           SSLVerifyClient require
           SSLVerifyDepth 2
   </Location>
   <FilesMatch "\.(cgi|shtml|phtml|php)$">
           SSLOptions +StdEnvVars
   </FilesMatch>
   <Directory /usr/lib/cgi-bin>
           SSLOptions +StdEnvVars
   </Directory>
...
</VirtualHost>
</IfModule>

我已經將 p12 文件安裝到 Chrome 中,但是當我訪問https://localhost時,出現以下錯誤

鉻合金:Error 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL protocol error.

阿帕奇:Certificate Verification: Error (18): self signed certificate

如果我不得不猜測,我的指令之一沒有正確設置來載入和驗證帶有我自己創建的 CA 的 p12。但我無法終生弄清楚它是什麼。有沒有人有更多的經驗可以為我指明正確的方向?

首先,我建議避免同時使用SSLCACertificatePath兩者SSLCACertificateFileSSLCACertificatePath用於指向包含多個文件的目錄,每個文件對應一個您信任的 CA 證書。SSLCACertificateFile用於指向單個文件,是您信任的所有 CA 證書的串聯。指向一個也包含私鑰的目錄並沒有什麼意義SSLCACertificatePath(儘管我不確定它是否會導致問題)。

重要的是您使用的客戶端證書是由其中一個 CA 證書頒發的(由您將使用的任何一個指向SSLCACertificatePathSSLCACertificateFile:客戶端證書的頒發者 DN 必須是其中一個的主題 DN您在 Apache Httpd 中以這種方式配置的 CA 證書(此外,它必須真正由該 CA 頒發,因此您的客戶端證書的簽名必須可由 CA 證書的公鑰驗證,但我假設您已經創建了您的 CA並正確頒發證書:您可能需要檢查一下,以防萬一)。

您可以使用以下命令檢查 PEM 形式(通常為.pem.crt)的證書內容(CA 或非 CA):

openssl x509 -text -noout -in filename.pem

(這應該顯示有關證書的足夠資訊。)

編輯:

萬一您的證書可能有問題,您可以嘗試這些測試證書:

http://jsslutils.googlecode.com/svn/tags/jsslutils-root-1.0.7/certificates/src/main/resources/org/jsslutils/certificates/local/

(所有密碼都是testtest。)

您可以導入testclient.p12到瀏覽器中。cacert.pem是 PEM 格式的 CA 證書,並且localhost-cert.pem是伺服器證書localhost(因此它旨在從機器本身進行測試)。localhost-key.pem是伺服器證書的私鑰。您可以使用以下方法取消保護它:

openssl rsa -in localhost-key.pem -out localhost-key-unprotected.pem

您可能需要cacert.pem暫時信任您的瀏覽器,但在測試後將其刪除(因為顯然testtest這不是什麼秘密,因此任何人都可以使用此 CA)。

引用自:https://serverfault.com/questions/342918