gpt4 book ai didi

java.security.cert.CertPathValidatorException : Trust anchor for certification path not found. Android 2.3

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:16 25 4
gpt4 key购买 nike

在我的服务器(生产服务器)中,我有一个 goDaddy ssl 证书。我有与服务器连接的 iOS 和 Android 应用程序,iOS 连接没有问题,android 版本 4.* 一切都很好,但设备为 2.3.* 我总是得到 SSLHandshakeException。

我所做的与 Android 开发者页面 (https://developer.android.com/training/articles/security-ssl.html) 完全一样。

我已经在 Stack Overflow (here) 中看到类似的线程,但没有任何帮助。

然后我看到this线程谈论扩展 key 使用,但在调试时我得到以下信息:

[2]: OID: 2.5.29.37, Critical: false
Extended Key Usage: [ "1.3.6.1.5.5.7.3.1", "1.3.6.1.5.5.7.3.2" ]

所以我猜证书不是“强制”扩展 key 使用。

也在 this 上线程还有一些其他可能的原因,例如日期/时间完全错误,这些都不存在。

考虑到这一点,我现在不知道问题出在哪里。

有什么建议吗?

编辑:下面的堆栈跟踪:

08-04 16:54:30.139: W/System.err(4832): Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
08-04 16:54:30.149: W/System.err(4832): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:161)
08-04 16:54:30.149: W/System.err(4832): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:664)
08-04 16:54:30.149: W/System.err(4832): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
08-04 16:54:30.159: W/System.err(4832): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:474)

最佳答案

我在 SO 和网络中浏览了很多地方来解决这个问题。这是对我有用的代码(Android 21):

ByteArrayInputStream derInputStream = new ByteArrayInputStream(app.certificateString.getBytes());
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509","BC");
X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream);
String alias = "alias";//cert.getSubjectX500Principal().getName();

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);
trustStore.setCertificateEntry(alias, cert);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(trustStore, null);
KeyManager[] keyManagers = kmf.getKeyManagers();

TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(trustStore);
TrustManager[] trustManagers = tmf.getTrustManagers();

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, trustManagers, null);
URL url = new URL(someURL);
conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(sslContext.getSocketFactory());

app.certificateString 是一个包含证书的字符串,例如:

static public String certificateString=
"-----BEGIN CERTIFICATE-----\n" +
"MIIGQTCCBSmgAwIBAgIHBcg1dAivUzANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UE" +
"BhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBE" +
... a bunch of characters...
"5126sfeEJMRV4Fl2E5W1gDHoOd6V==\n" +
"-----END CERTIFICATE-----";

我已经测试过你可以在证书字符串中放置任何字符,如果它是自签名的,只要你保持上面的确切结构。我使用笔记本电脑的终端命令行获取了证书字符串。如果您需要了解更多详细信息,请告诉我。

关于java.security.cert.CertPathValidatorException : Trust anchor for certification path not found. Android 2.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25122287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com