Tomcat雙向認證的問題這麼多,貼一篇我總結的Tomcat雙向認證方法
tomcat實現SSL配置
tomcat實現SSL配置
編輯tomcat的設定檔server.xml,去掉下面SSL Connector的注釋,修改為如下:
<!-- Define an SSL HTTP/1.1 Connector on port 8443 -->;
<Connector className="org.apache.catalina.connector.http.HttpConnector"
port="8443" minProcessors="5" maxProcessors="75"
enableLookups="true"
acceptCount="10" debug="0" scheme="https" secure="true">;
<Factory className="org.apache.catalina.net.SSLServerSocketFactory"
clientAuth="false" keystoreFile="tomcat.keystore"
keystorePass="tomcat" protocol="TLS"/>;
</Connector>;
keystoreFile的路徑是TOMCAT的安裝路徑下的tomcat.keystore(使用keytool產生的認證庫檔案)
>;keytool -genkey -alias tomcat -keyalg RSA -keysize 1024 -validity 365 -keystore tomcat.keystore
keystoreFile儲存了伺服器端的認證庫,用於用戶端認證。
常用的配置屬性:
clientAuth
如果想要Tomcat為了使用這個socket而要求所有SSL客戶出示一個客戶認證,置該值為true。
keystoreFile
如果建立的keystore檔案不在Tomcat認為的預設位置(一個在Tomcat啟動並執行home目錄下的叫.keystore的檔案),則加上該屬性。可以指定一個絕對路徑或依賴$CATALINA_BASE環境變數的相對路徑。
keystorePass
如果使用了一個與Tomcat預期不同的keystore(和認證)密碼,則加入該屬性。
keystoreType
如果使用了一個PKCS12 keystore,加入該屬性。有效值是JKS和PKCS12。
sslProtocol
socket使用的加密/解密協議。如果使用的是Sun的JVM,則不建議改變這個值。據說IBM的1.4.1版的TLS協議的實現和一些流行的瀏覽器不相容。這種情況下,使用SSL。
ciphers
此socket允許使用的被逗號分隔的密碼列表。預設情況下,可以使用任何可用的密碼。
algorithm
使用的X509演算法。預設為Sun的實現(SunX509)。對於IBM JVMS應該使用ibmX509。對於其它JVM,參考JVM文檔取正確的值。
truststoreFile
用來驗證客戶認證的TrustStore檔案。
truststorePass
訪問TrustStore使用的密碼。預設值是keystorePass。
truststoreType
如果使用一個不同於正在使用的KeyStore的TrustStore格式,加入該屬性。有效值是JKS和PKCS12。
使用https://localhost:8443 就可以進行ssl串連的檢測
----------------------------------------------------------------------------------------
上訴的SSL串連是用戶端單向證明伺服器,如果雙向認證,將server.xml檔案的Connector配置
clientAuth="false"
Java伺服器端的認證庫,伺服器認證用戶端時使用的根憑證庫。
認證庫位置:JAVA_HOME/jre/lib/security/cacerts keystore密碼為:changeit
將用戶端個人認證的根憑證匯入伺服器的認證庫,就可以認證用戶端。
伺服器端認證的產生:
>;keytool -genkey -alias tomcat -keyalg RSA -keysize 1024 -validity 365 -keystore tomcat.keystore
>;keytool -certreq -alias tomcat -file Server.csr -keystore tomcat.keystore 產生認證請求檔案
使用openssl命令用根憑證簽名,再匯入簽署憑證
>;keytool -import -trustcacerts -alias tomcat -file Server.pem -keystore tomcat.keystore
注意-trustcacerts選項,使用伺服器的認證庫認證該認證,首先要將根憑證匯入cacerts中。
----------------------------------------------------------------------------------------
Tomcat配置SSL,我出現的問題
我用openssl建立了CA認證,Server認證,Client認證。
使用keytool將Server認證匯入tomcat.keystore檔案中,將Tomcat的設定檔server.xml關於SSL的配置設為keystoreFile=tomcat.keystore.SSL串連時,用戶端認證tomcat.keystore中的伺服器憑證。
將CA認證匯入$JAVA_HOME/jre/lib/security/cacerts這個keystore中,用於驗證用戶端認證。
在IE中安裝CA認證和Client認證(pkcs12,包含私密金鑰的個人認證形式)。
建立SSL串連https://localhost:8443,串連失敗。
經過反覆思量,知道問題所在,SSL串連時,用戶端證明伺服器時,需要驗證伺服器的簽名,那麼tomcat.keystore中就應該有Server的私密金鑰。所以匯入Server認證時,應該匯入包含私密金鑰的Server認證。
keytool命令不能匯入私密金鑰檔案,可以通過在keystore中產生自我簽署憑證,匯出認證請求,用CA認證簽名後,在導回的方法。
導回簽署憑證的過程
>;keytool -import -trustcacerts -alias tomcat -file Server.pem -keystore tomcat.keystore
注意-trustcacerts選項,使用伺服器的認證庫認證該認證,首先要將根憑證匯入Java的根憑證庫中:JAVA_HOME/jre/lib/security/cacerts中。
----------------------------------------------------------------------------------------
分析IE實現實現SSL串連的中的認證雙向認證過程
在地址欄中輸入https://localhost:8443
用戶端向伺服器發送hello訊息,tomcat伺服器偵聽8443連接埠,收到SSL串連的hello訊息,伺服器發送server certificate,並且發送client certificate request.用戶端IE收到server certificate後取出issuer項,和IE受信任的根憑證庫中認證的subject比對,找到合適的根憑證認證server certificate。並且同時向伺服器發送client certificate,伺服器收到client certificate後,tomcat伺服器尋找根憑證庫cacerts中的根憑證的suject,找到合適的根憑證認證client certificate.在認證的同時完成密鑰協商。用戶端認證結束後,IE會彈出"安全警報"對話方塊,使用者可以查看伺服器憑證,以及伺服器憑證是否受信任,可以選擇是否繼續SSL串連。