java - 如何通过 Android 访问 SSL 连接?

标签 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 设备上修改哪些设置或文件以确保可以建立此连接?

最佳答案

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

您要特别注意它生成 KeyStore 文件的位置。

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

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

编辑 抱歉,请查看我对第一段所做的更改。

这是初始化 keystore 和信任库的部分

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);

关于java - 如何通过 Android 访问 SSL 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6441158/

相关文章:

java - 如何在查看寻呼机中的图像顶部添加文本?

c++ - 使用 Asio::read 读取单字节

java - 递归进入executePendingTransactions,即使使用getChildFragmentManager

Java - 使用 InputStream 读取行

android - 如何使用多个 ListView 和 ViewFlipper (android)

vb.net - VB套接字异常问题-端口

sockets - 连接被对等方重置 : socket write error during ftp

JFrame 上的 Java Swing 虚拟键盘

java - 为什么 EditText.getText() 的 Xamarin 等价物返回一个字符串?

android - Google play 游戏服务,确定主机或服务器