【问题标题】:Android self-signed client side CA certificate authentication failsAndroid自签名客户端CA证书认证失败
【发布时间】:2018-08-02 13:45:52
【问题描述】:

Android自签名客户端CA证书身份验证失败,谁能分享他们处理类似问题的经验?使用相同的凭据,我们可以使用 CURL 客户端让它工作。

我们关注了this GIST,但我们无法通过它。

这只是导致我们抛出了这个异常:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:374)

【问题讨论】:

  • 你用的是哪个安卓版本?
  • 我使用的是 API 23 级别的设备

标签: android authentication ssl certificate ca


【解决方案1】:

试试下面的代码

// Input stream for self signed CA certificate
InputStream caIs = getInputStream(caCert);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(caIs);
String alias = certificate.getSubjectX500Principal().getName();
Log.d(TAG, String.format("Alias: %s", alias));

// KeyStore for trusted CA certificate(s)
KeyStore trustedStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustedStore.load(null);
trustedStore.setCertificateEntry(alias, certificate);

// Create trust managers to be used for connecting to servics(s)
TrustManagerFactory tmf =  TrustManagerFactory.getInstance("X509");
tmf.init(trustedStore);
TrustManager[] trustManagers = tmf.getTrustManagers();

// KeyStore for X.509 certificate/key
KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream clientIs = getInputStream(clientKeyCert);
keyStore.load(clientIs, "password".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(keyStore, "password".toCharArray());

// Create key managers to be uses for connecting to service(s)
KeyManager[] keyManagers = kmf.getKeyManagers();

// Create the SSL context
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, trustManagers, null);

// Test by connecting ta server proteced by self signed certificate
OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory()).build();
Call call = client.newCall(new Request.Builder().url("https://testurl.com").build());
Response response = call.execute();
Log.d(TAG, response.message());

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2018-09-21
    • 2013-07-14
    • 2022-01-07
    • 1970-01-01
    • 2015-08-06
    • 2010-10-30
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多