HTTPS搭建方案
一、 操作步驟
進入jdk的安裝目錄,切換到bin目錄下,然后按順序執行如下的命令
1、 創建一個密鑰庫server(服務器端密鑰庫) localhost配置
keytool -genkey -dname "CN=XX.XX.XX.XX,OU=ChinaMobile,O=ChinaMobile,L=HZ, ST=zhejiang, C=CN" -alias server -keyalg RSA -keystore /home/cxb/credential/server.jks -keypass xxx -storepass xxx -validity 36500
2、 導出自己創建的密鑰庫server別名server的證書為www.my.com.cer (服務器端證書)
keytool -export -alias server -file /home/cxb/credential/server.cer -keystore /home/cxb/credential/server.jks -storepass xxx
3、 創建一個密鑰庫client(客戶端密鑰庫)
keytool -genkey -dname "CN=client, OU= , O= , L=HZ, ST=zhejiang, C=CN" -alias client -keyalg RSA -keystore /home/cxb/credential/client.jks -keypass xxx -storepass xxx -validity 36500
4、 導出自己創建的密鑰庫client別名client的證書為client.cer(客戶端證書)
keytool -export -alias client -file /home/cxb/credential/client.cer -keystore /home/cxb/credential/client.jks -storepass xxx
5、 通過JAVA程序進行證書簽名(簽發者是密鑰庫client.jks中的client條目,待簽發者是server.cer。程序會產生一個新的密鑰庫newserver新密鑰hiifit;別名是signedserver )
Java實現
6、 導出密鑰庫newserver中的別名為signedserver為證書newserver.cer
keytool -export -file /home/cxb/credential/newserver.cer -keystore /home/cxb/credential/newserver.jks -storepass xxx -alias signedserver
7、 在密鑰庫server.jks中引入client.cer證書(服務端信任客戶端)
keytool -import -alias client -keystore /home/cxb/credential/server.jks -file /home/cxb/credential/client.cer -storepass xxx
8、 在密鑰庫server.jks中引入newserver.cer證書別名為server(覆蓋了老的服務端證書)
keytool -import -alias server -keystore /home/cxb/credential/server.jks -file /home/cxb/credential/newserver.cer -storepass xxx
9、 把證書mytest.cer發送給客戶端進行安裝
雙擊client.cer-->點擊安裝證書-->下一步-->將所有證書放入下列存儲區,瀏覽-->受信任的根證書頒發機構-->確定-->下一步-->完成-->是-->導入成功,確定-->確定;完成安裝
10、tomcat配置
修改server.xml
解開<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"的注釋,添加: keystoreFile="/home/cxb/credential/server.jks" keystorePass="xxx" truststoreFile="/home/cxb/credential/client.jks" truststorePass="xxx"
二、 幾點說明
1、 加密原理:
數字證書采用公鑰體制,即利用一對互相匹配的密鑰進行加密、解密。每個用戶自己設定一把特定的僅為本人所知的私有密鑰(私鑰),用它進行解密和簽名;同時設定一把公共密鑰(公鑰)并由本人公開,為一組用戶所共享,用于加密和驗證簽名。當發送一份保密文件時,發送方使用接收方的公鑰對數據加密,而接收方則使用自己的私鑰解密,這樣信息就可以安全無誤地到達目的地了。通過數字的手段保證加密過程是一個不可逆過程,即只有用私有密鑰才能解密(一般為RSA)。
2、tomcat中clientAuth配置為true時為雙向認證,false為單項驗證。
單向認證,就是傳輸的數據加密過了,但是不會校驗客戶端的來源
雙向認證,如果客戶端瀏覽器沒有導入客戶端證書,是訪問不了web系統的,找不到地址
如果只是加密,我感覺單向就行了。
如果想要用系統的人沒有證書就訪問不了系統的話,就采用雙向
3、采用自己簽發證書,可以不用去CA機構申請,因為只是內部客戶端間調用。(補充:數字證書綁定了公鑰、數字簽名及持有者的真實身份)
4、生成的密鑰倉庫的后綴名有很多,比如keystore,jks或者沒有后綴名都無所謂。其中,jks是一個java中的密鑰管理庫
三、 疑惑問題
1、 如何通過httpclient載入證書,發送請求?
keytool -import -file /home/cxb/credential/client.cer -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -alias client -storepass changeit
2、 CA機構頒發的證書的原理?(比如證書有沒有加密,又是如何揭秘的。)
3、 數字簽名的作用,難道僅僅是做身份辨認嗎?有沒有加密,如何加密解密 ?
四、 幾個重要命令
查看是否導入成功:通過命令行如下
keytool -v -list -keystore “%JAVA_HOME%\jre\lib\security\cacerts” -storepass changeit
刪除證書:
keytool -delete –alias server -keystore “%JAVA_HOME%\jre\lib\security\cacerts” -storepass changeit