让OkHttp接受自签名证书

时间:2016-02-16 08:28:32

标签: android ssl ssl-certificate okhttp3

我成功地让服务器以JKS文件的形式使用证书。当与Web浏览器和其他Web客户端一起使用时,HTTPS正如预期的那样工作。

对于Android,我的团队使用以下内容说服OkHttp接受证书。

static KeyStore readKeyStore() throws KeyStoreException, CertificateException, NoSuchAlgorithmException
    {
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

        // get user password and file input stream
        char[] password = "password".toCharArray();

        java.io.InputStream fis = null;
        try {
            fis = ServiceProducer.class.getClassLoader().getResourceAsStream("res/raw/keystore.jks");
            ks.load(fis, password);
        } catch (IOException e)
        {

        } finally
        {
            if (fis != null)
            {
                try
                {
                    fis.close();
                } catch (IOException e)
                {
                }
            }

        }
        return ks;
    }

使用密钥的代码:

OkHttpClient.Builder builder = new  OkHttpClient.Builder();
                KeyStore keyStore = readKeyStore();
                SSLContext sslContext = SSLContext.getInstance("SSL");
                TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                trustManagerFactory.init(keyStore);
                KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                keyManagerFactory.init(keyStore, "password".toCharArray());
                sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
                builder.sslSocketFactory(sslContext.getSocketFactory());
                OkHttpClient client = builder.build();

                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("https://192.168.5.91:9443")
                        .addConverterFactory(JacksonConverterFactory.create())
                        .client(client)
                        .build();

但是,访问该服务会引发以下异常:

java.security.cert.CertPathValidationException: Trust anchor for certification path not found.

我们是否正确完成了证书安装?或者我们面临着不同的问题?

0 个答案:

没有答案