安卓忽略自签名证书

3

我的安卓应用正在连接到https自签名服务器,使用客户端证书(.cer文件)可以正常工作。

如果不使用客户端证书,安卓应用可以连接到https自签名服务器吗?--> 如果是肯定的,那么可以使用哪个库实现。我知道这不是最好的方法来实现,但这正是我需要的。


只需关闭 SSL 证书检查,但如果不知道您使用的连接方式,无法告诉您如何操作。 - Nanoc
keyStore.setCertificateEntry("ca", ca); String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keyStore);// 创建一个使用我们的TrustManager的SSLContext SSLContext context = SSLContext.getInstance("TLS"); context.init(null, tmf.getTrustManagers(), null); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); - Ravi
以上是我使用HTTPS连接到我的URL的方法。 - Ravi
然后只需像这样创建一个空的TrustManager:https://dev59.com/questions/CnM_5IYBdhLWcg3w2XFg - Nanoc
请看我在这里的回答,它也适用于你的要求 https://dev59.com/G47da4cB1Zd3GeqP9itu#32051885?s=0|3.1960#32051885。然而,在我看来,使用证书文件会更好,不是吗? - BNK
我的HTTPS服务器不需要双向认证,因此客户端不需要任何证书。HTTPS服务器为:- https://<ip地址>那么上面的答案对于这个也是正确的吗? - Ravi
1个回答

8

您可以使用Volley Android库来实现此操作。

您需要在应用程序类的onCreate()中添加以下代码。通过覆盖X509Certificate,您将接受所有证书。

try {
        TrustManager[] victimizedManager = new TrustManager[]{

                new X509TrustManager() {

                    public X509Certificate[] getAcceptedIssuers() {

                        X509Certificate[] myTrustedAnchors = new X509Certificate[0];

                        return myTrustedAnchors;
                    }

                    @Override
                    public void checkClientTrusted(X509Certificate[] certs, String authType) {
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] certs, String authType) {
                    }
                }
        };

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, victimizedManager, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }

我的HTTPS服务器不需要双向认证,因此客户端不需要任何证书。HTTPS服务器为:https://<ip地址> 那么上面的答案对于这个问题也是正确的吗? - Ravi
1
这在Android N上不起作用,需要显式声明您的自签名证书。 - IgorGanapolsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接