如何在Android应用程序上锁定IP地址? 一个建议是由团队渗透测试我们的Android应用程序,我们应该把服务器的IP地址与已经被钉住的证书钉在一起,为中间人攻击添加一个层防御。我的问题是,除了已经锁定的证书外,如何在android应用程序上锁定服务器IP地址
目前我正在使用如何在Android应用程序上锁定IP地址? 一个建议是由团队渗透测试我们的Android应用程序,我们应该把服务器的IP地址与已经被钉住的证书钉在一起,为中间人攻击添加一个层防御。我的问题是,除了已经锁定的证书外,如何在android应用程序上锁定服务器IP地址,android,okhttp3,pinning,Android,Okhttp3,Pinning,目前我正在使用okhttp。我已经实现了证书固定,这是在使用okhttpClientBuilder创建单例okhttpClient时完成的。代码如下所示。我想以某种方式将后端服务器IP地址固定到这个生成器中 val client = OkHttpClient.Builder() .addInterceptor { chain -> val request = chain.request().newBuilder()
okhttp
。我已经实现了证书固定,这是在使用okhttpClientBuilder
创建单例okhttpClient
时完成的。代码如下所示。我想以某种方式将后端服务器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安全配置来实现这一点。我不想对响应执行任何手动检查。在设置SSL固定的过程中有许多不同的注意事项。这有点超出了堆栈溢出帖子的范围,但有一些好的解读:
- 中等:
- 网络专家:
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();
okhttpsslpining.java
托管于❤ 由GitHub提供-参考:
更新:
您必须使用域本身,因为SSL证书通常提供给域名,并且不包括特定的IP。可以为IP颁发证书,但这不是常见做法。
()
使用固定的目的是确保在解析SSL握手时没有MitM攻击 您可以实现自己的Dns,它具有Dns的硬编码结果
覆盖有趣的查找(主机名:字符串):列表{
val override=覆盖[hostname]
如果(覆盖!=null){
logger.fine(“使用Dns覆盖($hostname):$Override”)
返回列表(InetAddress.getByName(覆盖))
}
返回dns.lookup(主机名)
}
SSL固定已经实现。这篇文章经过编辑,以更清楚地表达这一点。我试图实现的是将后端服务器的实际IP地址固定在已实现的证书固定上。更新的答案以反映您的评论。
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)
}