团队渗透测试小组建议我们将Android应用程序固定在服务器的IP地址以及已固定的证书上,以增加对中间攻击者的防御能力。我的问题是,除了已经固定的证书之外,我该如何固定服务器IP地址在android应用上。
当前我正在使用okhttp
。我已经实现了证书固定,这是在使用okhttpClient
创建单例okhttpClientBuilder
时完成的。代码如下所示。我想以某种方式将后端服务器IP地址添加到此生成器。
val client = OkHttpClient.Builder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader(apiKeyHeader, apiKey)
.header("Content-Type", "application/json")
.build()
chain.proceed(request)
}.addInterceptor(loggingInterceptor)
.certificatePinner(CertificatePinUtil.createOkHttpCertPinner())
.build()
有关如何实现IP固定的任何建议都将有所帮助。
理想情况下,我们将使用OkhttpClientBuilder
或android安全配置来执行此操作。我不想对响应进行任何手动检查。
答案 0 :(得分:1)
您可以实现自己的Dns,并为Dns进行硬编码。
override fun lookup(hostname: String): List<InetAddress> {
val override = overrides[hostname]
if (override != null) {
logger.fine("Using Dns Override ($hostname): $override")
return listOf(InetAddress.getByName(override))
}
return dns.lookup(hostname)
}
答案 1 :(得分:0)
设置SSL Pinning的过程中有很多不同的注意事项。这有点超出Stack Overflow的讨论范围,但是有一些不错的读物:
别忘了,这是official Android guide
的链接 OKHTTP
示例
String hostname = “publicobject.com”;
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add(“publicobject.com”, “sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=”)
.add(“publicobject.com”, “sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=”)
.add(“publicobject.com”, “sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=”)
.add(“publicobject.com”, “sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=”)
.build();
OkHttpClient client = new OkHttpClient();
client.setCertificatePinner(certificatePinner);
Request request = new Request.Builder()
.url(“https://” + hostname)
.build();
client.newCall(request).execute();
OkHttpSSLPinning.java
由GitHub托管于❤-参考:http://square.github.io/okhttp/
更新: 您必须使用域本身,因为SSL证书通常授予域名,并且不包含特定的IP。可以颁发IP证书,但这不是常见的做法。 (Accessing https sites with IP address)
使用固定的目的是确保在解决SSL握手时没有MitM攻击。