Как я могу закрепить IP-адрес в моем приложении для Android? - PullRequest
2 голосов
/ 26 июня 2019

В ходе тестирования на проникновение в наше приложение для 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 ]

1 голос
/ 26 июня 2019

Вы можете реализовать свой собственный 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)
  }
0 голосов
/ 26 июня 2019

Существует несколько различных соображений, которые влияют на настройку закрепления SSL. Это немного выходит за рамки поста переполнения стека, но есть несколько хороших чтений:

И давайте не будем забывать, вот ссылка на официальное руководство по Android

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 - ref: http://square.github.io/okhttp/

Обновление: Вы должны использовать сам домен, потому что сертификаты SSL обычно присваиваются доменным именам и не включают в себя определенный IP. Можно выдать сертификат для IP, но это не обычная практика. ( Доступ к сайтам https с IP-адресом )

Смысл использования закрепления в том, чтобы при разрешении рукопожатия SSL не было атаки MitM.

...