keytool查看和导入证书,使用 jre 发行包中的 cacerts 操作方法
keytool查看和导入证书,使用 jre 发行包中的 cacerts 操作方法
接上篇
支付宝调用接口openapi CY24蚂蚁集团网站新根证书升级说明
https://www.cnblogs.com/oktokeep/p/18331448
本地运行测试类报错:
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
使用 jre 发行包中的 cacerts
cacerts 文件是 Java 环境默认使用的信任根证书库,位于 %JAVA_HOME%/lib/security/目录下,cacerts 文件本质是一个JKS (Java KeyStore),可使用 Java 发行包中自带的 keytool 工具来查看和修改,默认密码为“changeit”
关键:需要定位到文件cacerts的当前目录下: D:\Program Files\Java\jdk1.8.0_11\jre\lib\security
命令如下:
keytool -list -v -keystore cacerts > mycacerts.txt
DEMO1
代码语言:javascript代码运行次数:0运行复制D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>keytool -list -v -keystore cacerts > mycacerts.txt
输入密钥库口令: changeit
Warning:
如果没有查找到怎么处理
方案1 : 添加根证书到 cacerts
keytool -keystore cacerts -importcert -alias DigiCertGlobalRootG2With2024 -file D:/alipayG2/DigiCertGlobalRootG2.crt.pem
DigiCertGlobalRootG2.crt.pem文件的下载地址:https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem
DEMO2
代码语言:javascript代码运行次数:0运行复制 D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>keytool -keystore cacerts -importcert -alias DigiCertGlobalRootG2With2024 -file D:/alipayG2/DigiCertGlobalRootG2.crt.pem
输入密钥库口令:
所有者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
发布者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
序列号: 33af1e6a711a9a0bb2864b11d09fae5
生效时间: Thu Aug 01 20:00:00 CST 2013, 失效时间: Fri Jan 15 20:00:00 CST 2038
证书指纹:
SHA1: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4
SHA256: CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
#2: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_CertSign
Crl_Sign
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 4E 22 54 20 18 95 E6 E3 6E E6 0F FA FA B9 12 ED N"T ....n.......
0010: 06 17 8F 39 ...9
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中方案2 : 升级JDK版本
正常情况下 JDK 1.6.05 及以上版本的 cacerts 应已经包含了 DigiCert Global Root CA,JDK 1.8.0 131+ 及以上版本的 cacerts 应已经包含了 DigiCert Global Root G2
导入之后,重新查询
DEMO3
代码语言:javascript代码运行次数:0运行复制D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>keytool -list -v -keystore cacerts > mycacertsV2.txt
输入密钥库口令: changeit
Warning:
代码语言:javascript代码运行次数:0运行复制摘要信息如下:
别名: digicertglobalrootg2with2024
创建日期: 2024-8-8
条目类型: trustedCertEntry
所有者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
发布者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
序列号: 33af1e6a711a9a0bb2864b11d09fae5
生效时间: Thu Aug 01 20:00:00 CST 2013, 失效时间: Fri Jan 15 20:00:00 CST 2038
证书指纹:
SHA1: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4
SHA256: CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3再次运行测试类,运行正常不报错了。
代码语言:javascript代码运行次数:0运行复制private static AlipayClient ac = null;
/**
* Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
* @return
*/
public static com.alipay.api.AlipayClient getAlipayClient(){
if(ac == null){
// com.alipay.api.AlipayClient alipayClient = new com.alipay.api.DefaultAlipayClient("https://openapi.alipay.com/gateway.do","you appid",prv_key,"JSON","utf-8",pub_key,"RSA2");
com.alipay.api.AlipayClient alipayClient = new com.alipay.api.DefaultAlipayClient("https://openapi-with-g2-only.alipay.com/gateway.do","you appid",prv_key,"JSON","utf-8",pub_key,"RSA2");
ac = alipayClient;
}
return ac;
}最后测试下高版本的jdk C:\Program Files\Java\jdk1.8.0_333 是否包含该根证书。
D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>java -version
java version "1.8.0_421"
Java(TM) SE Runtime Environment (build 1.8.0_421-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.421-b09, mixed mode)
查看环境变量的配置,JAVA_HOME路径。
C:\Program Files\Java\jdk1.8.0_333\jre\lib\security>keytool -list -v -keystore cacerts > mycacertsV3.txt
拒绝访问。
使用PowerShell客户端来访问。 >> cmd 出现在列表中,然后按下 Ctrl + Shift + Enter 快捷键,打开管理员权限的dos命令窗口。
DEMO4
代码语言:javascript代码运行次数:0运行复制C:\Program Files\Java\jdk1.8.0_333\jre\lib\security>keytool -list -v -keystore cacerts > mycacertsV3.txt
输入密钥库口令: changeit导出的mycacertsV3.txt是否包含搜素关键字 "DigiCert Global Root G2",这次搜索到了,内容如下:
代码语言:javascript代码运行次数:0运行复制别名: digicertglobalrootg2 [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry
所有者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
发布者: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
序列号: 33af1e6a711a9a0bb2864b11d09fae5
生效时间: Thu Aug 01 20:00:00 CST 2013, 失效时间: Fri Jan 15 20:00:00 CST 2038
证书指纹:
SHA1: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4
SHA256: CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3