前言
項目里經常會遇到需要用TSL來保證通訊安全的。CS項目可能會要求服務端和客戶端雙向認證。而BS項目,一般是單向認證(瀏覽器認證服務器)。OpenSSL和keytool都是制作證書的工具。但OpenSSL更強大些,一般都是用OpenSSL來制作證書。而java程序要認證加密的證書都存儲在KeyStore里面。所以,需要將OpenSSL生成的資料導入到KeyStore中,java程序才能使用。
步驟
- 生成根證書(CA)密鑰
openssl genrsa -out rootkey.pem 2048
如果需要對密鑰加密,使用 -des3
或者 -aes256
等,具體可以參見指令說明
生成密鑰對
- 生成根證書請求文件
openssl req -new -key rootkey.pem -out root.csr
該步驟需要交互式輸入機構信息。
- 生成根證書文件
openssl x509 -req -days 36500 -sha1 -extensions v3_ca -signkey rootkey.pem -in root.csr -out root.crt -extfile /etc/ssl/openssl.cnf
其中,-sha1
指定證書的簽名(指紋)算法。
-extensions ,指定引用的擴展信息。這里在使用中遇到一個坑。就是指定了擴展信息,但是生成的證書里卻沒有,后經查閱,要搭配使用 -extfile 來明確指定openssl.cnf配置文件的位置。
生成證書指令相關參數說明:
1.png
2.png
- 生成服務器端密鑰
openssl genrsa -out serverkey.pem 2048
- 生成服務端證書請求文件
openssl req -new -key serverkey.pem -out server.csr
- 用根證書來簽發服務器端請求文件,生成服務器端證書
openssl x509 -req -days 3650 -sha1 -extensions v3_req -in server.csr -CA root.crt -CAkey rootkey.pem -CAcreateserial -out server.crt
- 打包服務器端證書為pkcs12格式(需要設置密碼,請記住)
openssl pkcs12 -export -in server.crt -inkey serverkey.pem -out server.pkcs12
如果是打包CA證書,則添加參數 -cacerts
。如果將ca證書一起打包,則用 -certfile
參數
- 生成服務器端keystore(server.jks)。使用keytool的importkeystore指令。pkcs12轉jks。需要pkcs12密碼和jks密碼
keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12
- 把根證書加到服務器證書里面
keytool -importcert -keystore server.jks -file root.crt
以上是密鑰庫的生成,生成的密鑰庫包含了私鑰,不便于發布。
對外發布,需要生成trustkeystore。trustkeystore 不包含私鑰
- 生成Server端的對外KeyStore。先把根證書放到里面
keytool -importcert -alias ca -keystore servertrust.jks -file root.crt
- 把Server證書加到對外KeyStore里面
keytool -importcert -alias servercert -keystore servertrust.jks -file server.crt