Android将ssl证书加入到客户端app中

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 2021Wed 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)

Keytool命令详解

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

BouncyCastle

求助,java 实现ssl双向认证,bks not found
keytool错误:java.security.KeyStoreException:找不到BKS(keytool error: java.security.KeyStoreException: BKS not found)

openssl:TLSSSL和加密库-源码

鲜花售卖App应用程序在当前时代非常受欢迎,而基于Android Studio的鲜花售卖App开发措施也有着非常显著的发展趋势。在这样的时代背景下,开发一个鲜花售卖App应用程序就显得非常重要。 鲜花售卖App应用程序需要经过严格的开发流程。首先需要定义一个合适的开发计划,并确定坚固的基础架构。随后就可以开始着手开发实际代码。 在开发鲜花售卖App应用程序,需具备以下4个主要模块: 1.用户界面模块:应用程序的界面应该是用户友好的,界面设计应该兼顾美观性和易用性。界面设计的元素应该是直观的,并且不应该让用户感到担忧,应该顺畅地完成付款和下订单的过程等等。 2.客户端模块:客户端是鲜花售卖App应用程序最重要的组成部分之一,它必须是完全优化的,充分满足各种需求。客户端模块需要支持各种操作,并且应该从技术上支持用户交互。 3.服务器端和数据库:服务器和数据库是整个应用程序的基石,必须经过严格的开发和测试,以确保数据的安全性和及时性。服务器必须使用SSL协议进行数据传输。 4.支付收款模块:这个模块主要是为支付系统服务的。在这个模块,需要集成支付模块,以确保付款过程的便捷和安全。 最终,在开发鲜花售卖App应用程序的整个过程,需要与业务团队保持紧密联系,因为他们最了解客户的需求。在生产应用程序的过程,需要将业务团队的需求整合到应用程序,以确保该应用程序的准确性和可用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值