如何在Android中的SSLSocketFactory中添加信任库?

时间:2016-10-17 09:23:29

标签: android ssl


我正在使用SSL连接(不是HTTP)编写Android应用程序。我在Android上阅读了很多关于HTTPS的教程,但它保留了产品错误" SSL套接字工厂是抽象的,无法实例化。"与SSLSocketFactory sf = new SSLSocketFactory(truststore)
我的问题是:如何将密钥库添加到Android? 这是我的例子:

public void run() {
 try {
      KeyStore trusted = KeyStore.getInstance("BKS");
      InputStream in = context.getResources().openRawResource(R.raw.keystore);
       try {
           trusted.load(in, "1234567".toCharArray());
           SSLSocketFactory sSLSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); // <<<<< Line 40
           SSLSocket sslSocket = (SSLSocket) sSLSocketFactory.createSocket("10.0.2.2", 9998);
           sslSocket.startHandshake();
           Log.i("SSLsocket", "true");
            } finally {
                in.close();
            }    
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }

Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
                      at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:322)
                      at com.example.begood.voip.SSlconnection.run(SSlconnection.java:40)

1 个答案:

答案 0 :(得分:0)

根据您的trustStore尝试这样的事情:

KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(
                              KeyManagerFactory.getDefaultAlgorithm());
kmfactory.init(trustStore, "password".toCharArray());
KeyManager[] keymanagers =  kmfactory.getKeyManagers();

TrustManagerFactory tmf=TrustManagerFactory
  .getInstance(TrustManagerFactory.getDefaultAlgorithm());

tmf.init(trustStore);

SSLContext sslContext=SSLContext.getInstance("TLSv1.2");

sslContext.init(keymanagers, tmf.getTrustManagers(), new SecureRandom());

SSLSocketFactory factory=sslContext.getSocketFactory();