我有一个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)?
解决方法 如果您使用的是 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流量所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)