最近公司做的项目中需要使用license机制授权,网上有开源的trueLicense,这个里边用到了keyTool生成密钥对,这里记录一下我使用keyTool过程。
1. 使用默认配置
# 生成私匙库 keytool -genkeypair -keysize 1024 -validity 3650 -alias "privateKey" -keystore "privateKeys.store" -storepass "abc123" -keypass "abcd1234" -dname "CN=catcher92, OU=catcher92, O=catcher92, L=Beijing, ST=Beijing, C=China" # 导出证书 keytool -exportcert -alias "privateKey" -keystore "privateKeys.store" -storepass "abc123" -file "certfile.cer" # 把这个证书文件导入到公匙库 keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.store" -storepass "abc123" keytool -list -keystore "privateKeys.store" -storepass "abc123" keytool -list -keystore "publicCerts.store" -storepass "abc123"
默认是JKS存储类型,以及DSA算法,其中使用DSA算法时候需要指定keysize为1024(默认为2048),否则程程以后的私钥在代码中使用会报错。使用上述方式创建密钥时候会有警告,如下所示
做为一个完美主义者,怎么会让警告存在呢,按照警告内容修改。
2.不能使用1024长度的DSA加密算法,就改成RSA算法
# 生成私匙库 keytool -genkeypair -validity 3650 -alias "privateKey" -keyalg "RSA" -keystore "privateKeys.store" -keypass "abcd1234" -storepass "abc123" -dname "CN=catcher92, OU=catcher92, O=catcher92, L=Beijing, ST=Beijing, C=China" # 导出证书 keytool -exportcert -alias "privateKey" -keystore "privateKeys.store" -storepass "abc123" -file "certfile.cer" # 把这个证书文件导入到公匙库 keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.store" -storepass "abc123" keytool -list -keystore "privateKeys.store" -storepass "abc123" keytool -list -keystore "publicCerts.store" -storepass "abc123"
通过keyalg指定算法为RSA,此时不再制定keysize即为默认的2048,这个时候还会有如下警告
3.不再使用JKS,改为PKCS12存储
# 生成私匙库 keytool -genkeypair -validity 3650 -alias "privateKey" -keystore "privateKeys.pfx" -storetype "PKCS12" -storepass "abc123" -dname "CN=catcher92, OU=catcher92, O=catcher92, L=Beijing, ST=Beijing, C=China" -keyalg "RSA" # 导出证书 keytool -exportcert -alias "privateKey" -keystore "privateKeys.pfx" -storepass "abc123" -file "certfile.cer" # 把这个证书文件导入到公匙库 keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.pfx" -storepass "abc123" -storetype "PKCS12" keytool -list -keystore "privateKeys.pfx" -storepass "abc123" keytool -list -keystore "publicCerts.pfx" -storepass "abc123"
通过storetype指定存储类型为PKCS12,通过keyalg指定算法为RSA,这个时候没有警告了,执行完很干净
4.上述使用了DSA和RSA加密算法,java还支持ECDSA,看网上的文章三者中DSA速度快 安全性没RSA高,ECDSA速度更快 安全性更高,所以我这里又改了下签名算法.
# 生成私匙库 keytool -genkeypair -validity 3650 -alias "privateKey" -keystore "privateKeys.pfx" -storetype "PKCS12" -storepass "abc123" -dname "CN=catcher92, OU=catcher92, O=catcher92, L=Beijing, ST=Beijing, C=China" -keyalg "EC" # 导出证书 keytool -exportcert -alias "privateKey" -keystore "privateKeys.pfx" -storepass "abc123" -file "certfile.cer" # 把这个证书文件导入到公匙库 keytool -import -alias "publicCert" -file "certfile.cer" -keystore "publicCerts.pfx" -storepass "abc123" -storetype "PKCS12" keytool -list -keystore "privateKeys.pfx" -storepass "abc123" keytool -list -keystore "publicCerts.pfx" -storepass "abc123"
上述命令执行时候也不会有警告。
Java代码中获取KeyStore和签名算法代码:
# KeyStore
KeyStore.getInstance("JKS");
KeyStore.getInstance("PKCS12");
# 算法
Signature.getInstance("SHA1withDSA");
Signature.getInstance("SHA1withRSA");
Signature.getInstance("SHA1withECDSA");
keytool中算法名称和java代码中算法名称映射
| keytool算法名称 | Java代码算法名称 |
| DSA | SHA1withDSA |
| RSA | SHA1withRSA |
| EC | SHA1withECDSA |



