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
D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>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
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
D:\Program Files\Java\jdk1.8.0_11\jre\lib\security>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",這次搜尋到了,內容如下:
摘要資訊如下: 別名: 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
再次執行測試類,執行正常不報錯了。
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
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",這次搜尋到了,內容如下:
別名: 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