使用Java自带Keytool导入Https证书

JAVALINUX2016-07-11 12:02

方法(1):【使用第三方工具导入,不推荐】

转换私钥为PKCS#8格式:【需要安装openssl软件】
openssl pkcs8 -topk8 -nocrypt -outform der -in jtwo.me.key -out jtwo.me.tmpfile

下载ImportKey导入工具:【http://www.agentbob.info/agentbob/79-AB.html】
wget http://www.agentbob.info/agentbob/81/version/default/part/AttachmentData/data/ImportKey.class

导入KEY到Java_KeyStore中:【注意提示的密码】
java ImportKey jtwo.me.tmpfile jtwo.me.pub

然后在以下路径找到JSK文件:
ls ~/keystore.ImportKey

删除没用的tmpfile临时文件:
rm jtwo.me.tmpfile

方法(2):【使用JAVA自带工具导入,推荐】

步骤来自以下网址,可作参考:
http://blog.jgc.org/2011/06/importing-existing-ssl-keycertificate.html

解密私钥,若无密码则跳过【仅针对私钥被加密时操作】
openssl rsa -in host.key -out host_decrypted.key

转码PKCS12格式【JAVA可直接使用该类型证书,可不转JKS文件】
openssl pkcs12 -export -in host.crt -inkey host.key > host.pfx

生成JKS文件【JAVA专用证书类型,附注:JAVA可以直接使用PKCS12类型】
keytool -importkeystore -srcstoretype pkcs12 -srckeystore host.pfx -destkeystore host.jks

踩坑:

遇到一个奇怪现象,安卓、PC、Mac进入游戏正常,但iPhone白屏,最后查到原因是握手时断开了。
搜索网上的资料说是因为iPhone比较严格,当找不到上游的证书链时,会导致不受信就会断开连接。
所以要把证书提供商的中继证书等相关文件,使用cat命令合并到自己的公钥中,并生成受信证书。

附注:

HTTPS关键代码如下(我们最后用了PKCS12编码,没用JKS,需要的话改KeyStore.getInstance方法就行):

SSLContext sslcontext = SSLContext.getInstance("TLS");
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("pkcs12");
String keyStorePath = "/data/certificate.pfx";
String keyStorePassword = "importkey";
ks.load(new FileInputStream(keyStorePath), keyStorePassword.toCharArray());
String keyPassword = "importkey";
kmf.init(ks, keyPassword.toCharArray());
sslcontext.init(kmf.getKeyManagers(), null, null);

原文链接: http://blog.jtwo.me/using-java-keytool-import-https-cert