那麼,首先要檢查Tomcat是否配置正確,以從客戶端請求有關該路徑的證書。對於Tomcat 6,這意味着您應該在conf/server中配置一個Connector .XML是這樣的:
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="${user.home}/.keystore" keystorePass="password"
truststoreFile="conf/truststore" truststorePass="password"
clientAuth="true" sslProtocol="TLS" />
的truststoreFile & truststorePass是很重要的 - 如果你只需要添加「clientAuth =真正的」不包括這兩個參數,你會看到奇怪的行爲,各種(和沒有警告你做了任何錯誤)。truststoreFile必須指向一個合法的JKS文件,該文件列出了您信任的簽名客戶端證書的CA.如果Tomcat配置正確,瀏覽器應該按照以下方式向用戶彈出對話框:「網站需要客戶端證書」以及已導入瀏覽器的所有證書列表。如果你沒有看到這個,你的Tomcat設置有問題。
聽起來你已經設置正確,但值得仔細檢查。另外,如果您設置正確,如果您在wireshark中按專有名稱列出受信任的CA,則會看到「證書請求」握手消息。再一次,如果你沒有看到這一點,請檢查你的Tomcat設置,最重要的是信任庫。
接下來就是檢查PKCS12文件本身。您可以這樣做:
openssl pkcs12 -in [path-to-pkcs12-file] -nokeys | openssl x509 -noout -subject -issuer
確保發行人的專有名稱與信任庫中的trustedCaCert條目之一匹配。這有點麻煩做Java keytool的,但你可以通過仔細檢查:
keytool -exportcert -keystore conf/truststore -alias [alias of trusted cert] | openssl x509 -noout -subject -inform der
如果所有這些檢查出來,但它仍然沒有工作,它使用OpenSSL的的s_client.First解決是值得的,因爲你通常會從中獲得更多的故障排除信息。要做到這一點,你必須重點從PKCS12文件中的證書分開:
openssl pkcs12 -in [PKCS12 file] -out [whatever].key
openssl s_client -tls1 -connect localhost:443 -cert [whatever].key -key [whatever].key
(您可以使用相同的文件爲「-cert」和「 - 鍵」的說法,因爲OpenSSL是聰明足夠查找源文件中的「BEGIN CERTIFICATE」和「BEGIN RSA PRIVATE KEY」分隔符)。我有一個令人沮喪的問題,我無法弄清客戶端證書,直到我使用s_client並得到一個提醒,說明我的客戶端證書已過期(未記錄或輸出到其他地方)。
而且,你可能要認真考慮轉移您的配置使用Apache Tomcat的過度 - Apache是一個很多更加靈活,併爲您提供一個很多更多的反饋,當涉及到SSL confifguration比Tomcat是。
你已經爲你的服務器設置了客戶端認證,你說你的連接器有什麼樣的keystore? – Cratylus 2012-04-12 13:43:30
jks,我不認爲有問題,因爲它與我自己生成的密鑰一起工作,並使用pss密鑰使用openssl s_client。只是沒有與使用Firefox的pfx工作,即(與Windows存儲中的密鑰)或指向p12密鑰庫的java-app – Deo 2012-04-12 14:46:13
您描述它的方式pfx是空的或損壞的。您是否嘗試查看其內容? – Cratylus 2012-04-12 14:53:38