当前位置: 首页 > 知识库问答 >
问题:

在android牛轧糖中使用自签名证书通过https连接时出现SSL握手异常

孟意致
2023-03-14

在我的android应用程序中,我通过HTTPS连接。我正在使用自签名证书进行连接。它适用于api级别24以下的设备(在android牛轧糖之前)。但是在android牛轧糖上,它会抛出SSL握手异常:

SSLContext context = null;
    try 
    {
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        // Get the raw resource, which contains the keystore with
        // your trusted certificates (root and any intermediate certs)
        InputStream input = new BufferedInputStream(context.getAssets().open(pkcsFilename));
        try {
            // Initialize the keystore with the provided trusted certificates
            // Also provide the password of the keystore
            keyStore.load(input, password.toCharArray());
        } finally {
            input.close();
        }

        KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyFactory.init(keyStore, "".toCharArray());

        // Load CAs from an InputStream
        // (could be from a resource or ByteArrayInputStream or ...)
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        Certificate ca = null;
        input = new BufferedInputStream(context.getAssets().open(certificateFilename));
        try 
        {
            ca = cf.generateCertificate(input);
        }
        finally
        {
            input.close();
        }
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);
        trustStore.setCertificateEntry("server", ca);

        // Create a TrustManager that trusts the CAs in our KeyStore
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(trustStore);

        // Create an SSLContext that uses our TrustManager
        context = SSLContext.getInstance("TLS");
        context.init(keyFactory.getKeyManagers(), tmf.getTrustManagers(), null);

        HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();

这是我的网络配置文件。我已经在我的AndroidManifest.xml文件中添加了它。

    <?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">xyz.com</domain>
        <trust-anchors>
        <certificates src="@raw/root_ca" />
        </trust-anchors>
    </domain-config>
</network-security-config>

请帮我解决这个问题。

共有1个答案

章彬郁
2023-03-14

我通过添加一个自定义信任管理器使其工作。初始化SSL上下文时Context.init(keyfactory.getKeyManager(),tmf.getTrustManager(),null);

I modified it as :

context.init(keyFactory.getKeyManagers(), new TrustManager[] { tm }, null);
TrustManager tm = new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }

                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    for (int j=0; j<chain.length; j++)
                    {
                        chain[j].checkValidity();
                        try {
                            chain[j].verify(ca.getPublicKey());
                        } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchProviderException |
                                SignatureException e) {
                            e.printStackTrace();
                            throw new CertificateException(e.getMessage());
                        }
                    }
                }

                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };

我用服务器证书验证证书。现在起作用了。

 类似资料:
  • 问题内容: 我的任务是实现一个定制/独立的Java Web服务器,该服务器可以在同一端口上处理SSL和非SSL消息。 我已经实现了NIO服务器,并且对于非SSL请求,它可以很好地工作。我在SSL方面花了很长时间,可以真正使用一些指导。 到目前为止,这是我所做的。 为了区分SSL消息和非SSL消息,我检查了入站请求的第一个字节,看看它是否是SSL / TLS消息。例: 在parseTLS()方法中,

  • 问题内容: 我正在运行使用使用自签名CA证书创建的证书的https服务器。 现在,我想将Socket.io客户端连接到连接到https服务器的Socket.io服务器。不幸的是,我得到一个错误,告诉我: 基本上,此错误告诉我无法成功验证证书。这是由于相应的CA证书是自签名的。使用https请求时,我可以指定我信任的CA。 在这种情况下,如何使Socket.io连接? PS:我正在运行Node.js

  • 例外 片段点击:- 在活动中, 详细活动清单, 图像加载使用毕加索, 模型类 从活动到片段的数据流, 我尝试过的解决方案 注意:-应用程序崩溃只在NOUGAT 最后,我实现了修复 将targetSdkVersion从25更改为23 更改后,我的应用程序在牛轧糖也不会崩溃。 我所要知道的就是这个合适的解决方案,或者有什么变通办法。 请引导到正确的方式。 提前谢谢。 碎片 选项卡布局 列表视图

  • 我试图抓取一个网页(这一个)使用J汤库。在执行简单的GET操作时,我得到了以下异常: 这是JsoupParser的内容。解析方法: 起初,我认为这是由于缺少密码套件造成的,但后来我发现这个异常是由于JDK 1.8u141之前版本中的一个错误造成的。我尝试使用JDK1.8u191,一切正常,但是当我使用JDK11时,上面的异常再次出现。我还缺什么吗?谢谢你的帮助。 当我使用早期访问jdk 12时,这

  • 问题内容: 我正在连接到以前成功使用过的Web服务,但是现在他们已经更改了主机名并向我发送了两个.pem文件。一个是CA,另一个是我的新客户证书。 (我将Java 1.5,Spring + Spring Web Services与Apache httpclient一起使用,但是我怀疑我的问题是证书,密钥和SSL本身。) 我已经导入了.pem文件以及从Firefox导出到cacerts中的主机的.c

  • 问题内容: 我正在尝试将Android应用连接到使用自签名证书的启用SSL的服务器。我已经阅读了数十个教程,并且该应用程序现在正在接受证书并连接到服务器,但是我再也收不到任何数据。 我用来初始化套接字的原始代码是这样的: 之后,接收器线程的运行循环使用 socket.getInputStream() 访问输入流。只要我使用未加密的连接,它就可以正常工作。但是安全连接不会从套接字 检索任何数据 。我