文前说明
作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。
本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。
Keytool 是一个 Java 数据证书的管理工具。
Key and Certificate Management Tool
Commands:
-certreq Generates a certificate request
-changealias Changes an entry's alias
-delete Deletes an entry
-exportcert Exports certificate
-genkeypair Generates a key pair
-genseckey Generates a secret key
-gencert Generates certificate from a certificate request
-importcert Imports a certificate or a certificate chain
-importkeystore Imports one or all entries from another keystore
-keypasswd Changes the key password of an entry
-list Lists entries in a keystore
-printcert Prints the content of a certificate
-printcertreq Prints the content of a certificate request
-printcrl Prints the content of a CRL file
-storepasswd Changes the store password of a keystore
证书的生成
keytool -genkey -alias server -keyalg RSA -keystore server.keystore
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: desktop
What is the name of your organizational unit?
[Unknown]: cetc
What is the name of your organization?
[Unknown]: cetc
What is the name of your City or Locality?
[Unknown]: chengdu
What is the name of your State or Province?
[Unknown]: sichuan
What is the two-letter country code for this unit?
[Unknown]: cn
Is CN=cetc, OU=cetc, O=cetc, L=chengdu, ST=sichuan, C=cn correct?
[no]: y
Enter key password for
(RETURN if same as keystore password):
Re-enter new password:
命令参数 |
参数说明 |
默认值 |
-alias |
别名(密钥库中密钥唯一) |
|
-keystore |
指定密钥库的名称 |
|
-storepass |
指定密钥库的密码 |
|
-keypass |
指定别名密钥的密码 |
|
-dname |
指定证书拥有者信息 |
|
-keyalg |
指定密钥的算法(RSA、DSA) |
DSA |
-validity |
指定创建的证书有效期多少天) |
90 |
-keysize |
指定密钥长度 |
1024 |
dname 参数 |
参数说明 |
CN |
名字与姓氏 |
OU |
组织单位名称 |
O |
组织名称 |
L |
城市或区域名称 |
ST |
州或省份名称 |
C |
单位的两字母国家代码 |
证书的查看
keytool -list -v -keystore server.keystore -storepass 123456
命令参数 |
参数说明 |
-list |
显示密钥库中的证书信息 |
-v |
显示密钥库中的证书详细信息 |
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
Alias name: cetc
Creation date: Jun 26, 2017
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=desktop, OU=cetc, O=cetc, L=chengdu, ST=sichuan, C=cn
Issuer: CN=desktop, OU=cetc, O=cetc, L=chengdu, ST=sichuan, C=cn
Serial number: 534209f8
Valid from: Mon Jun 26 09:55:20 CST 2017 until: Thu Jun 24 09:55:20 CST 2027
Certificate fingerprints:
MD5: AF:42:BB:B9:1E:E7:65:11:13:B4:36:FC:68:1D:5B:F4
SHA1: FE:6F:92:BA:73:D4:D0:F2:76:7B:6D:C7:5B:BF:26:4E:F6:8D:61:D2
SHA256: 0B:6E:CA:D5:11:4A:93:D3:E0:28:AC:54:D6:FD:28:E8:56:F6:D8:58:4A:3C:A3:44:FB:71:7C:2C:AE:20:02:DD
Signature algorithm name: SHA256withRSA
Version: 3
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E3 61 A9 A9 34 9E 68 85 D2 A2 D0 A8 9A 0F EA B1 .a..4.h.........
0010: D6 BB 45 29 ..E)
]
]
缺省情况下,-list 命令打印证书的 MD5 指纹。而如果指定了 -v 选项,将以可读格式打印证书,如果指定了 -rfc 选项,将以可打印的编码格式输出证书。
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
Alias name: cetc
Creation date: Jun 26, 2017
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
-----BEGIN CERTIFICATE-----
MIICXDCCAcWgAwIBAgIEU0IJ+DANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJjbjEQMA4GA1UE
CBMHc2ljaHVhbjEQMA4GA1UEBxMHY2hlbmdkdTENMAsGA1UEChMEY2V0YzENMAsGA1UECxMEY2V0
YzEQMA4GA1UEAxMHZGVza3RvcDAeFw0xNzA2MjYwMTU1MjBaFw0yNzA2MjQwMTU1MjBaMGExCzAJ
BgNVBAYTAmNuMRAwDgYDVQQIEwdzaWNodWFuMRAwDgYDVQQHEwdjaGVuZ2R1MQ0wCwYDVQQKEwRj
ZXRjMQ0wCwYDVQQLEwRjZXRjMRAwDgYDVQQDEwdkZXNrdG9wMIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQCo+0v6DS6Dh7f+PTio3bXC8wVUaOHQfbAYzFpy5wfG/i+BcV/n2nOW6jXcwt5GXiFT
YpizxoERNzxOs4XRnwxqYv22Qv0LH5Q38gnr0XLr8VYE/7ZLnbSdSqi0p3Af0FwOQIwzW/8+Dpn/
zJigy5dK49rxTe5angDYlRXtB9sNYwIDAQABoyEwHzAdBgNVHQ4EFgQU42GpqTSeaIXSotComg/q
sda7RSkwDQYJKoZIhvcNAQELBQADgYEAKvI9C3kmEcjUark3j55Hsj+ur2jzVy7MWCOASGsWjLA0
qDqgdmVGYhPuHSEuAT0yQqtg9uodsPER+oDTeePKRjAOXg2MzeqcmvwInhpRkhfljLJeVGy5TXRU
s8ZjnDP9F/JdDfqcNEzaAWuRllXf9yPfK9xUs5TwM1TCEP1lSQs=
-----END CERTIFICATE-----
证书条目的导出
keytool -export -alias cetc -keystore server.keystore -file server.cer -rfc -storepass 123456
命令参数 |
参数说明 |
-export |
将别名指定的证书条目导出到文件 |
-file |
参数指定导出到文件的文件名 |
-rfc |
表示以 base64 输出文件,否则以二进制输出。 |
server.keysstore 也可以为 .jks 格式,server.cer 也可以为 .crt 格式。
查看导出的证书条目
keytool -printcert -file server.cer
命令参数 |
参数说明 |
-printcert |
查看导出的证书条目信息 |
Owner: CN=desktop, OU=cetc, O=cetc, L=chengdu, ST=sichuan, C=cn
Issuer: CN=desktop, OU=cetc, O=cetc, L=chengdu, ST=sichuan, C=cn
Serial number: 534209f8
Valid from: Mon Jun 26 09:55:20 CST 2017 until: Thu Jun 24 09:55:20 CST 2027
Certificate fingerprints:
MD5: AF:42:BB:B9:1E:E7:65:11:13:B4:36:FC:68:1D:5B:F4
SHA1: FE:6F:92:BA:73:D4:D0:F2:76:7B:6D:C7:5B:BF:26:4E:F6:8D:61:D2
SHA256: 0B:6E:CA:D5:11:4A:93:D3:E0:28:AC:54:D6:FD:28:E8:56:F6:D8:58:4A:3C:A3:44:FB:71:7C:2C:AE:20:02:DD
Signature algorithm name: SHA256withRSA
Version: 3
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E3 61 A9 A9 34 9E 68 85 D2 A2 D0 A8 9A 0F EA B1 .a..4.h.........
0010: D6 BB 45 29 ..E)
]
]
PKCS12 与 JKS 格式转换
keytool -v -importkeystore -srckeystore server.keystore -srcalias cetc -destkeystore server.p12 -deststoretype PKCS12
命令参数 |
参数说明 |
-importkeystore |
导入密钥库,通过格式设定,我们可以将 JKS 文件转换为 PKCS12 格式。 |
-v |
显示详情 |
-srckeystore |
源密钥库 |
-srcstoretype |
源密钥库格式 |
-srcstorepass |
源密钥库密码 |
-destkeystore |
目标密钥库 |
-deststoretype |
目标密钥库格式,这里为 PKCS12,默认值 JKS |
-deststorepass |
目标密钥库密码。 |
把 PKCS 文件与 PEM 文件转换
yum -y install openssl openssl-devel
- 通过 openssl 把 pkcs 文件转换成 pem 文件
openssl pkcs12 -in server.p12 -out server.pem
- 通过 openssl 把 pem 文件转换成 pkcs 文件
openssl pkcs12 -export -in server.pem -out server.p12
证书条目的删除
keytool -delete -alias cetc -keystore server.keystore -storepass 123456
命令参数 |
参数说明 |
-delete |
删除密钥库中某证书条目 |
证书条目口令的修改
keytool -keypasswd -alias cetc -keypass 123456 -new 654321 -keystore server.keystore -storepass 123456
命令参数 |
参数说明 |
-keypasswd |
修改密钥库中指定条目口令 |
-storepasswd |
修改密钥库口令 |
-new |
修改后新密码 |
修改证书条目信息
keytool -selfcert -alias cetc -keypass 123456 -keystore server.keystore -storepass 123456 -dname "cn=desktop,ou=cetc,o=cetc,c=cetc"
命令参数 |
参数说明 |
-selfcert |
某证书条目信息修改 |
证书的导入
keytool -export -alias cetc -keystore server.keystore -file server.cer -storepass 123456
命令参数 |
参数说明 |
-import |
将已签名数字证书条目导入密钥库 |
密钥库文件格式
格式 |
扩展名 |
描述 |
特点 |
JKS |
.jks/.ks |
Java Keystore,密钥库的 Java 实现版本,provider 为 SUN。 |
密钥库和私钥用不同的密码进行保护。 |
JCEKS |
.jce |
JCE Keystore,密钥库的 JCE 实现版本,provider 为 SUN JCE。 |
相对于 JKS 安全级别更高,保护密钥库私钥时采用 TripleDES。 |
PKCS12 |
.p12/.pfx |
PKCS #12,个人信息交换语法标准。 |
包含私钥、公钥及其证书、密钥库和私钥用相同密码进行保护。 |
BKS |
.bks |
Bouncycastle Keystore,密钥库的 BC 实现版本,provider 为 BC。 |
基于 JCE 实现。 |
UBER |
.ubr |
Bouncycastle UBER Keystore,密钥库的 BC 更安全实现版本,provider为 BC。 |
证书文件格式
格式 |
扩展名 |
描述 |
特点 |
DER |
.cer/.crt/.rsa |
ASN .1 DER,用于存放证书 |
不含私钥、二进制 |
PKCS7 |
.p7b/.p7r |
PKCS #7,加密信息语法标准 |
1.p7b 以树状展示证书链,不含私钥;2.p7r 为 CA 对证书请求签名的回复,只能用于导入。 |
CMS |
.p7c/.p7m/.p7s |
Cryptographic Message Syntax,1.p7c 只保存证书;2.p7m,signature with enveloped data;3.p7s,时间戳签名文件。 |
PEM |
.pem |
Printable Encoded Message,1.该编码格式在 RFC1421 中定义,其实 PEM 是 Privacy-Enhanced Mail 的简写,但他也同样广泛运用于密钥管理;2. ASCII 文件;3.一般基于 base 64 编码 |
PKCS10 |
.p10/.csr |
PKCS #10,公钥加密标准 Certificate Signing Request |
1.证书签名请求文件;2. ASCII 文件;3. CA 签名后以 p7r 文件回复。 |
SPC |
.pvk/.spc |
Software Publishing Certificate,微软公司特有的双证书文件格式,经常用于代码签名,其中 1. pvk 用于保存私钥;2. spc 用于保存公钥。 |