如何在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)
  }