前言
项目里经常会遇到需要用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配置文件的位置。
生成证书指令相关参数说明:
- 生成服务器端密钥
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