ssl证书如何转为java.security.KeyStore
?
ssl证书是crt格式的,或者是.pem格式的,如何转为java.security.KeyStore
能读取的格式?
java.security.KeyStore
是java中用来加载并存储证书的库类,即CA机构返回的.pem格式的证书是不能直接供java代码加载使用的,必须要先转化为java.security.KeyStore
能识别的格式,转化时利用的是keytool命令,转为.store格式的文件(原项目中使用的格式)或者.keystore格式的文件(我自己转换时是转为.keystore这种格式,因为转为.store格式时会报错:Wrong version of key store.
),然后再使用java.security.KeyStore
类进行加载这种格式的文件。
利用keytool命令生成keystore文件:
当前位于~/certs目录下,目录下有coming.pem、coming.key、coming.crt文件。
其中coming.pem(证书)、coming.key(私钥)是在CA机构申请证书成功后会发送给我们的,而coming.crt是自己利用openssl工具根据coming.pem转化生成的证书,因为某些服务器的ssl证书配置需要是.crt格式的证书,所以使用openssl工具转化成一份coming.crt格式的证书(后来测试时发现好像直接把coming.pem改为.crt后缀,即改为coming.crt的也可以,不需要利用openssl工具转换)。
~/certs$ keytool -import -v -alias coming.store -file coming.pem -keystore coming.store
输入密钥库口令:
再次输入新口令:
所有者: CN=*.coming.chat
发布者: CN=Encryption Everywhere DV TLS CA - G1, OU=www.digicert.com, O=DigiCert Inc, C=US
序列号: b3763c204417714a971232e1fffc87f
生效时间: Mon May 17 08:00:00 CST 2021, 失效时间: Wed May 18 07:59:59 CST 2022
证书指纹:
SHA1: A5:B2:DE:D1:93:E1:95:23:18:4D:B1:8C:F2:2A:55:47:0B:7D:D0:EF
SHA256: FB:0D:63:17:1E:8E:FA:06:93:4A:9A:FD:35:1F:5C:9A:4B:EB:C4:CB:62:3D:7A:31:F3:1E:BA:05:9A:30:76:62
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Criticality=false
0000: 04 82 01 68 01 66 00 75 00 29 79 BE F0 9E 39 39 ...h.f.u.)y...99
0010: 21 F0 56 73 9F 63 A5 77 E5 BE 57 7D 9C 60 0A F8 !.Vs.c.w..W..`..
0020: F9 4D 5D 26 5C 25 5D C7 84 00 00 01 79 78 3A 1B .M]&\%].....yx:.
0030: F5 00 00 04 03 00 46 30 44 02 20 21 3A D7 B4 55 ......F0D. !:..U
0040: 30 6A 79 82 72 5A A5 27 FC 34 C9 25 89 AA E8 7C 0jy.rZ.'.4.%....
0050: 93 AF 68 A8 CE 4A 4E 65 6E 46 9E 02 20 1C F4 2A ..h..JNenF.. ..*
0060: 8F 0D 8E D6 E7 58 9B 57 FC 98 7C E2 62 E6 B7 58 .....X.W....b..X
0070: 9D AD 79 EC 78 20 D7 DC F2 B9 C1 AF E5 00 75 00 ..y.x ........u.
0080: 22 45 45 07 59 55 24 56 96 3F A1 2F F1 F7 6D 86 "EE.YU$V.?./..m.
0090: E0 23 26 63 AD C0 4B 7F 5D C6 83 5C 6E E2 0F 02 .#&c..K.]..\n...
00A0: 00 00 01 79 78 3A 1C 43 00 00 04 03 00 46 30 44 ...yx:.C.....F0D
00B0: 02 20 42 39 0F FC 86 B5 BF 05 2B 9D 2E 74 24 3B . B9......+..t$;
00C0: 1D 0B E5 C1 48 4C B1 92 54 3E 3F 0E 5E C4 2B 28 ....HL..T>?.^.+(
00D0: 1C B1 02 20 13 BC EF 37 28 30 D3 19 93 54 E9 27 ... ...7(0...T.'
00E0: 7C BF A4 AF F8 C0 87 07 B0 43 A1 FC 9B 18 80 D6 .........C......
00F0: 18 B4 9D E1 00 76 00 51 A3 B0 F5 FD 01 79 9C 56 .....v.Q.....y.V
0100: 6D B8 37 78 8F 0C A4 7A CC 1B 27 CB F7 9E 88 42 m.7x...z..'....B
0110: 9A 0D FE D4 8B 05 E5 00 00 01 79 78 3A 1C 76 00 ..........yx:.v.
0120: 00 04 03 00 47 30 45 02 20 2F A9 DE AE 54 A2 1A ....G0E. /...T..
0130: 0F 7E 50 A8 D6 E3 A9 2A 19 FC 8D AC 79 B8 44 7D ..P....*....y.D.
0140: 53 82 3D 3A 9C BE 14 17 A9 02 21 00 A4 3C 45 AF S.=:......!..<E.
0150: 71 A6 6A AC 4B 1B 9B C4 57 78 2A 46 8F 0C BD 8F q.j.K...Wx*F....
0160: 16 67 84 D7 A7 55 00 35 B9 FC 86 0C .g...U.5....
#2: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
[
accessMethod: ocsp
accessLocation: URIName: http://ocsp.digicert.com
,
accessMethod: caIssuers
accessLocation: URIName: http://cacerts.digicert.com/EncryptionEverywhereDVTLSCA-G1.crt
]
]
#3: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 55 74 4F B2 72 4F F5 60 BA 50 D1 D7 E6 51 5C 9A UtO.rO.`.P...Q\.
0010: 01 87 1A D7 ....
]
]
#4: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:false
PathLen: undefined
]
#5: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [2.23.140.1.2.1]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 1B 68 74 74 70 3A 2F 2F 77 77 77 2E 64 69 67 ..http://www.dig
0010: 69 63 65 72 74 2E 63 6F 6D 2F 43 50 53 icert.com/CPS
]] ]
]
#6: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
serverAuth
clientAuth
]
#7: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_Encipherment
]
#8: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: *.coming.chat
DNSName: coming.chat
]
#9: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 41 73 E6 2B 72 CA D4 4A 4F 0F CD 27 5A CE 31 47 As.+r..JO..'Z.1G
0010: 04 68 2E 94 .h..
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
[正在存储coming.store]
执行 keytool -import
指令后会提示输入秘钥的口令(即密码),输入口令后会提示是否信任此证书,输入Y,回车,生成keystore文件。
生成的coming.store导入app后,运行app,报错:
...
Caused by: java.io.IOException: Wrong version of key store.
at com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi.engineLoad(BcKeyStoreSpi.java:819)
at java.security.KeyStore.load(KeyStore.java:1484)
at org.whispersystems.signalservice.internal.util.BlacklistingTrustManager.createFor(BlacklistingTrustManager.java:58)
at org.whispersystems.signalservice.internal.push.PushServiceSocket.createConnectionClient(PushServiceSocket.java:2016)
...
由于app加载KeyStore时获取的是BKS类型的KeyStore实例:
public static TrustManager[] createFor(TrustStore trustStore) {
try {
InputStream keyStoreInputStream = trustStore.getKeyStoreInputStream();
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(keyStoreInputStream, trustStore.getKeyStorePassword().toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
trustManagerFactory.init(keyStore);
...
所以生成的keystore也要是BKS类型的。
执行 keytool -import
命令时加上-storetype BKS
参数:
keytool -import -alias coming.store -file coming.crt -keystore coming.store -storepass coming -storetype BKS
报错:
keytool 错误: java.security.KeyStoreException: BKS not found
需要bcprov-jdk15on-168.jar拷贝到JDK安装目录的lib目录下
去官网https://www.bouncycastle.org/latest_releases.html下载:bcprov-jdk15on-168.jar
下载完成后拷贝到/usr/lib/jvm/java-8-openjdk-amd64/lib
目录和/usr/lib/jvm/java-8-openjdk-amd64/jre/lib
目录下:
~/下载$ sudo cp bcprov-jdk15on-168.jar /usr/lib/jvm/java-8-openjdk-amd64/lib
~/下载$ sudo cp bcprov-jdk15on-168.jar /usr/lib/jvm/java-8-openjdk-amd64/jre/lib
更新用户目录下的.bashrc,添加如下内容:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/bcprov-jdk15on-168.jar:$JAVA_HOME/jre/lib/bcprov-jdk15on-168.jar
再次执行
keytool -import -alias coming.store -file coming.crt -keystore coming.store -storepass coming -storetype BKS
报错:
keytool 错误: java.security.KeyStoreException: BKS not found
于是参考:
keytool生成BKS格式的私钥和信任证书
将 bcprov-jdk15on-168.jar 复制到 %JDK_HOME%\jre\lib\ext 下
然后在%JDK_HOME%\jre\lib\security\java.security,往最后添加,前面已经有10个了
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
再次执行
keytool -import -alias coming.store -file coming.pem -keystore coming.store -storepass coming -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
报错:
$ keytool -import -alias coming.store -file coming.pem -keystore coming.store -storepass coming -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
keytool 错误: java.io.IOException: Wrong version of key store.
注意这次不是报错:
keytool 错误: java.security.KeyStoreException: BKS not found
而是报错:
keytool 错误: java.io.IOException: Wrong version of key store.
说明BKS已经可以成功获取。
修改keytool -import
命令为:
keytool -import -alias coming.store -file coming.pem -keystore coming.keystore -storepass coming -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
即将参数-keystore coming.store
改为-keystore coming.keystore
执行结果:
所有者: CN=*.coming.chat
发布者: CN=Encryption Everywhere DV TLS CA - G1, OU=www.digicert.com, O=DigiCert Inc, C=US
序列号: b3763c204417714a971232e1fffc87f
有效期为 Mon May 17 08:00:00 CST 2021 至 Wed May 18 07:59:59 CST 2022
证书指纹:
MD5: 50:88:04:FB:E9:D6:94:2B:1F:90:90:04:0C:F2:5D:33
SHA1: A5:B2:DE:D1:93:E1:95:23:18:4D:B1:8C:F2:2A:55:47:0B:7D:D0:EF
SHA256: FB:0D:63:17:1E:8E:FA:06:93:4A:9A:FD:35:1F:5C:9A:4B:EB:C4:CB:62:3D:7A:31:F3:1E:BA:05:9A:30:76:62
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Criticality=false
0000: 04 82 01 68 01 66 00 75 00 29 79 BE F0 9E 39 39 ...h.f.u.)y...99
0010: 21 F0 56 73 9F 63 A5 77 E5 BE 57 7D 9C 60 0A F8 !.Vs.c.w..W..`..
0020: F9 4D 5D 26 5C 25 5D C7 84 00 00 01 79 78 3A 1B .M]&\%].....yx:.
0030: F5 00 00 04 03 00 46 30 44 02 20 21 3A D7 B4 55 ......F0D. !:..U
0040: 30 6A 79 82 72 5A A5 27 FC 34 C9 25 89 AA E8 7C 0jy.rZ.'.4.%....
0050: 93 AF 68 A8 CE 4A 4E 65 6E 46 9E 02 20 1C F4 2A ..h..JNenF.. ..*
0060: 8F 0D 8E D6 E7 58 9B 57 FC 98 7C E2 62 E6 B7 58 .....X.W....b..X
0070: 9D AD 79 EC 78 20 D7 DC F2 B9 C1 AF E5 00 75 00 ..y.x ........u.
0080: 22 45 45 07 59 55 24 56 96 3F A1 2F F1 F7 6D 86 "EE.YU$V.?./..m.
0090: E0 23 26 63 AD C0 4B 7F 5D C6 83 5C 6E E2 0F 02 .#&c..K.]..\n...
00A0: 00 00 01 79 78 3A 1C 43 00 00 04 03 00 46 30 44 ...yx:.C.....F0D
00B0: 02 20 42 39 0F FC 86 B5 BF 05 2B 9D 2E 74 24 3B . B9......+..t$;
00C0: 1D 0B E5 C1 48 4C B1 92 54 3E 3F 0E 5E C4 2B 28 ....HL..T>?.^.+(
00D0: 1C B1 02 20 13 BC EF 37 28 30 D3 19 93 54 E9 27 ... ...7(0...T.'
00E0: 7C BF A4 AF F8 C0 87 07 B0 43 A1 FC 9B 18 80 D6 .........C......
00F0: 18 B4 9D E1 00 76 00 51 A3 B0 F5 FD 01 79 9C 56 .....v.Q.....y.V
0100: 6D B8 37 78 8F 0C A4 7A CC 1B 27 CB F7 9E 88 42 m.7x...z..'....B
0110: 9A 0D FE D4 8B 05 E5 00 00 01 79 78 3A 1C 76 00 ..........yx:.v.
0120: 00 04 03 00 47 30 45 02 20 2F A9 DE AE 54 A2 1A ....G0E. /...T..
0130: 0F 7E 50 A8 D6 E3 A9 2A 19 FC 8D AC 79 B8 44 7D ..P....*....y.D.
0140: 53 82 3D 3A 9C BE 14 17 A9 02 21 00 A4 3C 45 AF S.=:......!..<E.
0150: 71 A6 6A AC 4B 1B 9B C4 57 78 2A 46 8F 0C BD 8F q.j.K...Wx*F....
0160: 16 67 84 D7 A7 55 00 35 B9 FC 86 0C .g...U.5....
#2: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
[
accessMethod: ocsp
accessLocation: URIName: http://ocsp.digicert.com
,
accessMethod: caIssuers
accessLocation: URIName: http://cacerts.digicert.com/EncryptionEverywhereDVTLSCA-G1.crt
]
]
#3: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 55 74 4F B2 72 4F F5 60 BA 50 D1 D7 E6 51 5C 9A UtO.rO.`.P...Q\.
0010: 01 87 1A D7 ....
]
]
#4: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:false
PathLen: undefined
]
#5: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [2.23.140.1.2.1]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 1B 68 74 74 70 3A 2F 2F 77 77 77 2E 64 69 67 ..http://www.dig
0010: 69 63 65 72 74 2E 63 6F 6D 2F 43 50 53 icert.com/CPS
]] ]
]
#6: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
serverAuth
clientAuth
]
#7: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_Encipherment
]
#8: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: *.coming.chat
DNSName: coming.chat
]
#9: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 41 73 E6 2B 72 CA D4 4A 4F 0F CD 27 5A CE 31 47 As.+r..JO..'Z.1G
0010: 04 68 2E 94 .h..
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
生成成功!
将生成的coming.keystore导入Android 项目的res/raw 目录下,运行app,https请求验证成功!
过程主要参考了:
keytool生成BKS格式的私钥和信任证书
keytool 生成 Android SSL 使用的 BKS
的操作步骤。
.crt、.key、.pem、.cer格式的证书的区别
SSL证书中的.key.cer.crt格式分别是什么文件
后缀名cer和crt的不同之处,为什么申请证明书之后要把后缀名从cer改为crt?
keytool命令生成的keystore默认是jks格式还是bks格式?
jks与bks的区别
bks 是 BouncyCastle 私有密钥库类型,BouncyCastle就是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法,例如,RipeMD160哈希算法。
BouncyCastle官网:https://www.bouncycastle.org/latest_releases.html
BouncyCastle的更多介绍参看:
BouncyCastle
keytool命令如何生成BKS格式的keystore?
openssl
OpenSSL是一款开源工具包,用于实现安全套接层(SSL)和传输层安全(TLS)协议。
OpenSSL是用于传输层安全(TLS)协议(以前称为安全套接字层(SSL)协议)的健壮,商业级,功能齐全的开源工具包。 协议实现基于一个完整功能的通用密码库libcrypto,libcrypto也可以独立使用。OpenSSL包含一个命令行工具用来完成OpenSSL库中的所有功能。
OpenSSL源自Eric A. Young和Tim J. Hudson开发的SSLeay库。
OpenSSL项目的官方主页是:https://www.openssl.org/
目录
总览
OpenSSL工具箱包括:
libssl
是TLSv1.3( )之前的所有TLS协议版本的实现。
libcrypto
一个功能全面的通用密码库。 它构成了TLS实施的基础,但也可以独立使用。
openssl
OpenSSL命令行工具,瑞士军刀,用于加密任务,测试和分析。 它可以用于
- 关键参数的创建
- X.509证书,CSR和CRL的创建
- 消息摘要的计算
- 加密和解密
- SSL / TLS客户端和服务器测试
- 处理S / MIME签名或加密的邮
https://github.com/openssl/openssl
https://gitee.com/mirrors/openssl?utm_source=alading&utm_campaign=repo
参考:
在Android应用中使用客户端证书进行HTTPS连接
在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互
Android : 关于HTTPS、TLS/SSL认证以及客户端证书导入方法
证书导出:
如何从浏览器导出HTTPS证书
导出https网站证书
证书转为keystore:
如何把安全证书导入到java中的cacerts证书库(转)
如何把安全证书导入到java中的cacerts证书库
使用openssl创建ssl证书 并转换为keystore
如何用已有的证书文件和私钥文件生成keystore
如何用Java代码来把SSL的证书自动导入到Java的秘钥存储文件(keystore)
Android BKS 格式证书制作,JKS 制作 BKS,解决 java.security.KeyStoreException: JKS not found 问题
如何生成android的BKS证书
android load BKS error: wrong version of key store
Wrong version of keystore on android call
java.io.IOException: Wrong version of key store. using SpongyCastle
kafka使用SSL加密和认证
Android 证书问题,求指导,万分感谢。报错提示:java.io.IOException: Wrong version of key store
java.io.IOException异常:密钥存储的版本错误。使用SpongyCastle(java.io.IOException: Wrong version of key store. using SpongyCastle)
Android: java.io.IOException: Wrong Version of key store
keytool生成BKS格式的私钥和信任证书
keytool 生成 Android SSL 使用的 BKS
求助,java 实现ssl双向认证,bks not found
keytool错误:java.security.KeyStoreException:找不到BKS(keytool error: java.security.KeyStoreException: BKS not found)