用keytool製做證書並在tomcat配置https服務(一)html
用keytool製做證書並在tomcat配置https服務(二)apache
用keytool製做證書並在tomcat配置https服務(三)瀏覽器
上一篇咱們實現了服務端本身模擬CA認證,那麼有個問題。tomcat
一個客戶端和服務端對接就須要把這個客戶端的證書拿來導入到服務端的密鑰庫中。那麼不少客戶端要對接,就要屢次導入。spa
能夠這樣,讓客戶端發送證書的csr文件給咱們,咱們用模擬的CA密鑰庫對客戶端證書也進行簽名頒發。code
而後把簽名後的證書發送給他,讓他本身導入到本身的客戶端密鑰庫裏【也須要先導入根證書,再導入簽名證書】。server
-------------------------------------------------------------------------------------------------------------------------------------------------------------------xml
這樣的話https交互時,htm
服務端發送簽名證書給客戶端:客戶端能用安裝在瀏覽器中的【受信任的頒發機構】中的rootca.cer根證書進行驗證。blog
客戶端發送簽名證書給服務端:服務端也能用信任的庫裏的rootca根證書對客戶端發來簽名證書進行校驗。
爲了清晰點,從頭開始作,就不展現圖片了。
服務端:
1.建立CA庫,用於對證書籤名
keytool -genkey -alias rootca -keypass 123456 -keyalg RSA -keysize 2048 -validity 365 -storetype JKS -keystore D:/ssl/castore.jks -storepass 123456
2.建立服務端密鑰庫
keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 2048 -validity 365 -storetype JKS -keystore D:/ssl/keystore.jks -storepass 123456
3.建立服務端證書籤名請求文件
keytool -certreq -keyalg RSA -alias tomcat -sigalg SHA256withRSA -keystore D:/ssl/keystore.jks -file D:/ssl/serverreq.csr
4.CA庫對服務端證書進行簽名,生成一個證書文件
keytool -gencert -alias rootca -keystore D:/ssl/castore.jks -infile D:/ssl/serverreq.csr -outfile D:/ssl/signedserver.cer
5.從CA庫導出rootca根證書
keytool -export -alias rootca -keystore D:/ssl/castore.jks -storetype JKS -keypass 123456 -file D:/ssl/rootca.cer
6.將rootca導入到服務端密鑰庫
keytool -import -v -alias rootca -file D:/ssl/rootca.cer -keystore D:/ssl/keystore.jks
7.將服務端簽名證書導入到服務端的密鑰庫,覆蓋原證書。
keytool -import -v -alias tomcat -file D:/ssl/signedserver.cer -keystore D:/ssl/keystore.jks
8.tomcat的server.xml添加配置【clientAutl=true,雙向認證】
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" keystoreFile="D:/ssl/keystore.jks" keystorePass="123456" truststoreFile="D:/ssl/keystore.jks" truststorePass="123456" clientAuth="true" sslProtocol="TLS" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" />
客戶端:
1.建立客戶端密鑰庫
keytool -genkey -alias client -keypass 123456 -keyalg RSA -keysize 2048 -validity 365 -storetype JKS -keystore D:/ssl/client.jks -storepass 123456
2.建立客戶端證書籤名請求文件
keytool -certreq -keyalg RSA -alias client -sigalg SHA256withRSA -keystore D:/ssl/client.jks -file D:/ssl/clientreq.csr
3.把客戶端證書籤名請求文件clientreq.csr發送給服務端,服務端的模擬CA密鑰庫對證書進行簽名,生成一個證書文件【如下這條是服務端執行】
keytool -gencert -alias rootca -keystore D:/ssl/castore.jks -infile D:/ssl/clientreq.csr -outfile D:/ssl/signedclient.cer
4.服務端把生成的客戶端簽名文件signedclient.cer和根證書rootca.cer發送給客戶,客戶端導入密鑰庫。仍是先導入根證書,再導入簽名證書。
keytool -import -v -alias rootca -file D:/ssl/rootca.cer -keystore D:/ssl/client.jks
keytool -import -v -alias client -file D:/ssl/signedclient.cer -keystore D:/ssl/client.jks
5.瀏覽器不支持jks,因此把客戶端的jks庫轉爲p12格式庫。
keytool -importkeystore -srckeystore D:/ssl/client.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore D:/ssl/client.p12
6.將客戶端密鑰庫client.p12導入到瀏覽器-證書-我的
7.將rootca.cer導入到瀏覽器-證書-受信任的證書頒發機構
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
啓動tomcat,訪問成功
查看下服務端證書是否是這個
keytool -list -v -keystore D:/ssl/keystore.jks
備註:咱們看到tomcat的server.xml配置有個keystoreFile和truststoreFile
keystoreFile是用來向客戶端發送服務端證書的庫配置。
truststoreFile是用來存放信任證書的庫位置。用來校驗客戶端發來的證書是否是受信任的。
上邊的例子咱們都存在了keystore.jks,由於裏邊就有rootca,能夠進行驗證。
不嫌麻煩的話,咱們能夠單首創建一個庫trustkeystore.jks,存放rootca,而後tomcat的server配置修改下路徑就行了。
還有理論上說keytool建立的庫密碼和密鑰對的密碼能夠不同。可是tomcat這裏只留有一個密鑰庫密碼輸入參數,因此最好建立庫密碼和密鑰對密碼一致。