使用Keytool为JDK添加https证书信任

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Keytool为JDK添加https证书信任相关的知识,希望对你有一定的参考价值。

参考技术A

  在浏览器中访问是件挺方便的事 与访问站点相比 也就是地址栏上多个 s 但是 在java平台上访问 可就麻烦多了 Java虚拟机并不直接使用操作系统的key ring 而是有自己的security manager 与操作系统类似 jdk的security manager默认有一堆的根证书信任 如果你的站点证书是花钱申请的 被这些根证书所信任 那使用java来访问此站点会非常方便 但假如 你的证书是自己签名的 就需要将证书导入至JDK的信任证书中 否则访问时会报SSL错误 假如 你的webserice是基于来进行访问 而此站点证书是自签名类型的 那么部署时一定要使用keytool进行证书导入 否则无法正常访问     JDK keystore存放路径         默认在 $JAVA_HOME/jre/lib/security/cacerts 在我的Mountaion Lion中 存放路径为         /System/Library/Java/JavaVirtualMachines/ jdk/Contents/Home/lib/security/cacerts        keystore的默认密码        changeit         有人说OS X中java的 Keystore密码被更改成了 changeme 所以如果你用上面那个访问失败 可以试试这个         keytool乱码        keytool在OS X中经常显示为乱码 它在中文OS X中输出GB 编码 所以要将terminal的默认编码更改成GB 或者中文(ECU)

  

    导入证书        首先 先通过浏览器将证书下载下来 点击显示证书详细的时候 直接将图标拖动到桌面上即可

  

  

  

    通过keytool命令来导入证书 注意导入时需要管理员权限 所以命令前面要加sudo 不知道这个在win 系统上是不是也要如此 lishixinzhi/Article/program/Java/hx/201311/27119

使用keytool 生成证书

keytool 工具介绍

keytool 是java 用于管理密钥和证书的工具,其功能包括:

1 创建并管理密钥

2 创建并管理证书

3 作为CA 为证书授权

4 导入导出证书

keytool 采用keystore来存储密钥及证书,其中可包括私钥、信任证书; 
keystore 文件使用 JKS格式,带密钥存储;其中私钥的存储也有独立的密码;

一、生成 私钥

keytool -genkey -alias serverkey -keystore server.keystore

按提示 输入keystore 存储密码、私钥密码、个人信息,之后会生成 server.keystore文件

相关参数

-keyalt RSA 采用RSA算法(默认) 
-storepass keystore 文件密码 
-keypass 私钥密码

二、导出证书

keytool -export -keystore server.keystore -file server.cer -alias serverkey

三、导入信任证书(客户端使用)

keytool -import -keystore clientTrust.keystore -file server.cer -alias serverTrust

四、查看密钥及证书

查看server 密钥

keytool -list -keystore server.keystore

输出

Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
serverkey, Sep 25, 2016, PrivateKeyEntry,
Certificate fingerprint (SHA1): 65:75:C9:08:A0:83:21:A1:D7:8D:DA:CD:3D:FB:C2:E0:50:96:29:62

  

查看clientTrust 密钥

keytool -list -keystore clientTrust.keystore

输出

Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
servertrust, Sep 25, 2016, trustedCertEntry,
Certificate fingerprint (SHA1): 65:75:C9:08:A0:83:21:A1:D7:8D:DA:CD:3D:FB:C2:E0:50:96:29:62

  

加上-v选项可查看更详细信息

查看 证书

keytool -printcert -file server.cer

输出

Owner: CN=ZZ, OU=DEV, O=pp.com, L=GZ, ST=GD, C=CN
Issuer: CN=ZZ, OU=DEV, O=pp.com, L=GZ, ST=GD, C=CN
Serial number: 797f3140
Valid from: Sun Sep 25 16:43:55 CST 2016 until: Sat Dec 24 16:43:55 CST 2016
Certificate fingerprints:
MD5: FB:7D:29:4C:A9:F3:07:0E:CC:74:0D:9B:D4:D6:4D:91
SHA1: 65:75:C9:08:A0:83:21:A1:D7:8D:DA:CD:3D:FB:C2:E0:50:96:29:62
SHA256: E9:8B:A5:43:5F:40:FA:C5:64:3B:0A:11:1D:BE:D1:07:3C:A1:E2:50:88:71:A7:5C:EC:43:22:98:1B:AA:B6:EB
Signature algorithm name: SHA1withDSA
Version: 3
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 0E C3 62 D3 75 3A 3C B7 D9 C4 BD 8E 63 E7 6C EC ..b.u:<.....c.l.
0010: AF 8A 29 72 ..)r
]
]

  

五 转换命令

将 jks格式 转 pkcs

keytool -importkeystore -srckeystore me.keystore -destkeystore me.p12 -srcalias me -destalias me -srcstoretype JKS -deststoretype PKCS12

 

FAQ

** keytool 通用格式为 jks,如何获取私钥?** 
答:通过程序读取输出;

** 如何将 jks文件转换为 pem文件,以用于nginx服务器?** 
答:通常jks 文件已包含私钥、证书、CA证书信息,可通过 keytool 将jks 转为pkcs格式,再通过openssl 进行转换提取:

提取 privatekey -nodes 指示输出无加密 pem文件
openssl pkcs12 -in me.p12 -nodes -nocerts -out me.key
提取 证书
openssl pkcs12 -in me.p12 -nodes -nokeys -clcerts -out me.crt
提取 CA证书(如果自签名则为空)
openssl pkcs12 -in me.p12 -nodes -nokeys -cacerts -out ca.crt

  

以上是关于使用Keytool为JDK添加https证书信任的主要内容,如果未能解决你的问题,请参考以下文章

JDK自带工具keytool生成ssl证书

TOMCAT配置SSL双向握手

TOMCAT配置SSL双向单向握手

tomcat7+jdk的keytool生成证书 配置https

cas单点登录 生成证书

如何以编程方式将证书添加为当前JVM实例的受信任