如何将IP地址固定在我的Android应用上?

时间:2019-06-25 21:54:58

标签: android okhttp3 pinning

团队渗透测试小组建议我们将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安全配置来执行此操作。我不想对响应进行任何手动检查。

2 个答案:

答案 0 :(得分:1)

您可以实现自己的Dns,并为Dns进行硬编码。

https://github.com/yschimke/okurl/blob/master/src/main/kotlin/com/baulsupp/okurl/network/DnsOverride.kt#L15-24

  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攻击。