使用Java自带Keytool导入Https证书

Published: Tags: JAVA LINUX

方法(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专用证书类型,如果无法解析PFX格式证书,可以尝试转换】 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);