keytoos and openssl - downgoon/hello-world GitHub Wiki
安全工具:openssl和keytool
keytool 是 Java 领域的证书管理工具。而 openssl 只 Linux C,使用中还是 openssl 多一些。
Keytool 将 密钥(key) 和 **证书(certificates)**存在一个称为keystore的文件中(默认是
~/.keystore
当前用户目录下隐藏文件.keystore
)。一般来说,在非对称体系,“密钥”就是指“私钥”,而“证书”就是被CA签名的“公钥”。
什么是~/.keystore
呢?
-
密钥对容器:它是密钥对容器,里面管理着多个密钥对(包含私钥和证书),每个“密钥对”有一个名字(称为
alias
)。它是alias
->KeyPair (PrivateKey, Certificate)
的映射集。 -
合并存储:Java的keystore,跟openssl有所不同。keystore是多个密钥对合并在一个文件里存储,而openssl是每个密钥是一个文件(甚至私钥和公钥都是分开的)。
-
两个口令:为了密钥本身访问的安全,keystore有两级密钥。一个是keystore层的口令,叫
storepass
; 另一个是私钥层面的口令,叫keypass
。
keytool提供的命令
$ keytool
密钥和证书管理工具
增删改查:
-genkeypair 生成密钥对
-delete 删除条目
-list 列出密钥库中的条目
修改两个口令:
-storepasswd 更改密钥库的存储口令
-keypasswd 更改条目的密钥口令
-changealias 更改条目的别名
导入导出:keystore是Java定义的格式,为了与国际标准互通,必须支持“导入导出”国际标准。
-exportcert 导出证书
-importcert 导入证书或证书链
-printcert 打印证书内容
向CA提交签名请求:当我们有了密钥对,为了发布“CA签名的公钥”,必须向CA提交一个“盖章”申请,这个申请格式就是 ``certreq``.
-certreq 生成证书请求
-printcertreq 打印证书请求的内容
命令:
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-printcrl 打印 CRL 文件的内容
使用 "keytool -command_name -help" 获取 command_name 的用法
生成RSA密钥对
$ keytool -genkeypair -alias passport -keypass pp123swl -keyalg RSA -keysize 1024 -validity 365 -keystore ./.keystore -storepass 123456 -dname "CN=downgoon, OU=downgoon, O=downgoon, L=beijing, ST=beijing, C=CN";
参数讲解:
-genkeypair
: 子命令,表示生成密钥对。-alias passport
: 生成的密钥对,取名叫passport,表示passport系统的密钥对。-keypass pp123swl
: 访问私钥时,需要的口令。这里主要是为了保护私钥不被别人看到。-keyalg RSA
: 算法是RSA,一种非对称加密算法。-keysize 1024
:秘钥长度是1024字节,你也可以502,或者2048字节。密钥越长,被破解的可能性越小,对应的代价是加密时间越长。-validity 365
: 密钥对中的证书有效期为365天。-keystore ./.keystore
: 密钥对存放到当前目录的.keystore
文件里。如果不指定的话,默认是~/.keystore
文件。-storepass 123456
: 访问keystore时的口令。注意跟-keypass pp123swl
区分。-dname "CN=downgoon, OU=downgoon, O=downgoon, L=beijing, ST=beijing, C=CN"
: 证书拥有者的组织信息,一个在中国北京的downgoon组织。
查看keystore密钥对列表
$ keytool -list -v -keystore ./.keystore -storepass 123456
其中 -v
表示详细输出,并且是二进制形式的指纹。如果换-rfc
参数,则表示以RFC Base64形式输出。
看到了别名为passport
的密钥对:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: passport
创建日期: 2017-2-13
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=downgoon, OU=downgoon, O=downgoon, L=beijing, ST=beijing, C=CN
发布者: CN=downgoon, OU=downgoon, O=downgoon, L=beijing, ST=beijing, C=CN
序列号: 193f1cec
有效期开始日期: Mon Feb 13 09:59:33 CST 2017, 截止日期: Tue Feb 13 09:59:33 CST 2018
证书指纹:
MD5: 68:EB:AD:D1:44:57:3A:B1:F7:EA:33:A7:4B:3D:FA:C4
SHA1: 7D:23:35:30:20:D5:B7:E7:7A:B9:D3:D7:BB:85:4E:35:1D:E7:08:32
SHA256: 2F:74:74:39:0F:E8:33:7E:29:3C:EB:DD:E2:BC:1E:79:0A:25:58:7F:E6:F5:A7:7B:5B:8D:BE:B6:AB:DD:50:57
签名算法名称: SHA256withRSA
版本: 3
导出证书
- 导出为der: 默认导出为der证书。
- 导出为pem: 支持RFC的pem格式。这个可是在openssl中也用。
默认导出为der证书:
$ keytool -export -alias passport -keystore ./.keystore -storepass 123456 -file passport.cer
加 -rfc
导出为pem证书:
$ keytool -export -alias passport -keystore ./.keystore -storepass 123456 -rfc -file passport.pem
或者利用openssl也能将 cer
证书格式转化成 pem
格式:
$ openssl x509 -inform der -in passport.cer -out passport.pem
提醒
cer文件到PEM文件的转换较简单。这两者都是X509证书,编码不同。
备忘
密钥管理更加推荐openssl: keytool没有提供从keystore文件导出私钥的工具,需要编程实现此功能。openssl的pem私钥,可以用pkcs8加密。
$ openssl pkcs8 -in private.key -nocrypt -topk8 -out private.p8
$ openssl pkcs8 -in private.p8 -nocrypt
>从keystore文件导出的证书、密钥都是DER格式,可以使用openssl工具转换成PEM格式。
>openssl使用的默认数据格式是PEM格式,也支持DER格式,可以进行互相转换。
## 参考资料
- [keytool exporting](http://www.herongyang.com/Cryptography/Certificate-Format-keytool-Export-in-DER-and-PEM.html)
- [keytool 和各种密钥/证书格式介绍](http://www.cnblogs.com/benwu/articles/4891758.html)