[TOC]

Keytool 工具

描述:keytool是JDK中工具对JDK版本要求不高,但基于现在JDK版本的安全性考虑,建议使用JDK8及以上版本

在使用之前我们先了解一些基础概念更能让我们了解此工具的用处:

  • SSL证书(SSL Certificates): 是HTTP明文协议升级HTTPS加密协议必备的数字证书,它在客户端(浏览器)与服务端(网站服务器)之间搭建一条安全的加密通道,对两者之间交换的信息进行加密确保传输数据不被泄露或篡改(特别是在现在运营商流量分析手段-能采用https尽量采用)。
  • CSR(Certificate Signing Request): 即证书签名请求文件,是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。

Q:如何生成CSR证书请求文件?
答:目前CSR生成工具非常多,比如 openssl工具 / keystore explore / XCA ,以及在线工具:https://myssl.com/csr_create.html

Q:CSR是什么样?Key又是什么样?
答:CSR是以-----BEGIN CERTIFICATE REQUEST-----开头又以-----END CERTIFICATE REQUEST-----为结尾的base64格式的编码;
Key是以-----BEGIN RSA PRIVATE KEY-----开头的又以-----END RSA PRIVATE KEY-----结尾的,此处密钥算法采用的RSA当然您可以选择ecdsa 和 ed25519

CSR生成注意事项:

  • 域名必须正确输入(如果是非SSL证书,则输入相应的通用名)。
  • 密钥算法选择RSA的话密钥长度需要2048bit以上(默认是2048没有特殊情况不要特殊设置),ECC则是256bit以上。
  • 摘要签名长度建议是sha2-256及以上
  • 有CSR必定有KEY所以他们是成对的,在证书申请下来后需要与和私钥key配对使用(key必须加密保存好

CSR生命周期一览

1
生成CSR/密钥 -> 提交证书颁发机构 -> 证书下发 ->  无需使用CSR仅提交时候需要


(1) CSR生成

注意:CSR是无法一步创建的需要先生成keystore在使用KeyTool工具时;
Step1.创建密钥库keystore

1
2
3
4
5
6
7
8
9
10
11
12
13
14
keytool -genkeypair \ 
-alias www.weiyigeek.top \
-keyalg RSA \
-keysize 2048 \
-keypass WeiyiGeekSSL \
-keystore server.jks \
-storetype JKS \
-storepass WeiyiGeekSSL \
-sigalg SHA256withRSA \
-dname "cn=www.weiyigeek.top,ou=IT,o=唯一极客,l=beijing,st=beijing,c=CN" \
-validity 365

#Linux&Windows
keytool -genkeypair -alias www.weiyigeek.top -keyalg RSA -keysize 2048 -keypass WeiyiGeekSSL -keystore server.jks -storetype JKS -storepass WeiyiGeekSSL -sigalg SHA256withRSA -dname "cn=www.weiyigeek.top,ou=IT,o=唯一极客,l=beijing,st=beijing,c=CN" -validity 365

参数说明:

  • alias: 自定义别名此处我以自己域名为例,因一个证书库中可以存放多个证书,通过别名标识证书常起作mykey。
  • keyalg: 密钥的算法可以选择的密钥算法有RSA、EC、ED,不建议使用DSA密钥算法;
  • keysize: 密钥长度keysize与keyalg默认对应关系,RSA-2048(最高4096bit并不是越长越高也要考虑非对称算法的运算开销) / DSA-1024 / EC-256;
  • keypass: 密钥密码建议最好与storepass一致
  • keystore: 密钥库的名称默认在当前目录创建证书库
  • storetype: 证书库类型可选JKS(JDK8)、PKCS12(JDK9)
  • storepass: 证书库密码(私钥的密码)最好与keypass 一致
  • sigalg: 签名算法,当keyalg=RSA时有MD5withRSA、SHA1withRSA、SHA256withRSA、SHA384withRSA、SHA512withRSA可供选择但是不建议选择MD5与SHA1签名算法,建议使用SHA256及以上的签名;
  • dname: “CN=名字与姓氏/域名,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码”;
  • validity: 有效期此处”365“为证书有效期天数。

注意事项:

  • 上述命令需要将 -dname 参数替换(尤其时域名要写对)、密码更改即可,其它可保持不变。

Step2.利用得到JKS文件生成CSR文件

1
2
3
4
5
6
7
8
9
keytool -certreq \ 
-keyalg RSA \
-alias www.weiyigeek.top \
-keystore server.jks \
-storetype JKS \
-storepass WeiyiGeekSSL \
-file www.weiyigeek.top.csr \
#Linux&Windows
keytool -certreq -keyalg RSA -alias www.weiyigeek.top -keystore server.jks -storetype JKS -storepass WeiyiGeekSSL -file www.weiyigeek.top.csr

Step3.CSR需要提交私钥则存储在JKS文件中, 至此keytool方式的CSR生成完毕。

1
2
3
[root@initiator tmp]# ls -alh server.jks www.weiyigeek.top.csr
-rw-r--r--. 1 root root 2.3K 4月 23 17:20 server.jks
-rw-r--r--. 1 root root 1.1K 4月 23 17:24 www.weiyigeek.top.csr

补充说明:[2020-04-23 16:59:49]

  • (1) 主流的证书格式有PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL 、OCSP、SCEP并且他们是可以相互装换的;
  • (2) JKS 密钥库使用专用格式建议使用下面的迁移到行业标准格式 PKCS12。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #注意:一个密钥库可以有多个密钥
    $keytool -importkeystore -srckeystore server.jks -destkeystore server.jks -deststoretype pkcs12
    输入源密钥库口令:
    已成功导入别名 www.weiyigeek.top 的条目。
    已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
    Warning:
    已将 "server.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "server.jks.old" 进行了备份。

    #2.密钥库中的条目查询
    $keytool -list -v -keystore "server.jks"
    输入密钥库口令:
    密钥库类型: PKCS12
    密钥库提供方: SUN
    您的密钥库包含 1 个条目
    www.weiyigeek.top, 2020-4-23, PrivateKeyEntry,
    证书指纹 (SHA1): 72:E5:D9:48:1C:4D:4F:7D:AD:56:35:3D:FF:9B:3B:08:B4:A2:B3:45

    #3.最终产生的csr貌似都是一样的;
    $keytool -certreq -keyalg RSA -alias www.weiyigeek.top -keystore server.jks -storetype PKCS12 -storepass WeiyiGeekSSL -file www.weiyigeek.top.pkcs12.csr

    #4.删除密钥库中的条目:
    $keytool -delete -alias weiyigeek.top -keystore "server.jks"

    #5.导出密钥到证书:
    $keytool -exportcert -alias weiyigeek.top -keystore server.jks -file weiyigeek.top.cer -storepass WeiyiGeekSSL -rfc

    #6.加解密工具包(`openssl`) 然后您需要输入密钥库口令用来导出公钥;
    $keytool -list -rfc -keystore server.jks -storepass WeiyiGeekSSL | openssl x509 -inform pem -pubkey


(2) 密钥提取

描述:所谓JKS(Java Key Store)就是利用Java Keytool 工具生成的Keystore文件,JKS文件由公钥和密钥构成,其中的公钥就是我们所说的证书,即cer为后缀的文件,而私钥就是密钥,即以key为后缀的文件。

流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#1.查看证书信息
$keytool -list -rfc -keystore server.jks -storepass WeiyiGeek.
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: *****.weiyigeek.top
证书[1]:
-----BEGIN CERTIFICATE----- #证书信息 可将其保存在 crt 中


#2.JKS 密钥库使用专用格式迁移到行业标准格式 PKCS12;
keytool -importkeystore -srckeystore server.jks -destkeystore server.jks -deststoretype pkcs12
输入源密钥库口令:
已成功导入别名 *****.weiyigeek.top 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
已将 "server.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "server.jks.old" 进行了备份。


#3.jks文件中的私钥不能直接得到需要通过openssl将jks文件转换成pfx格式后再进行提取。
keytool -v -importkeystore -srckeystore server.jks -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore server.pfx -deststoretype pkcs12 -deststorepass 123456 -destkeypass WeiyiGeek.
# 正在将密钥库 server.jks 导入到 server.pfx...
# 已成功导入别名 study.weiyigeek.top 的条目。
# 已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
# [正在存储server.pfx]


#4.将servers.pfx的私钥导出
openssl pkcs12 -in server.pfx -nocerts -nodes -out server.key
# Enter Import Password:
# MAC verified OK
cat server.key #密钥
# Bag Attributes
# friendlyName: study.weiyigeek.top
# localKeyID: 54 69 6D 65 20 38 35 38 37 39 37 35 39 38 34 35 36 36
# Key Attributes: <No Attributes>
# -----BEGIN PRIVATE KEY-----


3.其它格式
  • 1) 如果需要一个PFX格式的密钥文件(IIS中),按照以下的说明将证书和私钥文件转换为一个.PFX文件:
    1
    openssl pkcs12 -export -out "certificate_combined.pfx" -inkey "private.key" -in "certificate.crt" -certfile ca_bundle.crt
  • 2) 如果您需要PEM格式的私钥文件(Apache中)
    1
    openssl rsa -in private.key -text > private.pem