Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';t仅在牛轧糖上使用自签名证书建立SSLSession_Android_Ssl_Android 7.0 Nougat_Commonsware Cwac - Fatal编程技术网

Android Can';t仅在牛轧糖上使用自签名证书建立SSLSession

Android Can';t仅在牛轧糖上使用自签名证书建立SSLSession,android,ssl,android-7.0-nougat,commonsware-cwac,Android,Ssl,Android 7.0 Nougat,Commonsware Cwac,尝试使用自签名证书和新的ish网络安全配置方法以及cwac netsecurity库建立SSLSession以实现向后兼容性,这在除android 7.0之外的所有其他版本的android(我已经尝试过)上都有效 我有一个安卓应用程序,可以连接到一个设备,为该设备提供一个用户界面。连接在设备端使用TLSv1 SSLSocket和自签名服务器证书。在Nougat之前,我将服务器证书作为BKS密钥存储嵌入并在运行时加载,以创建自定义TrustManager,从而初始化SSL上下文并创建套接字。这在A

尝试使用自签名证书和新的ish网络安全配置方法以及cwac netsecurity库建立SSLSession以实现向后兼容性,这在除android 7.0之外的所有其他版本的android(我已经尝试过)上都有效

我有一个安卓应用程序,可以连接到一个设备,为该设备提供一个用户界面。连接在设备端使用TLSv1 SSLSocket和自签名服务器证书。在Nougat之前,我将服务器证书作为BKS密钥存储嵌入并在运行时加载,以创建自定义TrustManager,从而初始化SSL上下文并创建套接字。这在Android 7+下不再有效。在关于SO()的其他一些问题之后,我能够使用网络安全配置方法在安卓8设备()上建立SSLSocket连接。为了向后兼容,我使用Commonware()中的cwac netsecurity库。我构建了一个小的测试应用程序,正在对openssl s_服务器进行测试。我所写的内容成功地从运行4.4、6.0和8.0的android设备建立了SSLSession。然而,出于某种原因,它在运行7.0的android设备上并没有这样做。下面是显示测试的代码片段。任何帮助都将不胜感激

android应用程序中的测试代码

{
//createSocketFactory
SSLSocketFactory=(SSLSocketFactory)SSLSocketFactory.getDefault();//null;
TrustManagerBuilder tmb=新的TrustManagerBuilder();
tmb.withManifestConfig(MainActivity.this);
tmb.withCertChainListener(
新的CertChainListener()
{
@凌驾
public void onChain(X509Certificate[]链,字符串域)
{
如果(域==null)
{
Log.d(标记“onChain:请求未知域的证书链”);
}
其他的
{
Log.d(标记“onChain:请求到的证书链:”+域);
}
对于(X509证书证书:链)
{
d(标记“onChain:Subject:”+cert.getSubjectX500Principal().getName());
Log.d(标记“onChain:Issuer:”+cert.getIssuerX500Principal().getName());
}
}
});
CompositeTrustManager ctm=tmb.build();
尝试
{
SSLContext sc=SSLContext.getInstance(“TLSv1”);
sc.init(null,new TrustManager[]{ctm},new SecureRandom());
factory=sc.getSocketFactory();
}
捕获(无算法异常)
{
Log.e(标记“createSocketFactory:无法获取SSLContext”,e);
}
捕获(密钥管理异常e)
{
Log.e(标记“createSocketFactory:未能从CompositeTrustManager初始化SSLContext”);
}
//createSslSocket
SSLSocket套接字=空;
字符串addr=“172.31.106.60”;
int端口=50001;
如果(工厂!=null)
{
Log.d(标记“createSocketFactory-SUCCESS”);
尝试
{
套接字=(SSLSocket)工厂。createSocket(地址,端口);
Log.d(标记“createAltSocket-SUCCESS”);
setEnabledProtocols(新字符串[]{“TLSv1”});
socket.setEnablediPhone套件(新字符串[]{“TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA”});
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);
}
捕获(IOE异常)
{
Log.e(标记“createSslSocket-无法创建SSLSocket”,e);
尝试
{
socket.close();
}
捕获(IOE1异常)
{
e1.printStackTrace();
}
最后
{
socket=null;
}
}
}
其他的
{
Log.d(标记“createSocketFactory-失败”);
}
//testSslSocket
if(socket!=null&&socket.isConnected())
{
SSLSession session=socket.getSession();
if(session!=null&&session.isValid())
Log.d(标记“testSslSocket:sessionsuccess”);
其他的
Log.d(标记“testSslSocket:sessionfailed”);
尝试
{
socket.close();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
}
}
网络安全性配置.xml


AndroidManifest.xml


测试服务器

openssl s_server -tls1 -WWW -accept 50001 -cert test.crt -key mcv.key -state
在所有工作情况下,SSLSession在测试例程结束时有效,我从CertChainListener获取日志记录。然而,当在我的安卓7.0设备上运行时,一切都是安静的。我没有从CertChainListener获得任何日志记录,SSLSession无效,并且我在服务器端获得以下信息:

Using default temp DH parameters
ACCEPT
SSL_accept:before/accept initialization
SSL3 alert write:fatal:handshake failure
SSL_accept:error in error
140386525526784:error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher:s3_srvr.c:1417:
ACCEPT

CWAC NetSecurity实际上不适用于任意套接字。我不能排除它会起作用,但这超出了我支持的场景。CWAC NetSecurity应该只是7.0上的一个过渡版本,因此请在不使用
CompositeTrustManager
位的情况下尝试您的代码,看看它是否有效。如果是这样,那么我在CWAC NetSecurity中遇到了一些与普通套接字使用相关的问题。如果它不起作用,那么问题就出在Android本身的某个地方,或者在测试设备的设备固件中(假设您正在使用硬件进行测试)。@commonware-我确实尝试过,但最初没有。使用安卓8,我可以使用defualt SSLSocketFactory并直接从中创建SSLSocket。其余的是为了支持旧的android版本而添加的,它也适用于8。不过,这两种方法在7号上似乎都不起作用。我在CertChainListener中没有得到任何信息,它告诉我在证书链验证之前存在问题。我真的不认为这与CWAC网络安全有任何关系,但我希望有人能来