参考资料
- Java证书工具keytool用法总结
- keytool-简介
- CA证书介绍与格式转换
- 密钥,私钥,公钥的区分
- とほほのOpenSSL入門
目录
- 一. 概念
- 1.1 keystore文件
- 1.2 keytool
- 1.3 非对称加密
- 1.3.1 加密解密
- 1.3.2 数字签名认证
- 1.3.3 通信中的加密与签名过程
- 1.4 证书格式
- 1.5 openssl
- 1.6 X.509标准
- 二. keytool工具使用
- 2.1 生成
- 2.1.1 生成keystore文件
- 2.1.2 指定私钥生成公钥
- 2.2 查看
- 2.2.1 查看所有密钥与keystore的类型
- 2.2.2 查看keystore内的指定密钥的详情
- 2.3 修改
- 2.3.1 修改指定的密钥别名
- 2.3.2 修改指定密钥的密码
- 2.3.3 修改keysore密码
- 2.4 删除
- 2.5 密钥导入keystore
一. 概念
1.1 keystore文件
keystore文件可以理解为一个容器,用来存储公钥和私钥,主要用于确保身份验证、数据加密和数字签名的安全。
⏹文件类型
- JKS (Java KeyStore)
- Java8之前默认的 keystore 类型,专门用于 Java 应用程序。
- PKCS12
- 国际标准的 keystore 格式
- 存储加密的私钥和证书的标准化方式
- 兼容性好,与编程语言无关,适用于各种平台和工具。
💥注意
keystore文件只是一个容器,里面可以内置多个公钥和私钥。
1.2 keytool
keytool 是JDK 1.4以后自带的密钥和证书管理工具,主要用于生成密钥对、创建、管理、导入和导出证书等。
- Java8之前,通过
keytool命令
生成的keystore
文件的默认类型就是JKS
。 - Java9之后的版本将
PKCS12
作为默认的 keystore 类型。
⏹该工具的路径为%JAVA_HOME%\bin\keytool.exe
,Java配置了环境变量之后,便可在命令行中使用。
1.3 非对称加密
⏹使用一对密钥(公钥和私钥),来进行数据加密和解密。
核心特性:
- 公钥和私钥是成对的,公钥用于加密,私钥用于解密
- 可以通过私钥生成公钥,但是无法通过公钥生成私钥。
- 私钥必须保密,而公钥可以公开发布。
1.3.1 加密解密
- 发送方使用接收方的
公钥
加密数据。 - 加密后的数据通过网络传输给
接收方
。 - 接收方使用自己的
私钥
解密数据,恢复明文。
1.3.2 数字签名认证
- 使用私钥加密摘要(生成签名),意味着只有拥有私钥的人(即签名者)才能创建这个签名,从而确认签名的真实性。
- 任何人持有发送方的公钥都可以验证签名(通过解密签名获得摘要并与数据摘要比较),但只有私钥持有者才能生成签名,这确保了签名的唯一性和数据的来源可信。
1.3.3 通信中的加密与签名过程
假设 A 要与 B 进行安全通信,通常会按以下步骤操作:
A 加密数据的过程
⏹签名数据(完整性和身份认证):
- A 使用自己的私钥对数据的哈希摘要进行加密,生成数字签名。
- 然后,A 将签名和数据一起发送给 B,以便 B 可以验证数据的真实性和来源。
⏹加密数据(机密性):
- A 使用
B的公钥
对数据进行加密(有时包括签名部分一起加密),确保数据在传输过程中保持机密。 - 加密后的数据发送给 B,只有 B 的私钥可以解密。
B 接收数据后的验证过程
⏹解密数据:
- B使用自己的
私钥
解密收到的数据,得到原始数据和签名。
⏹验证签名:
- B 使用
A的公钥
解密签名,得到 A 生成的哈希摘要。 - B 对解密得到的数据再次生成哈希摘要,并与 A 提供的摘要进行比较。
- 如果两者一致,B 可以确认数据未被篡改,并且确认数据确实来自 A。
1.4 证书格式
⏹我们常说的证书其实指的就是公钥,公钥是公开给其它人使用的,常见的后缀有以下几种:
.crt
- crt后缀的证书常用于
Unix/Linux
系统中。 - 证书是
PEM
格式(文本编码格式),通常使用Base64编码
,可以直接以文本编辑器查看。
- crt后缀的证书常用于
.cer
- cer后缀的证书常用于Windows系统,兼容Windows 的证书管理器。
- 证书是
DER
格式(二进制编码格式),无法以文本形式查看,需要专门的证书工具查看。
.pem
- pem(Privacy Enhanced Mail)格式的证书是一种基于 Base64 编码的可读文本格式。
- pem格式的文件使用明确的分隔符,标明数据类型
-----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----
:表示证书数据-----BEGIN PRIVATE KEY----- 和 -----END PRIVATE KEY-----
:表示私钥数据-----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY-----
:表示公钥数据
1.5 openssl
OpenSSL 是一个广泛使用的开源工具集,提供了实现安全套接字层(SSL)和传输层安全(TLS)协议所需的各种功能。
也支持加密、解密、证书生成和管理等功能。
⏹可以使用openssl对证书的格式进行转换。
.cer
转换为.pem
.pem
转换为.cer
⏹官网:https://www.openssl.org/
1.6 X.509标准
用于定义数字证书的格式和证书验证机制,是公钥基础设施(PKI)的核心部分。
主要用于在计算机网络中验证身份,并在安全通信中提供数字证书。
⏹数字证书格式:
- X.509 定义了数字证书的结构,包括证书的各个部分,如持有者信息、公钥、颁发者信息和有效期等。
- 证书通常包括以下字段:
- 版本:指示 X.509 证书的版本(如 V1、V2、V3)。
- 序列号:由证书颁发机构(CA)分配的唯一标识符。
- 颁发者:证书颁发机构的名称和信息。
- 主题:持有者的名称和信息。
- 公钥信息:持有者的公钥及其算法。
- 有效期:证书的有效起始时间和结束时间。
- 签名:由 CA 使用其私钥生成的证书签名。
⏹公钥基础设施(PKI):
- X.509 是公钥基础设施的重要组成部分,它使得通过数字证书来验证公钥的合法性成为可能。
- PKI 包括 CA、证书撤销列表(CRL)、注册机构(RA)等组件,支持数字证书的管理和验证。
⏹证书链:
- X.509 证书可以形成证书链,信任链中每个证书都是由上级 CA 签名的,最终链接到一个根证书。
- 通过验证证书链中的每个证书,可以确认目标证书的有效性。
⏹下图是由X.509标准
生成的.cer
后缀DER
格式的公钥证书
二. keytool工具使用
💥以下所涉及的所有命令,为了方便显示都采取了折行显示,实际使用时,建议转换为一行使用。
⏹要了解某个命令的参数可以使用keytool -command_name -help
来获取。
例如:使用keytool -genkeypair -help
可以查看genkeypair命令
2.1 生成
2.1.1 生成keystore文件
⏹生成的keystore文件内含一对密钥(公钥和私钥)
keytool -genkeypair -alias <密钥别名> -keyalg RSA -sigalg SHA384withRSA -keysize 2048 -validity 365 -keystore <keystore文件所在路径>-storepass <keystore密码># 问题组1
您的名字与姓氏是什么?
您的组织单位名称是什么?
您的组织名称是什么?
您所在的城市或区域名称是什么?
您所在的省/市/自治区名称是什么?
该单位的双字母国家/地区代码是什么?# 问题组2
私钥的密码
2.1.2 指定私钥生成公钥
⏹根据keystore中的指定私钥,生成cer格式的公钥
keytool -exportcert -alias <密钥别名>-keystore <keystore文件所在路径>-storepass <keystore密码>-file <cer文件所在路径>
⏹通过openssl将cer格式的公钥转换为pem格式的公钥
openssl x509 -inform der-in clientkey.cer-outform pem-out clientkey.pem
2.2 查看
2.2.1 查看所有密钥与keystore的类型
- 可以看到一个keystore内所有的公钥和私钥
- 可以查看keystore的类型,到底是 JKS 还是 PKCS12
keytool -list -keystore <keystore文件所在路径> -storepass <keystore密码>
2.2.2 查看keystore内的指定密钥的详情
keytool -list -v -alias <密钥别名> -keystore <keystore文件所在路径> -storepass <keystore密码>
2.3 修改
2.3.1 修改指定的密钥别名
keytool -changealias -keystore <keystore文件所在路径> -alias <旧别名> -destalias <新别名>
2.3.2 修改指定密钥的密码
keytool -keypasswd -alias <密钥别名> -keypass <旧密钥密码> -new <新密钥密码> -keystore <keystore文件所在路径> -storepass <keystore密码>
2.3.3 修改keysore密码
keytool -storepasswd -new <新keystore密码> -keystore <keystore文件所在路径> -storepass <原keystore密码>
2.4 删除
⏹删除keystore里面的指定密钥
keytool -delete -alias <密钥别名> -keystore <keystore文件所在路径> -storepass <keystore密码>
2.5 密钥导入keystore
⏹将B的keystore中的私钥导入到A的keystore中
keytool -importkeystore-srckeystore <B.keystore>-srcstoretype JKS或者PKCS12-srcalias <B.keystore中的既存私钥别名>-destkeystore <A.keystore>-deststoretype JKS或者PKCS12-destalias <A.keystore中的待导入私钥别名>