我开始学习一个不是围绕 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 端试图向服务器验证您的身份?如果是前者,请查看此链接: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/