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证书,编码不同。

DER格式与PEM格式的证书.png

备忘

密钥管理更加推荐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)