apache客戶端證書身份驗證錯誤:證書驗證:錯誤(18):自簽名證書
所以我一直在按照說明在 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
兩者SSLCACertificateFile
。SSLCACertificatePath
用於指向包含多個文件的目錄,每個文件對應一個您信任的 CA 證書。SSLCACertificateFile
用於指向單個文件,是您信任的所有 CA 證書的串聯。指向一個也包含私鑰的目錄並沒有什麼意義SSLCACertificatePath
(儘管我不確定它是否會導致問題)。重要的是您使用的客戶端證書是由其中一個 CA 證書頒發的(由您將使用的任何一個指向
SSLCACertificatePath
)SSLCACertificateFile
:客戶端證書的頒發者 DN 必須是其中一個的主題 DN您在 Apache Httpd 中以這種方式配置的 CA 證書(此外,它必須真正由該 CA 頒發,因此您的客戶端證書的簽名必須可由 CA 證書的公鑰驗證,但我假設您已經創建了您的 CA並正確頒發證書:您可能需要檢查一下,以防萬一)。您可以使用以下命令檢查 PEM 形式(通常為
.pem
或.crt
)的證書內容(CA 或非 CA):openssl x509 -text -noout -in filename.pem
(這應該顯示有關證書的足夠資訊。)
編輯:
萬一您的證書可能有問題,您可以嘗試這些測試證書:
(所有密碼都是
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)。