单向需要的是在服务端配置密钥库jks或者pfx,在客户端上配置证书(浏览器默认ca根证书所以不需要用户自己配置,自签证书是需要导入到浏览器的),client每次建立SSL连接时会验签服务端签名并判断是否受信,即服务器是真实的。 双向则需要自签ca根证书生成server密钥库和client密钥库, 在客户端配置client.jks和client.cer, 服务端配置上server.jks和server.cer, 通信时必须双方都认可才能建立通信。验证过程如右图所示:服务端使用ca.crt校验客户端的client.crt和client.key;客户端使用ca.crt校验服务端的server.crt和server.key
打印证书:
bashkeytool -printcert -v -rfc -file 证书.cer
查看密钥库条目列表:
bashkeytool -list -v -keystore 密钥库.jks
Yeoman理解过程:keytool 生成密钥库jks(pkcs12)----
导出证书(发布者身份信息和公钥)---- 导入信任库(公钥库),格式jks(pkcs12)
需要在环境变量的Path中加入如下配置,以Windows 10为例:
bashkeytool生成jks或pkcs12格式密钥和证书,建议使用pkcs12格式(阿里云默认存储格式,拓展名一般为.pfx或.p12),jks是jdk默认私有格式(拓展名一般为keystore或jks或key以及其他任意拓展名)
此操作生成密钥库(.jks或pfx、p12)文件,服务端配置。在命令行输入:
bashkeytool -genkey -alias 别名 -keypass 123456 -keyalg RSA -keysize 2048 -validity 3650 -keyStore 服务端密钥库.pfx -storetype pkcs12 -storepass 123456
从密钥库导出服务端证书,此操作生成.cer(openssl中的.crt)文件,相当于openssl中的.pem(Yeoman:此证书可以让客户端免密码来连接并验证服务器)在命令行输入:
bashkeytool -export -alias 别名 -keyStore 服务端密钥库.pfx -file 服务端证书.cer
导入服务端证书到客户端的密钥库Trust keyStore中。此操作生成密钥库.pfx文件,客户端配置此密钥库(Yeoman:需要信任库密码连接borker)。在命令行输入:
bashkeytool -import -alias 别名 -keystore 客户端密钥库.pfx -file 服务端证书.cer
Apollo配置SSL(默认证书存储类型是jks,可以添加store type PKCS12 编辑Apollo配置文件apollo.xml,填写服务端密钥库文件地址和密钥库密码和密钥密码。 storage file apollo.base /etc/密钥库.pfx store type PKCS12 password 密钥库密码 key password 密钥密码 模拟连接SSL 客户端使用MQTT.fx模拟,配置客户端,端口号使用tls端口61614(最好改成1814,tridium不支持大于10000的socket端口),启用SSL,使用TLSv1.2,选择CA keystore验证,填写客户端密钥库文件(.jks)地址和密钥,或者选择CA Certificate验证,填写服务端证书(.cer或.pem),客户端连接broker成功。 转换信任库(证书库)jks为pkcs12格式
bashkeytool -importkeystore -srckeystore 密钥库.jks -destkeystore 密钥库.pfx -srcstoretype jks -deststoretype pkcs12
从密钥库pkcs12提取证书pem(含私钥和证书)
bashopenssl pkcs12 -nodes -in localhost.pfx -out localhost.pem
openssl pkcs12 -nodes -nocerts -in localhost.pfx -out localhost.key
openssl pkcs12 -nodes -nokeys -in localhost.pfx -out localhost.pem
将证书.pem导入tridium用户信任库(User Truststore)即可通过ping,然后授权操作允许Tridium端MQTT Client通过TLS V1.2方式连接Apollo Broker。
如果你准备使用公共CA则不需要这一步,但是如果这个证书只是在我们自己的服务端和客户端之间使用则只需要使用自己的CA,使用openssl之前先要在当前目录下准备一个临时目录结构(经yeoman实测,无此目录也可正常生成),如下结构 --demoA/ -- index.txt -- 初始为空白内容 -- serial -- 初始内容可以设置为01 -- newcerts/ -- 空文件夹 -- private/ -- 貌似可以不存在 创建ca密钥和根证书
Yeoman:(openssl默认生成key和pem格式,可以合并并转换成pkcs12或pfx格式)
创建CA私钥:
bashopenssl genrsa -out yeoman\ca.key 2048
openssl genpkey -algorithm RSA -aes256 -pkeyopt rsa_keygen_bits:2048 -out private.key
使用CA私钥创建CA证书,(也可不带-subj参数,配合向导录入,crt是证书csr是证书签发请求文件)
bashopenssl req -new -x509 -days 36500 -key yeoman\ca.key -out yeoman\ca.crt -subj cn/ST sjz/L hb/O yeoman/OU
2.生成服务器证书签发请求和私钥
创建服务器私钥:
bashopenssl genrsa -out www.yeoman.com.key 2048
创建服务器证书签署请求CSR(/CN代表Common Name,通常为域名)
bashopenssl req -new -key www.yeoman.com.key -out www.yeoman.com.csr -subj cn/ST sjz/L hb/O yeoman/OU dev/CN www.yeoman.com
3.使用自己的CA私钥和CA证书签发服务证书(需要配置目录和openssl.conf)
bashopenssl ca -in www.yeoman.com.csr -out www.yeoman.com.crt -keyfile yeoman\ca.key -cert yeoman\ca.crt
4.合并证书 使用文本工具打开server.crt文件,可以看到内容有2部分组成,第一部分是Certificate开头的描述内容,第二部分是-----BEGIN CERTIFICATE-----开始的签名内容, 我们把ca.crt的内容覆盖掉描述内容,让文件成为2个签名块,俗称证书链 5.crt和key合并转换为pkcs12格式(拓展名可以用p12或者pfx)
bashopenssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.pfx
6.pkcs12转换为jks格式(一般直接使用pkcs12格式证书即可,此步骤可省略)
bashkeytool -importkeystore -srckeystore 密钥库.pfx -destkeystore 密钥库.jks -srcstoretype pkcs12 -deststoretype jks
7.查看密钥库证书条目
bashkeytool -list -v -keystore 密钥库.jks
8.jks导出pem证书
bashkeytool -exportcert -alias 证书名称 -keypass 私钥密码 -storepass 密钥库密码 -keystore 密钥库.jks -rfc -file 证书.pem
阿里云ECS配置Springboot配置Https和Apollo Borker TLS和Nginx WSS 阿里云免费证书默认pfx证书别名是alias,而springboot默认内置tomcat的ssl别名必须为tomcat(新版springboot不能配置别名,配置反而出错),使用keytool工具将别名更改即可。Nginx配置SSL和WSS使用pem和key格式证书,而Apollo Broker需要pkcs12或jks格式的密钥库,直接使用openssl命令合并转换成pkcs12格式即可。(yeoman理解:pfx或jks pem,密钥库类型:jks、pkcs12;证书内容编码方式:pem(base64编码后的文本)和der(二进制))
bash1.使用keytool修改证书别名为tomcat
keytool -changealias -keystore 密钥库.pfx -alias alias -destalias tomcat
2.使用openssl将key和pem合并导出为pkcs12格式
找到openssl的bin目录,找到openssl.exe文件,单击右键以管理员身份运行,打开命令行,输入命令(或直接cmd直接输入openssl,需要提前配置好环境变量):
bashpkcs12 -export -out 密钥库.pfx -in 证书.pem -inkey 私钥.key