bab*_*boo 6 sockets ssl android sni
我正在尝试使用SSLCertificateSocketFactory.setHostname添加SNI支持,通过wireshark我看到客户端和启用SNI的服务器之间的通信,CLIENT HELLO进入服务器(设置了正确的主机名),Server响应Server Hello并将证书发送给客户端但是在那之后客户端没有发送证书和通信/握手停止,通过openssl命令openssl s_client -connect theclient -servername thehostname -cert thecertificate一切顺利,握手成功发生..
我正在使用套接字和socket.startHandshake我得到异常:IOException:javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚.
final SSLCertificateSocketFactory sslSocketFactory = (SSLCertificateSocketFactory) SSLCertificateSocketFactory.getDefault(0);
socket = (SSLSocket) sslSocketFactory.createSocket(InetAddress.getByName("theserver"), 443);
socket.setEnabledProtocols(socket.getSupportedProtocols());
String[] cipherArray = socket.getEnabledCipherSuites();
for(int i = 0; i<cipherArray.length; i++) {
Log.e("","Available Cipher:"+cipherArray[i]);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
sslSocketFactory.setHostname(socket, "thehostname");
} else {
try {
java.lang.reflect.Method setHostnameMethod = socket.getClass().getMethod("setHostname", String.class);
setHostnameMethod.invoke(socket, "thehostname");
} catch (Exception e) {
Log.w("", "SNI not useable", e);
}
}
socket.setSoTimeout(20000);
socket.setUseClientMode(true);
Log.i(getClass().toString(), "Connected.");
socket.startHandshake();
SSLSession session = socket.getSession();
boolean secured = session.isValid();
Run Code Online (Sandbox Code Playgroud)
这个IOexception SSLHANDSHAKEEXCEPTION在Android开发人员上的解决方案是https://developer.android.com/training/articles/security-ssl.html#CommonProblems:
"从InputStream中获取一个特定的CA,使用它来创建一个KeyStore,然后用于创建和初始化一个TrustManager.一个TrustManager是系统用来验证来自服务器的证书,并通过一个KeyStore创建一个.或更多CA-那些将是该TrustManager信任的唯一CA.
给定新的TrustManager,该示例初始化一个新的SSLContext,它提供了一个SSLSocketFactory,可用于覆盖HttpsURLConnection的默认SSLSocketFactory.这样连接将使用您的CA进行证书验证."
现在sslcontext返回SSLSOCKETFACTORY,我想使用SSLCertificateSocketFactory(用于sethostname方法)怎么办..我希望问题很清楚,如果不是让我知道或者随意让它更清楚
在使用 Android(包括 SNI 支持)时,您可以使用NetCipher库来获取现代 TLS 配置HttpsURLConnection。NetCipher 将实例配置HttpsURLConnection为使用最受支持的 TLS 版本以及该 TLS 版本的最佳密码套件。首先,将其添加到您的build.gradle中:
compile 'info.guardianproject.netcipher:netcipher:2.0.0-alpha1'
Run Code Online (Sandbox Code Playgroud)
或者您可以下载netcipher.jar并将其直接包含在您的应用程序中。然后而不是调用:
HttpURLConnection connection = (HttpURLConnection) sourceUrl.openConnection();
Run Code Online (Sandbox Code Playgroud)
调用这个:
HttpsURLConnection connection = NetCipher.getHttpsURLConnection(sourceUrl);
Run Code Online (Sandbox Code Playgroud)
如果您想了解其在代码中是如何完成的,请查看TlsOnlySocketFactory
| 归档时间: |
|
| 查看次数: |
2525 次 |
| 最近记录: |