Как принять входящий самозаверяющий SSL-сертификат в OkHttp?

У меня есть это требование, когда приложение распространяется, поэтому конечные точки относятся к каждой компании, ничего централизованного. Проблема в том, что приложение должно разрешать самозаверяющие сертификаты.

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

Итак, есть ли способ при таком исключении SSL, что сертификат не является доверенным, а затем показать пользователю «Этот сертификат не является доверенным бла-бла. Принять?».

TLDR; как получить содержимое оскорбительного сертификата в OkHttp, чтобы затем его можно было сохранить в подклассе sslSocketFactory?


person urSus    schedule 21.06.2019    source источник


Ответы (1)


Вы можете адаптировать что-то вроде следующего примера кода

private fun createInsecureTrustManager(): X509TrustManager = object : X509TrustManager {
  override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}

  override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {
    val s = "Do you want to accept {${chain.first().subjectX500Principal.name}}?"
    val response = JOptionPane.showConfirmDialog(null, s, "Confirm",
        JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)
    if (response == JOptionPane.NO_OPTION) {
      throw CertificateException("Not accepting ${chain.first().subjectX500Principal.name}}")
    }
  }

  override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
}

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

person Yuri Schimke    schedule 22.06.2019