keytool 工具应用分析与整理

96
羽杰
2017.06.26 13:54* 字数 324

文前说明

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

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 <server>
    (RETURN if same as keystore password):  
Re-enter new password:
命令参数 参数说明 默认值
-alias 别名(密钥库中密钥唯一)
-keystore 指定密钥库的名称
-storepass 指定密钥库的密码
-keypass 指定别名密钥的密码
-dname 指定证书拥有者信息
-keyalg 指定密钥的算法(RSADSA 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 文件转换

  • 安装 openssl
yum -y install openssl openssl-devel
  • 通过 opensslpkcs 文件转换成 pem 文件
openssl pkcs12 -in server.p12 -out server.pem
  • 通过 opensslpem 文件转换成 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 实现版本,providerSUN 密钥库和私钥用不同的密码进行保护。
JCEKS .jce JCE Keystore,密钥库的 JCE 实现版本,providerSUN JCE 相对于 JKS 安全级别更高,保护密钥库私钥时采用 TripleDES
PKCS12 .p12/.pfx PKCS #12,个人信息交换语法标准。 包含私钥、公钥及其证书、密钥库和私钥用相同密码进行保护。
BKS .bks Bouncycastle Keystore,密钥库的 BC 实现版本,providerBC 基于 JCE 实现。
UBER .ubr Bouncycastle UBER Keystore,密钥库的 BC 更安全实现版本,providerBC

证书文件格式

格式 扩展名 描述 特点
DER .cer/.crt/.rsa ASN .1 DER,用于存放证书 不含私钥、二进制
PKCS7 .p7b/.p7r PKCS #7,加密信息语法标准 1.p7b 以树状展示证书链,不含私钥;2.p7rCA 对证书请求签名的回复,只能用于导入。
CMS .p7c/.p7m/.p7s Cryptographic Message Syntax,1.p7c 只保存证书;2.p7msignature with enveloped data;3.p7s,时间戳签名文件。
PEM .pem Printable Encoded Message,1.该编码格式在 RFC1421 中定义,其实 PEMPrivacy-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 用于保存公钥。
java