参考资料
目录
- [一. 概念](#一. 概念)
-
- [1.1 keystore文件](#1.1 keystore文件)
- [1.2 keytool](#1.2 keytool)
- [1.3 非对称加密](#1.3 非对称加密)
-
- [1.3.1 加密解密](#1.3.1 加密解密)
- [1.3.2 数字签名认证](#1.3.2 数字签名认证)
- [1.3.3 通信中的加密与签名过程](#1.3.3 通信中的加密与签名过程)
- [1.4 证书格式](#1.4 证书格式)
- [1.5 openssl](#1.5 openssl)
- [1.6 X.509标准](#1.6 X.509标准)
- [二. keytool工具使用](#二. keytool工具使用)
-
- [2.1 生成](#2.1 生成)
-
- [2.1.1 生成keystore文件](#2.1.1 生成keystore文件)
- [2.1.2 指定私钥生成公钥](#2.1.2 指定私钥生成公钥)
- [2.2 查看](#2.2 查看)
-
- [2.2.1 查看所有密钥与keystore的类型](#2.2.1 查看所有密钥与keystore的类型)
- [2.2.2 查看keystore内的指定密钥的详情](#2.2.2 查看keystore内的指定密钥的详情)
- [2.3 修改](#2.3 修改)
-
- [2.3.1 修改指定的密钥别名](#2.3.1 修改指定的密钥别名)
- [2.3.2 修改指定密钥的密码](#2.3.2 修改指定密钥的密码)
- [2.3.3 修改keysore密码](#2.3.3 修改keysore密码)
- [2.4 删除](#2.4 删除)
- [2.5 密钥导入keystore](#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
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文件内含一对密钥(公钥和私钥)
powershell
keytool -genkeypair
-alias <密钥别名>
-keyalg RSA
-sigalg SHA384withRSA
-keysize 2048
-validity 365
-keystore <keystore文件所在路径>
-storepass <keystore密码>
# 问题组1
您的名字与姓氏是什么?
您的组织单位名称是什么?
您的组织名称是什么?
您所在的城市或区域名称是什么?
您所在的省/市/自治区名称是什么?
该单位的双字母国家/地区代码是什么?
# 问题组2
私钥的密码
2.1.2 指定私钥生成公钥
⏹根据keystore中的指定私钥,生成cer格式的公钥
powershell
keytool -exportcert
-alias <密钥别名>
-keystore <keystore文件所在路径>
-storepass <keystore密码>
-file <cer文件所在路径>
⏹通过openssl将cer格式的公钥转换为pem格式的公钥
powershell
openssl x509
-inform der
-in clientkey.cer
-outform pem
-out clientkey.pem
2.2 查看
2.2.1 查看所有密钥与keystore的类型
- 可以看到一个keystore内所有的公钥和私钥
- 可以查看keystore的类型,到底是 JKS 还是 PKCS12
powershell
keytool -list
-keystore <keystore文件所在路径>
-storepass <keystore密码>
2.2.2 查看keystore内的指定密钥的详情
powershell
keytool -list -v
-alias <密钥别名>
-keystore <keystore文件所在路径>
-storepass <keystore密码>
2.3 修改
2.3.1 修改指定的密钥别名
powershell
keytool -changealias
-keystore <keystore文件所在路径>
-alias <旧别名>
-destalias <新别名>
2.3.2 修改指定密钥的密码
powershell
keytool -keypasswd
-alias <密钥别名>
-keypass <旧密钥密码>
-new <新密钥密码>
-keystore <keystore文件所在路径>
-storepass <keystore密码>
2.3.3 修改keysore密码
powershell
keytool -storepasswd
-new <新keystore密码>
-keystore <keystore文件所在路径>
-storepass <原keystore密码>
2.4 删除
⏹删除keystore里面的指定密钥
powershell
keytool -delete
-alias <密钥别名>
-keystore <keystore文件所在路径>
-storepass <keystore密码>
2.5 密钥导入keystore
⏹将B的keystore中的私钥导入到A的keystore中
powershell
keytool -importkeystore
-srckeystore <B.keystore>
-srcstoretype JKS或者PKCS12
-srcalias <B.keystore中的既存私钥别名>
-destkeystore <A.keystore>
-deststoretype JKS或者PKCS12
-destalias <A.keystore中的待导入私钥别名>