android - 将自签名证书加载到 HttpsUrlConnection 会破坏默认的 CA 证书验证

标签 android ssl android-volley httpsurlconnection

我正在尝试使用 HttpsUrlConnection 加载 BKS 并使用以下代码工作,但是它破坏了我其他服务器的默认 CA 证书验证。

try {
    TrustManagerFactory tmf = TrustManagerFactory
            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    KeyStore ks = KeyStore.getInstance("BKS");
    InputStream in = ctw.getResources()
            .openRawResource(R.raw.bks);
    ks.load(in, "password".toCharArray());
    in.close();
    tmf.init(ks);
    TrustManager[] tm = tmf.getTrustManagers();

    KeyManagerFactory kmf = KeyManagerFactory
            .getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(ks, "password".toCharArray());

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(kmf.getKeyManagers(), tm, null);

    HttpsURLConnection
            .setDefaultHostnameVerifier(new HostnameVerifier() {

                @Override
                public boolean verify(String hostname,
                        SSLSession session) {
                    return true;
                }
            });

    HttpsURLConnection
            .setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
    e.printStackTrace();
}

我得到的错误是:

com.android.volley.NoConnectionError:
javax.net.ssl.SSLHandshakeException:
java.security.cert.CertPathValidatorException:
Trust anchor for certification path not found.

我正在使用 Volley 库进行网络请求。是我的代码有误还是我应该修改 Volley 库?

谢谢。

最佳答案

我所做的是创建一个 CompositeTrustManager,它可以检查多个来源,包括自签名证书和默认 CA。那隐藏在the TrustManagerBuilder API后面在 my CWAC-Security library .您将使用如下代码:

new TrustManagerBuilder(this)
  .selfSigned(R.raw.bks, "password".toCharArray())
  .or()
  .useDefault();

然后调用 build() 获取处理您的自签名证书和默认 CA 的 TrustManager[]

就目前而言,您的代码替换库存 TrustManager[] 为与您的 BKS 商店相关的代码。

另一种方法是捕获失败并使用缺少自定义 TrustManager[] 的连接重试。

关于android - 将自签名证书加载到 HttpsUrlConnection 会破坏默认的 CA 证书验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24429485/

相关文章:

android - getApplicationContext()' 在非 Activity 中使用 volley 的空对象引用

Android RecyclerView StaggeredGrid 项目在滚动时改变位置

android - 在可浏览的应用程序中添加文件扩展名过滤器

wordpress - 为什么我的页面仍然不安全?

android - 使用 Android volley 发送 ByteArray

java - .NET 控制台应用程序客户端和 Java RESTful 服务之间的 TLS 客户端身份验证

使用 Openssl 和 Client Auth 连接到服务器的 Java 客户端

android - 发生自定义异常时创建强制关闭

java - 按下 Canvas 时如何调用方法

java - 使用 javamail 从 hotmail 发送?