Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在非常有限的情况下允许来自Android App的明文HTTP流量大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我已阅读 Android 8: Cleartext HTTP traffic not permitted,但没有一个答案似乎允许我做我想要的.

我有一个Android应用程序,其他客户端可以使用证书来识别自己.应用程序想要验证该证书.验证证书的一部分是从证书颁发者获取证书吊销列表(CRL). CRL的分发点是在证书中列出的,并且不可避免地是http URL(CRL本身由发行者签名,因此没有安全问题,如果它是httpS URL,则会想要验证保护CRL分发点的证书,并检查它是否已被撤销…)

可能的解决方案,以及它们为什么不适合我:

>不要担心 – 让TLS库担心验证证书.不幸的是,两个客户端之间没有直接的TLS连接;它全部通过服务器(通过TLS连接)进行调解.
>创建network_security_config.xml,其中列出了允许http的域.遗憾的是,我在构建应用程序时不知道URL – 这取决于CA决定放入其证书的内容.
>在清单中放置android:usesCleartextTraffic =“true”.这意味着任何流量都可以是http,如果可能的话我宁愿避免这种情况. (例如,与服务器的通信绝对必须是httpS,如果我偶然做http,我想要一个错误.)

是否有任何方法代码说“此连接被允许为http”(但认为仅限httpS)?

解决方法

@H_262_19@ 如果您使用的是 OkHttp,则可以构建一个客户端:

OkhttpClient client = new OkhttpClient.builder() 
.connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS,ConnectionSpec.COMPATIBLE_TLS))
.build();

这只允许通过httpS连接.那么,您可以使用您的第三个选项(android:usesCleartextTraffic =“true”),当您通过此客户端进行明文连接时,它将失败.

最后,您可以创建一个标准的Okhttp客户端:

OkhttpClient client = new OkhttpClient.builder().build()

当你想使用明文连接时.

编辑:使用httpUrlConnection,您可以简单地检查返回的连接是否是httpsUrlConnection,如:

try {
    URL my_url = new URL(path);
    httpUrlConnection urlConnection = (httpURLConnection) my_url.openConnection();
    if(!(urlConnection instanceof httpsURLConnection)) {
        // cleartext connection,throw error
        throw new NothttpsException();
    }
    // the connection is secure,do normal stuff here
    urlConnection.setrequestMethod("POST");
    urlConnection.setConnectTimeout(1500);
    urlConnection.setReadTimeout(1500);
    result = IoUtil.readFully(urlConnection.geTinputStream());
} catch(Exception E) {
    e.printStackTrace()
} finally {
    if(urlConnection != null) urlConnection.disconnect();
}

大佬总结

以上是大佬教程为你收集整理的在非常有限的情况下允许来自Android App的明文HTTP流量全部内容,希望文章能够帮你解决在非常有限的情况下允许来自Android App的明文HTTP流量所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。