Java扩展工具使用说明补充

2022-09-29 14:38:29 浏览数 (1)

[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生命周期一览

代码语言:javascript复制
生成CSR/密钥 -> 提交证书颁发机构 -> 证书下发 ->  无需使用CSR仅提交时候需要
(1) CSR生成

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

代码语言:javascript复制
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文件

代码语言:javascript复制
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生成完毕。

代码语言:javascript复制
[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。

代码语言:javascript复制
#注意:一个密钥库可以有多个密钥
$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为后缀的文件。

流程如下:

代码语言:javascript复制
#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文件:

代码语言:javascript复制
openssl pkcs12 -export -out "certificate_combined.pfx" -inkey "private.key" -in "certificate.crt" -certfile ca_bundle.crt

2) 如果您需要PEM格式的私钥文件(Apache中)

代码语言:javascript复制
openssl rsa -in private.key -text > private.pem

0 人点赞