JDK自帶工具keytool生成ssl證書
前言:
因為公司專案客戶要求使用HTTPS的方式來保證資料的安全,所以木有辦法研究了下怎麼生成ssl證書來使用https以保證資料安全。
百度了不少資料,看到JAVA的JDK自帶生成SSL證書的工具:keytool,外加看了同事的心得體會,自己總結了一下具體的使用方法和使用過程中發現的問題及解決辦法。
1:什麼是HTTPS?
HTTPS其實是有兩部分組成:HTTP + SSL / TLS,
也就是在HTTP上又加了一層處理加密資訊的模組,並且會進行身份的驗證。
問題:
Firebug和postman之類的瀏覽器除錯工具,為什麼獲取到的是明文?
解答:
SSL是對傳輸的資料進行加密,針對的是傳輸過程的安全。
firebug之類的瀏覽器除錯工具,
因為他們得到的是客戶端加密之前/解密之後的資料,因此是明文的。
2:什麼是自簽名證書?
就是自己生成的證書,並不是官方生成的證書。
除非是很正式的專案,否則使用自己簽發的證書即可,因為官方生成證書是要花錢滴。
3:進入正題,使用JDK自帶工具KeyTool 生成自簽發證書!
第一步:為伺服器生成證書
開啟CMD命令列工具,cd到C盤根目錄或者是jdk的bin目錄下,如下圖所示:
使用keytool命令生成證書:
keytool
-genkey
-alias tomcat(別名)
-keypass 123456(別名密碼)
-keyalg RSA(演算法)
-keysize 1024(金鑰長度)
-validity 365(有效期,天單位)
-keystore D:/keys/tomcat.keystore(指定生成證書的位置和證書名稱)
-storepass 123456(獲取keystore資訊的密碼)
方便複製版:
keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore D:/keys/tomcat.keystore -storepass 123456
圖例:
回車執行後如下圖:
點選回車即可在D:/keys/資料夾內生成名為:tomcat.keystore的檔案。
成功後無提示資訊
注意:
①D:/keys/ 目錄需要提前手動建立好,否則會生成失敗
②提示輸入域名的時候不能輸入IP地址
問題①的錯誤資訊如下:
第二步:為客戶端生成證書
為瀏覽器生成證書,以便讓伺服器來驗證它。
為了能將證書順利匯入至IE和Firefox,證書格式應該是PKCS12,
因此,使用如下命令生成:
keytool
-genkey
-alias client
-keypass 123456
-keyalg RSA
-storetype PKCS12
-keypass 123456
-storepass 123456
-keystore D:/keys/client.p12
方便複製版:
keytool -genkey -alias client1 -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -storetype PKCS12 -keystore D:/keys/client1.p12 -storepass 123456
圖例:
第二步餘下操作步驟同第一步。
第三步:讓伺服器信任客戶端證書
1、
由於不能直接將PKCS12格式的證書庫匯入,
必須先把客戶端證書匯出為一個單獨的CER檔案,使用如下命令:
keytool -export -alias client -keystore D:/keys/client.p12 -storetype PKCS12 -keypass 123456 -file D:/keys/client.cer
注意:
Keypass:指定CER檔案的密碼,但會被忽略,而要求重新輸入
2、
將該檔案匯入到伺服器的證書庫,新增為一個信任證書:
keytool -import -v -file D:/keys/client.cer -keystore D:/keys/tomcat.keystor
e -storepass 123456
圖例:
完成之後通過list命令檢視伺服器的證書庫,
可以看到兩個證書,一個是伺服器證書,一個是受信任的客戶端證書:
keytool -list -v -keystore D:/keys/tomcat.keystore
第四步:讓客戶端信任伺服器證書
1、
由於是雙向SSL認證,客戶端也要驗證伺服器證書,
因此,必須把伺服器證書新增到瀏覽器的“受信任的根證書頒發機構”。
由於不能直接將keystore格式的證書庫匯入,
必須先把伺服器證書匯出為一個單獨的CER檔案,使用如下命令:
keytool -keystore D:/keys/tomcat.keystore -export -alias tomcat6 -file D:/keys/server.cer
2、
雙擊server.cer檔案,按照提示安裝證書,
將證書填入到“受信任的根證書頒發機構”。
填入方法:
開啟瀏覽器 - 工具 - internet選項-內容- 證書-把中級證書頒發機構裡的www.localhost.com(該名稱即時你前面生成證書時填寫的名字與姓氏)證書匯出來-再把匯出來的證書匯入 受信任的根頒發機構 就OK了。
第五步:配置Tomcat伺服器
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="true"
sslProtocol="TLS"
keystoreFile="D:/keys/tomcat.keystore"
keystorePass="123456"
truststoreFile="D:/keys/tomcat.keystore"
truststorePass="123456" />
屬性說明:
clientAuth:設定是否雙向驗證,預設為false,設定為true代表雙向驗證
keystoreFile:伺服器證書檔案路徑
keystorePass:伺服器證書密碼
truststoreFile:用來驗證客戶端證書的根證書,此例中就是伺服器證書
truststorePass:根證書密碼
注意:
① 設定clientAuth屬性為True時,需要手動匯入客戶端證書才能訪問。
② 要訪問https請求 需要訪問8443埠,訪問http請求則訪問Tomcat預設埠(你自己設定的埠,預設8080)即可。
總結:
經過以上五步,你使用HTTPS 埠為8443 進行訪問的時候 就是經過SSL資訊加密,不怕被截獲了。
通話的雙方,必須是都擁有證書的端,才能進行會話,換句話說,就是隻有安裝了咱證書的客戶端,才能與伺服器通訊。
小貼士:
強制 https 訪問
在 tomcat /conf/web.xml 中的 </welcome- file-list> 後面加上這
- <login-config>
- <!-- Authorization setting for SSL -->
- <auth-method>CLIENT-CERT</auth-method>
- <realm-name>Client Cert Users-only Area</realm-name>
- </login-config>
- <security-constraint>
- <!-- Authorization setting for SSL -->
- <web-resource-collection >
- <web-resource-name >SSL</web-resource-name>
- <url-pattern>/*</url-pattern>
- </web-resource-collection>
- <user-data-constraint>
- <transport-guarantee>CONFIDENTIAL</transport-guarantee>
- </user-data-constraint>
- </security-constraint>
完成以上步驟後,在瀏覽器中輸入http的訪問地址也會自動轉換為https了。
附錄1:
keytool常用命令
-alias 產生別名
-keystore 指定金鑰庫的名稱(就像資料庫一樣的證書庫,可以有很多個證書,cacerts這個檔案是jre自帶的,
你也可以使用其它檔名字,如果沒有這個檔名字,它會建立這樣一個)
-storepass 指定金鑰庫的密碼
-keypass 指定別名條目的密碼
-list 顯示金鑰庫中的證書資訊
-v 顯示金鑰庫中的證書詳細資訊
-export 將別名指定的證書匯出到檔案
-file 引數指定匯出到檔案的檔名
-delete 刪除金鑰庫中某條目
-import 將已簽名數字證書匯入金鑰庫
-keypasswd 修改金鑰庫中指定條目口令
-dname 指定證書擁有者資訊
-keyalg 指定金鑰的演算法
-validity 指定建立的證書有效期多少天
-keysize 指定金鑰長度
使用說明:
匯入一個證書命令可以如下:
keytool -import -keystore cacerts -storepass 666666 -keypass 888888 -alias alibabacert -file C:\alibabajava\cert\test_root.cer
其中-keystore cacerts中的cacerts是jre中預設的證書庫名字,也可以使用其它名字
-storepass 666666中的666666是這個證書庫的密碼
-keypass 888888中的888888是這個特定證書的密碼
-alias alibabacert中的alibabacert是你匯入證書的別名,在其它操作命令中就可以使用它
-file C:\alibabajava\cert\test_root.cer中的檔案路徑就是要匯入證書的路徑
瀏覽證書庫裡面的證書資訊,可以使用如下命令:
keytool -list -v -alias alibabacert -keystore cacerts -storepass 666666
要刪除證書庫裡面的某個證書,可以使用如下命令:
keytool -delete -alias alibabacert -keystore cacerts -storepass 666666
要匯出證書庫裡面的某個證書,可以使用如下命令:
keytool -export -keystore cacerts -storepass 666666 -alias alibabacert -file F:\alibabacert_root.cer
要修改某個證書的密碼(注意:有些數字認證沒有私有密碼,只有公匙,這種情況此命令無效)
這個是互動式的,在輸入命令後,會要求你輸入密碼
keytool -keypasswd -alias alibabacert -keystore cacerts
這個不是互動式的,輸入命令後直接更改
Keytool -keypasswd -alias alibabacert -keypass 888888 -new 123456 -storepass 666666 -keystore cacerts