使用Keytool、OpenSSL构建HTTPS单双向认证
首先介绍下操作过程中会遇到的几种文件格式
- cer:是数字证书的一种编码格式。
- pem:OpenSSL最为常见的密钥库文件。
- csr:证书签发申请。
- p12:属于PKCS#12标准,可作为Java中的密钥库或信任库直接使用。
- jks:Java原生的密钥库/信任库文件
提示:单向和双向认证都是经过测试的,特别是双向认证测试过很多次。如果按步骤来的话应该是没有什么问题的。
使用KeyTool搭建HTTPS单向认证
KeyTool时Java中的数字证书管理工具,用于数字证书的申请、导入和撤销等证书管理操作,KeyTool与本地密钥库相关联,将私钥存于密钥库,公钥则以数字证书输出。
证书必要的信息(这里单独提出来):
证书拥有者名称(CN):一般是域名
组织单位(OU)
组织(O)
城市(L)
区(ST)
国家/地区( C )
1)创建未经CA认证的服务端证书
keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias server.cn -keystore D:/certs/server.keystore -dname “CN=server.cn, OU=server, O=server, L=SC, ST=SC, C=CN”
参数解释:
-genkeypair:生成密钥对
-keyalg:密钥算法
-sigalg:数字签名算法
-validity:证书有效期
-alias:别名
-keystore:密钥库存储位置
2)导出证书(这里是创建自签发证书)
keytool -exportcert -alias server.cn -keystore D:/certs/server.keystore -file D:/certs/server.cer -rfc
参数解释:
-exportcert:证书导出操作
-alias:导别名
-keystore:密钥库文件
-file:导出文件路径
-rfc:以Base64编码格式输出
自签名证书虽然可以使用,但未经过CA机构认证,几乎没有任何法律效力,也毫无安全可言。
移除信任则输入:keytool -delete -alias server.cn -keystore D:\xxx.keystore -storepass 151310
3)生成签发申请
keytool -certreq -alias server.cn -keystore D:/certs/server.keystore -file D:/certs/server.csr -v
参数解释:
-certreq:生成数字证书签发申请操作
-alias:指定别名
-keystore:指定密钥库文件
-file:指定导出文件路径
-v:详细信息
如果要获取CA机构认证的数字证书,需要生成数字证书签发申请(CSR),经由CA机构认证并颁发,同时将认证后的证书导入本地密钥库和信任库。
4)导入信任库
keytool -importcert -trustcacerts -alias server.cn -file D:/certs/server.cer -keystore D:/certs/server.keystore
参数解释:
-importcert:导入数字证书
-trustcacerts:将数字证书导入信任库
-alias:指定别名
-file:指定数字证书文件路径
-keystore:指定密钥库文件
1——2——4:自签发证书,1——3——4:CA认证的证书
配置Tomcat配置文件server.xml并启动(Tomcat是8.5版本,建议相同)
Tomcat7需要将HTTP/1.1改为org.apache.coyote.http11.Http11Protocol
添加如下配置
<Connector
port="8443"
protocol="HTTP/1.1"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="D:/certs/server.keystore"
keystorePass="151310"/>
修改hosts文件
127.0.0.1 server.cn
访问 https://server.cn:8443/
使用OpenSSL搭建HTTPS双向认证
OpenSSL下载地址,建议下载1.0.2版本
如果因为版本问题出现创建对象tsa_policy1 = 1.2.3.4.1时出现问题错误,网上有说安装Visual C ++ 2008 ,可以试一下。Redistributables。
下载完后配置环境变量
创建下列目录,我的是在D:\ca目录下,建议第一次和我一样。
index.txt
0
serial
00
修改bin/openssl.cfg,修改下面这两个地方。
dir = D:/ca
organizationName = supplied
(1)构建根证书
注意:使用openssl.exe需要去掉前面的openssl命令。
建议:将所有要求输入的密码设为一样,如我的就是全部为151310(设为自己的就好)
1)构建私钥
openssl genrsa -aes256 -out D:/ca/private/ca.key.pem 2048
参数解释
genrsa:产生RSA密钥命令
-aes256:使用AES算法(256位密钥)对产生的私钥加密。可选算法包括DES、DESede、IDEA、AES
-out:输出路径
2048:RSA密钥的长度
2)生成根证书签发申请
openssl req -new -key D:/ca/private/ca.key.pem -out D:/ca/private/ca.csr -subj “/C=CN/ST=SC/L=SC/O=ca/OU=ca/CN=ca.cn”
参数解释
req:产生证书签发申请命令
-new:新请求
-key:密钥
-out:输出路径
-subj:用户信息
3)自行签发根证书(可以将其发送给CA机构签发)
openssl x509 -req -days 10000 -CAcreateserial -sha1 -extensions v3_ca -signkey D:/ca/private/ca.key.pem -in D:/ca/private/ca.csr -out D:/ca/certs/ca.cer
参数解释
x509:签发X.509格式证书命令
-req:证书输入请求
-days:有效天数
-sha1:证书摘要算法
-extensions:按OpenSSL配置文件v3_ca项添加扩展
-signkey:自签名密钥
-in:输入文件
-out:输出文件
4)将数字证书转换为Java原生的信任库文件(JKS文件)
keytool -keystore D:/ca/certs/ca.jks -keypass 151310 -storepass 151310 -alias ca -import -trustcacerts -file D:/ca/certs/ca.cer
(2)构建服务器证书
1)构建密钥
openssl genrsa -aes256 -out D:/ca/private/server.key.pem 2048
2)生成服务器证书签发申请
openssl req -new -key D:/ca/private/server.key.pem -out D:/ca/private/server.csr -subj “/C=CN/ST=SC/L=SC/O=server/OU=server/CN=server”
3)使用根证书签发服务器证书
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA D:/ca/certs/ca.cer -CAkey D:/ca/private/ca.key.pem -CAserial D:/ca/ca.srl -CAcreateserial -in D:/ca/private/server.csr -out D:/ca/certs/server.cer
参数解释
x509:签发X.509格式证书命令
-req:证书输入请求
-days:有效天数
-sha1:证书摘要算法
-extensions:按OpenSSL配置文件v3_req项添加扩展
-CA:CA证书
-CAkey:CA证书密钥
-CAserial:CA证书序列化文件
-in:输入文件
-out:输出文件
4)将OpenSSL产生的数字证书转化为PKCS#12编码格式
openssl pkcs12 -export -clcerts -in D:/ca/certs/server.cer -inkey D:/ca/private/server.key.pem -out D:/ca/certs/server.p12
会有提示错误,不用理会。
参数解释
pkcs12:PKCS#12编码格式证书命令
-export:导出证书
-clcerts:仅导出客户证书
-inkey:输入密钥文件路径
-in:输入文件路径
-out:输出文件路径
(3)构建客户端证书
1)构建密钥
openssl genrsa -aes256 -out D:/ca/private/client.key.pem 2048
2)生成客户端证书签发申请
openssl req -new -key D:/ca/private/client.key.pem -out D:/ca/private/client.csr -subj “/C=CN/ST=SC/L=SC/O=client/OU=client/CN=client.cn”
3)使用根证书签发客户证书
openssl ca -days 3650 -in D:/ca/private/client.csr -out D:/ca/certs/client.cer -cert D:/ca/certs/ca.cer -keyfile D:/ca/private/ca.key.pem
4)转换为Java语言可以识别的PKCS#12编码格式
openssl pkcs12 -export -in D:/ca/certs/client.cer -inkey D:/ca/private/client.key.pem -out D:/ca/certs/client.p12
修改Tomcat的server.xml并启动
<Connector port="8443" protocol="HTTP/1.1"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="true"
sslProtocol="TLS"
keystoreFile="D:/ca/certs/server.p12"
keystorePass="151310"
keystoreType="PKCS12"
truststoreFile="D:/ca/certs/ca.jks"
truststorePass="151310"
truststoreType="JKS"/>
浏览器导入客户端证书client.p12,导入受信任证书办法机构ca.cer。访问 https://server.cn:8443/
最后放两张图加深一下印象(客户端与服务端几乎相同就没画了)
码里法: 你这有问题啊,proceed()里边应该把你改完的参数放进去,否则到接口还是原来的数据,不生效的
伊颦伊笑: 谢谢你,彦祖
别人888: 谢谢你,彦祖
爱吃白菜的鱼: 谢谢你,彦祖
Witte The Whistler�: 谢谢你,彦祖