使用keytool和openssl工具生成SSL双向认证密钥对和证书库

来源:互联网 发布:ds数据精灵好用吗 编辑:程序博客网 时间:2024/05/13 20:57

一、引言

由于需要开发一个支持https双向认证的服务,开发期间需要自己生产ssl双向认证证书,服务是基于springboot的开发的,所以进行了一段时间的技术调研,以下是操作生成操作步骤

二、操作

1、keystore以及服务器密钥对的生成

keytool -genkeypair -alias server -keyalg RSA  -validity 365 -keystore server.jks -storepass 123456oppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> keytool -genkeypair -alias server -keyalg RSA  -validity 365 -keystore server.jks -storepass 123456您的名字与姓氏是什么?(有域名用域名,没域名用IP或者localhost)  [Unknown]:  172.16.1.220您的组织单位名称是什么?  [Unknown]:  您的组织名称是什么?  [Unknown]:  您所在的城市或区域名称是什么?  [Unknown]:  您所在的州或省份名称是什么?  [Unknown]:  该单位的两字母国家代码是什么  [Unknown]:  CNCN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正确吗?  []:  是     输入<server>的主密码        (如果和 keystore 密码相同,按回车):

2、验证新生成的keystor文件以及证书信息

keytool -list -v -keystore server.jks oppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> keytool -list -v -keystore server.jks 输入keystore密码:  Keystore 类型: JKSKeystore 提供者: SUN您的 keystore 包含 1 输入别名名称: server创建日期: 2017-5-16项类型: PrivateKeyEntry认证链长度: 1认证 [1]:所有者:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN签发人:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN序列号:591a9d01有效期: Tue May 16 14:32:33 CST 2017 至Wed May 16 14:32:33 CST 2018证书指纹:         MD5:7D:6C:B4:FE:27:1A:91:1B:A9:38:43:54:74:40:7B:15         SHA1:CF:5D:D8:A8:76:3B:A7:76:53:00:5D:38:73:67:44:78:8A:E3:93:CA         签名算法名称:SHA1withRSA         版本: 3**************************************************************************************

3、导出服务端公钥

keytool -export -alias server -keystore server.jks -rfc -file server.ceroppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> keytool -export -alias server -keystore server.jks -rfc -file server.cer输入keystore密码:  保存在文件中的认证 <server.cer>

4、Truststore文件(证书库)的生成并导入服务端公钥

keytool -import -alias server -file server.cer -keystore truststore.jksoppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> keytool -import -alias server -file server.cer -keystore truststore.jks输入keystore密码:  再次输入新密码: 所有者:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN签发人:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN序列号:591a9d01有效期: Tue May 16 14:32:33 CST 2017 至Wed May 16 14:32:33 CST 2018证书指纹:         MD5:7D:6C:B4:FE:27:1A:91:1B:A9:38:43:54:74:40:7B:15         SHA1:CF:5D:D8:A8:76:3B:A7:76:53:00:5D:38:73:67:44:78:8A:E3:93:CA         签名算法名称:SHA1withRSA         版本: 3信任这个认证? []:  是认证已添加至keystore中

5、客户端密钥对的生成和验证

keytool -genkeypair -alias client -keyalg RSA -validity 365 -keystore client.p12 -storepass 123456oppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> keytool -genkeypair -alias client -keyalg RSA -validity 365 -keystore client.p12 -storepass 123456您的名字与姓氏是什么?(有域名用域名,没域名用IP或者localhost)  [Unknown]:  172.16.1.220您的组织单位名称是什么?  [Unknown]:  您的组织名称是什么?  [Unknown]:  您所在的城市或区域名称是什么?  [Unknown]:  您所在的州或省份名称是什么?  [Unknown]:  该单位的两字母国家代码是什么  [Unknown]:  CNCN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正确吗?  [否]:  是输入<client>的主密码        (如果和 keystore 密码相同,按回车):keytool -list -v -keystore client.p12    oppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> keytool -list -v -keystore client.p12         输入keystore密码:  Keystore 类型: JKSKeystore 提供者: SUN您的 keystore 包含 1 输入别名名称: client创建日期: 2017-5-16项类型: PrivateKeyEntry认证链长度: 1认证 [1]:所有者:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN签发人:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN序列号:591ab7e7有效期: Tue May 16 16:27:19 CST 2017Wed May 16 16:27:19 CST 2018证书指纹:         MD5:9D:3C:ED:EE:11:E2:9E:B9:B3:6A:79:4B:F7:FF:0F:B6         SHA1:9F:FC:0B:E8:5E:9C:C8:DC:0C:E5:E6:84:FE:1C:60:B9:CD:D8:B3:5B         签名算法名称:SHA1withRSA         版本: 3**************************************************************************************

6、导出客户端证书

keytool -export -alias client -keystore client.p12 -rfc -file client.ceroppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> keytool -export -alias client -keystore client.p12 -rfc -file client.cer输入keystore密码:  保存在文件中的认证 <client.cer>

7、将客户端公钥导入Truststore文件

keytool -import -alias client -file client.cer -keystore truststore.jksoppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> keytool -import -alias client -file client.cer -keystore truststore.jks输入keystore密码:  所有者:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN签发人:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN序列号:591ab7e7有效期: Tue May 16 16:27:19 CST 2017Wed May 16 16:27:19 CST 2018证书指纹:         MD5:9D:3C:ED:EE:11:E2:9E:B9:B3:6A:79:4B:F7:FF:0F:B6         SHA1:9F:FC:0B:E8:5E:9C:C8:DC:0C:E5:E6:84:FE:1C:60:B9:CD:D8:B3:5B         签名算法名称:SHA1withRSA         版本: 3信任这个认证? [否]:  是认证已添加至keystore中

8、验证新生成Truststore文件以及证书信息

oppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> keytool -list -v -keystore truststore.jks输入keystore密码:  Keystore 类型: JKSKeystore 提供者: SUN您的 keystore 包含 2 输入别名名称: client创建日期: 2017-5-16输入类型: trustedCertEntry所有者:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN签发人:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN序列号:591ab7e7有效期: Tue May 16 16:27:19 CST 2017 至Wed May 16 16:27:19 CST 2018证书指纹:         MD5:9D:3C:ED:EE:11:E2:9E:B9:B3:6A:79:4B:F7:FF:0F:B6         SHA1:9F:FC:0B:E8:5E:9C:C8:DC:0C:E5:E6:84:FE:1C:60:B9:CD:D8:B3:5B         签名算法名称:SHA1withRSA         版本: 3**************************************************************************************别名名称: server创建日期: 2017-5-16输入类型: trustedCertEntry所有者:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN签发人:CN=172.16.1.220, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN序列号:591a9d01有效期: Tue May 16 14:32:33 CST 2017 至Wed May 16 14:32:33 CST 2018证书指纹:         MD5:7D:6C:B4:FE:27:1A:91:1B:A9:38:43:54:74:40:7B:15         SHA1:CF:5D:D8:A8:76:3B:A7:76:53:00:5D:38:73:67:44:78:8A:E3:93:CA         签名算法名称:SHA1withRSA         版本: 3**************************************************************************************

9、生成相应客户端使用的相应证书(将密钥对转为浏览器能识别的证书,如何提取公钥和私钥)

#p12和pfx是浏览器识别的证书#支持工具测试,和后续服务使用需要提取出客户端公钥和私钥#导出公钥client.cer名字和后缀可以随便起keytool -export -alias client -keystore client.p12 -rfc -file client.cer#导出私钥client.key 由于keystore文件无法直接提取出私钥,需要经过工具转换成为pfx文件,再从pfx文件中提取出私钥[keystore文件转pfx工具](http://note.youdao.com/noteshare?id=59a86e623b01a46efd88d9f0b3c55add&sub=363FB535DE95489E849FCCF16E94B248)openssl pkcs12 -in client.pfx -nocerts -nodes -out client.key#如此证书和密钥我们都有了(服务端的可以如此获取证书的公钥和私钥)

10、测试校验

1、校验服务端单向认证是否配置成功#启动https服务,并且以server.jks为服务端密钥对以truststore.jks作为证书库#将server.ssl.client-auth设定client authentication WANT或者其他方式配置为不要求做客户端证书校验#直接在浏览器访问https://172.16.1.220:8443/http_server_mock/index.json,浏览器提示证书不安全(无视)继续访问,有正确返回结果(浏览器右上角可以清晰看到https红色的)#直接使用wget https://172.16.1.220:8443/http_server_mock/index.jsonoppuser@ng3-ts220:/oppf/aioppf/HttpServerMock> wget https://172.16.1.220:8443/http_server_mock/index.json--2017-05-16 17:42:18--  https://172.16.1.220:8443/http_server_mock/index.jsonConnecting to 172.16.1.220:8443... 已连接。ERROR: cannot verify 172.16.1.220's certificate, issued by `/C=CN/ST=Unknown/L=Unknown/O=Unknown/OU=Unknown/CN=172.16.1.220':  Self-signed certificate encountered.To connect to 172.16.1.220 insecurely, use `--no-check-certificate'.无法建立 SSL 连接。#由于wget无法验证服务端证书是否合法,建立https校验连接,所以必须配置--no-check-certificate 进行验证 oppuser@ng3-ts220:/oppf/aioppf/HttpServerMock>  wget --no-check-certificate  https://172.16.1.220:8443/http_server_mock/index.json--2017-05-16 17:42:28--  https://172.16.1.220:8443/http_server_mock/index.jsonConnecting to 172.16.1.220:8443... 已连接。WARNING: cannot verify 172.16.1.220's certificate, issued by `/C=CN/ST=Unknown/L=Unknown/O=Unknown/OU=Unknown/CN=172.16.1.220':  Self-signed certificate encountered.已发出 HTTP 请求,正在等待回应... 200 长度:31Saving to: `index.json.1'100%[=============================================================================================================================>] 31          --.-K/s   in 0s      2017-05-16 17:42:28 (15.4 MB/s) - `index.json.1' saved [31/31]服务端单向SSL认证校验成功————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————2、SSL双向认证校验#启动https服务,并且以server.jks为服务端密钥对以truststore.jks作为证书库#将server.ssl.client-auth设定client authentication设置为NEED 需要校验#直接在浏览器访问https://172.16.1.220:8443/http_server_mock/index.json#访问失败,服务端返回需要校验客户端证书,浏览器需要发送客户端证书给服务端#使用工具访问连接oppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> wget --no-check-certificate  https://172.16.1.220:8443/http_server_mock/index.json--2017-05-16 17:27:43--  https://172.16.1.220:8443/http_server_mock/index.jsonConnecting to 172.16.1.220:8443... 已连接。OpenSSL: error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate无法建立 SSL 连接。#直接使用pfx作为浏览器证书,双击client.pfx导入当前计算机#启动浏览器访问https://172.16.1.220:8443/http_server_mock/index.json#选中客户端使用的证书,浏览器提示服务端证书不安全(无视)继续访问,有正确返回结果(浏览器右上角可以清晰看到https红色的)oppuser@ng3-ts220:/oppf/aioppf/HttpServerMock/config> wget --certificate=client.cer --private-key=client.key  https://172.16.1.220:8443/http_server_mock/index.json--2017-05-16 16:18:04--  https://172.16.1.220:8443/http_server_mock/index.jsonConnecting to 172.16.1.220:8443... 已连接。ERROR: cannot verify 172.16.1.220's certificate, issued by `/C=CN/ST=Unknown/L=Unknown/O=Unknown/OU=Unknown/CN=172.16.1.220':  Self-signed certificate encountered.To connect to 172.16.1.220 insecurely, use `--no-check-certificate'.无法建立 SSL 连接。wget --certificate=client.cer --private-key=client.key --no-check-certificate  https://172.16.1.220:8443/http_server_mock/index.json--2017-05-16 16:12:15--  https://172.16.1.220:8443/http_server_mock/index.jsonConnecting to 172.16.1.220:8443... 已连接。WARNING: cannot verify 172.16.1.220's certificate, issued by `/C=CN/ST=Unknown/L=Unknown/O=Unknown/OU=Unknown/CN=172.16.1.220':  Self-signed certificate encountered.已发出 HTTP 请求,正在等待回应... 200 长度:31Saving to: `index.json.1'100%[=============================================================================================================================>] 31          --.-K/s   in 0s      2017-05-16 16:12:16 (14.4 MB/s) - `index.json.1' saved [31/31]SSL双向认证校验成功————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
阅读全文
0 0