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 FilesJavajdk1.8.0_11jrelibsecurity 命令如下: keytool -list -v -keystore cacerts > mycacerts.txt
DEMO1
代码语言:javascript复制D:Program FilesJavajdk1.8.0_11jrelibsecurity>keytool -list -v -keystore cacerts > mycacerts.txt
输入密钥库口令: changeit
Warning:
<thawtepremiumserverca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<thawteserverca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<equifaxsecureebusinessca1> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<thawtepersonalfreemailca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<equifaxsecureca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<secomvalicertclass1ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<equifaxsecureglobalebusinessca1> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass3ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass1ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass3g2ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<gtecybertrustglobalca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisigntsaca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<valicertclass2ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass2g2ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<entrustsslca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass1g2ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
导出的mycacerts.txt是否包含搜素关键字 "DigiCert Global Root G2" 如果没有查找到怎么处理 方案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复制 D:Program FilesJavajdk1.8.0_11jrelibsecurity>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复制D:Program FilesJavajdk1.8.0_11jrelibsecurity>keytool -list -v -keystore cacerts > mycacertsV2.txt
输入密钥库口令: changeit
Warning:
<thawtepremiumserverca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<thawteserverca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<equifaxsecureebusinessca1> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<thawtepersonalfreemailca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<equifaxsecureca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<secomvalicertclass1ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<equifaxsecureglobalebusinessca1> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass3ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass1ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass3g2ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<gtecybertrustglobalca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisigntsaca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<valicertclass2ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass2g2ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<entrustsslca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
<verisignclass1g2ca> 使用的 1024 位 RSA 密钥 被视为存在安全风险。此密钥大小将在未来的更新中被禁用。
导出的mycacertsV2.txt是否包含搜素关键字 "DigiCert Global Root G2",这次搜索到了,内容如下:
代码语言:javascript复制摘要信息如下:
别名: 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复制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 FilesJavajdk1.8.0_333 是否包含该根证书。 D:Program FilesJavajdk1.8.0_11jrelibsecurity>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 FilesJavajdk1.8.0_333jrelibsecurity>keytool -list -v -keystore cacerts > mycacertsV3.txt 拒绝访问。
使用PowerShell客户端来访问。 >> cmd 出现在列表中,然后按下 Ctrl Shift Enter 快捷键,打开管理员权限的dos命令窗口。
DEMO4
代码语言:javascript复制C:Program FilesJavajdk1.8.0_333jrelibsecurity>keytool -list -v -keystore cacerts > mycacertsV3.txt
输入密钥库口令: changeit
导出的mycacertsV3.txt是否包含搜素关键字 "DigiCert Global Root G2",这次搜索到了,内容如下:
代码语言:javascript复制别名: 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