Okhttp 3(android):使用自签名的ssl连接到IP地址

Doflaminhgo

我目前正在尝试连接到没有域名且只能通过其IP地址访问的服务器。我以前曾尝试通过使用图书馆齐射来做到这一点,但是在花了一天的研究之后,我无法弄清为什么ssl握手不起作用。切换到Okhttp后,我得到了警告:

javax.net.ssl.SSLPeerUnverifiedException:主机名185.101.92.193未通过验证:
证书:sha256 / QMgPlAslWrBi1dd / P17AKxJCniO2RfHQ5MufVO5Xji4 =
DN:1.2.840.113549.1.9.1 =#1619626c61636b6a616676d92f193d92e192d90f192d92f192d90f92d90e192d90e92L1092e92d90e92L94e1e1e1e1e1e1e1e1e3e6e0b0e0b0e0b0c人=柏林,ST =柏林,C = DE
subjectAltNames:[]

现在这个问题已经在github上解决了:https : //github.com/square/okhttp/issues/1467

我已使用以下代码“解决”了该问题(请看底部的HostnameVerifier):

// loading CAs from an InputStream
        try {
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            InputStream cert = context.getResources().openRawResource(R.raw.servercert);
            Certificate ca;
            try {
                ca = cf.generateCertificate(cert);
            } finally {
                cert.close();
            }

            // creating a KeyStore containing our trusted CAs
            String keyStoreType = KeyStore.getDefaultType();
            KeyStore keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(null, null);
            keyStore.setCertificateEntry("ca", ca);

            // creating a TrustManager that trusts the CAs in our KeyStore
            String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
            tmf.init(keyStore);

            // creating an SSLSocketFactory that uses our TrustManager
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), null);
            client = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory())
                    .hostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String s, SSLSession sslSession) {
                            if(s.equals(myIPAddress)){
                                return true;
                            }else{
                                return false;
                            }
                        }
                    })
                    .build();
        }catch (Exception e){
            e.printStackTrace();
        }

现在,这对我来说似乎是一种不好的做法,我的实际问题是:像这样(从安全角度考虑)实现HostnameVerifier可能会出现什么问题,以及我如何以更复杂的方式解决此问题?

MEideh

域名与域名无关,唯一的问题是您的应用程序(android)无法验证证书,因为它是私有的(自签名证书)。您在代码中所做的只是通过覆盖SSLFactory并创建一个使用您的CA的新方法来绕过验证过程。查看以下Android文档:https : //developer.android.com/training/articles/security-ssl.html#CommonProblems

您可以继续拥有的一切。或购买证书,则完全不需要此代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章