如何通过Android访问SSL连接?

时间:2011-06-22 14:01:18

标签: java android sockets ssl ssl-certificate

我开始关注一个没有安装Android的教程并得到了这个:

    System.setProperty("javax.net.ssl.trustStore", "truststore");
    System.setProperty("javax.net.ssl.trustStorePassword", "password");

    SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
    try {
        Socket s = ssf.createSocket("192.168.2.11", 6543);
        PrintWriter out = new PrintWriter(s.getOutputStream());
        while (true){
            out.println("SSL TEST");
            Log.d("DATA", "DATA SENT");
        }



    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

我想这可以归结为几个问题:

  1. 我没有创建自己的信任库,但是在线搜索教程和内容,我不知道如何创建一个。有没有办法可以创建或修改信任存储以获得我需要的证书? (如果有任何不同,我使用的是自签名证书)

  2. 如何使SSL握手顺利运行?现在,我得到的错误是:

    javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
    

    老实说,我真的不明白这意味着什么。

  3. 我需要在Android设备上修改哪些设置或文件以确保可以进行此连接?

2 个答案:

答案 0 :(得分:11)

1)这取决于。您是否在服务器端拥有自签名证书,并且您正在尝试验证您的身份到Android设备?或者你是否在android端试图验证你的服务器的理由?如果是前者,请参阅此链接:http://www.codeproject.com/KB/android/SSLVerification_Android.aspx?display=Mobile

您需要特别注意它创建KeyStore文件的位置。

2)您收到该错误的原因是因为它不信任您正在连接的服务器,因为您没有正确创建信任库或者您正在连接到尚未将证书添加到信任库的服务器。你究竟要连接到什么?

3)确保manifest.xml中有<uses-permission android:name="android.permission.INTERNET" />

修改 很抱歉,请看我对第一段所做的更改。

以下是初始化密钥库和信任库

的部分
SSLcontext sslContext = SSLContext.getDefault();

KeyStore trustSt = KeyStore.getInstance("BKS");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
InputStream trustStoreStream = this.getResources().openRawResource(R.raw.truststore);
trustSt.load(trustStoreStream, "<yourpassword>".toCharArray());
trustManagerFactory.init(trustStre);

KeyStore keyStore = KeyStore.getInstance("BKS");
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
InputStream keyStoreStream = this.getResources().openRawResource(R.raw.keystore);
keyStore.load(keyStoreStream, "<yourpassword>".toCharArray());
keyManagerFactory.init(keyStore, "<yourpassword>".toCharArray());

sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

答案 1 :(得分:1)

除非对等方使用自签名证书,否则您不需要自己的信任库。 JRE附带一个默认使用的信任库,它信任所有主要CA颁发的证书。