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> 後面加上這

  1. <login-config>    
  2. <!-- Authorization setting for SSL -->    
  3. <auth-method>CLIENT-CERT</auth-method>    
  4. <realm-name>Client Cert Users-only Area</realm-name>    
  5. </login-config>    
  6. <security-constraint>    
  7. <!-- Authorization setting for SSL -->    
  8. <web-resource-collection >    
  9. <web-resource-name >SSL</web-resource-name>    
  10. <url-pattern>/*</url-pattern>    
  11. </web-resource-collection>    
  12. <user-data-constraint>    
  13. <transport-guarantee>CONFIDENTIAL</transport-guarantee>    
  14. </user-data-constraint>    
  15. </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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章