没有以前的互联网连接,无法验证Android自签名证书

没有以前的互联网连接,无法验证Android自签名证书,第1张

概述使用SSL基础架构: 我们有一个有效的客户端/服务器设置,其中Android版本4.2和4.4的手机充当客户端,必须通过其自签名SSL证书验证服务器. 问题: 只要设备在尝试连接之前至少有一次互联网访问权限,服务器证书验证就会起作用.但是,如果执行恢复出厂设置且设备直接连接到没有Internet连接的专用网络,则证书验证将失败. 重现行为: >出厂重置手机 >重新启动而不选择连接到具有Intern 使用SSL基础架构:

我们有一个有效的客户端/服务器设置,其中Android版本4.2和4.4的手机充当客户端,必须通过其自签名SSL证书验证服务器.

问题:

只要设备在尝试连接之前至少有一次互联网访问权限,服务器证书验证就会起作用.但是,如果执行恢复出厂设置且设备直接连接到没有Internet连接的专用网络,则证书验证将失败.

重现行为:

>出厂重置手机
>重新启动而不选择连接到具有Internet访问权限的WiFi
>尝试验证自签名SSL证书 – >失败
>连接到可上网的WiFi
>重新连接到原始专用网络
>尝试验证自签名SSL证书 – >作品

从技术上讲,设备不应该需要Internet访问来验证自签名证书.在进行任何SSL服务器验证之前,是否存在某种必须加载的黑名单?我可以阻止这种行为吗?

创建SSL上下文:

//Using a clIEnt certificate    String password = "clIEntpass";    KeyStore keyStore = KeyStore.getInstance("PKCS12");    inputStream is = context.getResources().openRawResource(R.raw.clIEnt);    keyStore.load(is,password.tochararray());    is.close();    KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");    kmf.init(keyStore,password.tochararray());    KeyManager[] keyManagers = kmf.getKeyManagers();    // Using self signed certificate    CertificateFactory cf = CertificateFactory.getInstance("X.509");    is = context.getResources().openRawResource(R.raw.cacert);    inputStream cainput = new BufferedinputStream(is);    Certificate ca;    try {        ca = cf.generateCertificate(cainput);        Log.i("CA","ca=" + ((X509Certificate) ca).getSubjectDN());    } finally {        cainput.close();    }    // Create a KeyStore containing our trusted CAs    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());    trustStore.load(null);    trustStore.setCertificateEntry("ca",ca);    // Create a TrustManager that trusts the CAs in our KeyStore    TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");    tmf.init(trustStore);    TrustManager[] trustManagers = tmf.getTrustManagers();    // Create an SSLContext that uses our Trustmanager and Keymanager    SSLContext sslcontext = SSLContext.getInstance("TLS");    sslcontext.init(keyManagers,trustManagers,null);    //create a socket to connect with the server    SSLSocketFactory socketFactory = sslContext.getSocketFactory();    SSLSocket socket = (SSLSocket) socketFactory.createSocket(serverAddr,port);    socket.setUseClIEntMode(true);    socket.addHandshakeCompletedListener(this);    socket.startHandshake();

在startHandshake中出现异常失败:

javax.net.ssl.SSLHandshakeException: com.androID.org.bouncycastle.jce.exception.ExtCertPathValIDatorException: Could not     valIDate certificate: null
解决方法 确保设备上的时间正确,证书具有有效期,并且不会验证日期是否设置为过去(通常在出厂重置后的2000年1月1日)或将来.设备将通过NTP自动同步,但是当没有可用的Internet连接时,这显然不起作用. 总结

以上是内存溢出为你收集整理的没有以前的互联网连接,无法验证Android自签名证书全部内容,希望文章能够帮你解决没有以前的互联网连接,无法验证Android自签名证书所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1137897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存