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

我开始遵循一个不在 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();
    }

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

>我没有创建自己的信任商店,但是在线搜索教程和内容,我不知道如何创建一个.有没有办法创建或修改信托商店以获得我需要的证书? (如果有任何差异,我正在使用自签名证书)
>如何使SSL握手顺利运行?现在,我得到的错误是:

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

老实说,我真的不明白这是什么意思.
>我的Android设备需要修改哪些设置或文件,以确保此连接可以发生?

解决方法

1)这取决于您是否在服务器端具有自签名证书,并且您尝试验证您的身份到Android设备?或者您是否在Android端尝试验证您的idendity到服务器?如果是前者,那么请看这个链接http://www.codeproject.com/KB/android/SSLVerification_Android.aspx?display=Mobile

您要特别注意KeyStore文件的位置.

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

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

编辑
我的道歉请看我对第一段的修改.

这是初始化您的密钥库和信任库的部分

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...