OkHttp certificatePinner кажется не работает

Мне нужна помощь,

Я пытаюсь внедрить SSLPinning в свое собственное приложение (v0.63).

я уже следую документации на странице OkHttp github

вот код, который я делаю для своего приложения:

public class CustomClientFactory implements OkHttpClientFactory {

@Override
  public OkHttpClient createNewNetworkModuleClient() {
    CertificatePinner certificatePinner = new CertificatePinner.Builder()
      .add(BuildConfig.HOSTNAME, BuildConfig.SHA_PUBLIC_KEY_1)
      .add(BuildConfig.HOSTNAME, BuildConfig.SHA_PUBLIC_KEY_2)
      .add(BuildConfig.HOSTNAME, BuildConfig.SHA_PUBLIC_KEY_3)
      .build();

    OkHttpClient.Builder client = new OkHttpClient.Builder()
      .connectTimeout(0, TimeUnit.MILLISECONDS)
      .readTimeout(0, TimeUnit.MILLISECONDS)
      .writeTimeout(0, TimeUnit.MILLISECONDS)
      .cookieJar(new ReactCookieJarContainer())
      .certificatePinner(certificatePinner);

    OkHttpClient newClient = OkHttpClientProvider.enableTls12OnPreLollipop(client).build();

    return newClient;
  }
}

Окхттпцертпин:

public class OkHttpCertPin {
    public static void rebuildOkHttpForSslPinning() {
        OkHttpClientProvider.setOkHttpClientFactory(new CustomClientFactory());
    }
}

и это мой метод onCreate для MainActivity:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    OkHttpCertPin.rebuildOkHttpForSslPinning();
  }

он позволяет выполнять все запросы, даже если я использую случайный открытый ключ и имя хоста.

что я сделал не так?

весь открытый ключ я получил от sslLabs


person Aland Samuel    schedule 01.03.2021    source источник
comment
Касательно: вы уверены, что вам нужен enableTls12OnPreLollipop, OkHttp должен согласовать TLSv1.2, когда он будет доступен на Android.   -  person Yuri Schimke    schedule 01.03.2021
comment
CertificatePinner будет ограничивать трафик только для хоста BuildConfig.HOSTNAME, все остальные хосты будут пропущены. Что вы ожидаете, и к каким хостам вы подключаетесь? Вы можете реализовать EventListener и распечатать хосты, к которым вы подключаетесь, и пин-код из цепочки сертификатов, чтобы помочь отладить это.   -  person Yuri Schimke    schedule 01.03.2021
comment
о, так что я думаю, что это неправильно? Я хочу, чтобы все имя хоста, кроме BuildConfig.HOSTNAME, было ограничено, на данный момент я использую метод перехватчика, предоставляемый okhttp, для печати запроса и ответа для каждого вызова, я думаю, что могу использовать перехватчик для печати хоста   -  person Aland Samuel    schedule 01.03.2021
comment
Используйте сетевой перехватчик и замкните эти запросы. Сертификат Pinner не это.   -  person Yuri Schimke    schedule 01.03.2021


Ответы (1)


CertificatePinner будет ограничивать трафик только для хоста BuildConfig.HOSTNAME, все остальные хосты будут пропущены. Вот почему ваш CertificatePinner ничего не блокирует.

Вы можете создать собственный сетевой перехватчик для отклонения всего остального трафика. См. https://square.github.io/okhttp/interceptors/.

н.б. в будущем вы можете реализовать EventListener и распечатать хосты, к которым вы подключаетесь, и пин-код из цепочки сертификатов, чтобы помочь отладить это.

См. https://stackoverflow.com/a/66398516/1542667.

person Yuri Schimke    schedule 02.03.2021
comment
да, я думаю, что у меня неправильное представление об этом пиннере сертификата, но после прочтения вашего комментария к моему сообщению я уже реорганизовал свой код - person Aland Samuel; 03.03.2021