Как принять входящий самозаверяющий сертификат SSL в OkHttp? - PullRequest
1 голос
/ 22 июня 2019

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

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

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

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

1 Ответ

0 голосов
/ 22 июня 2019

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

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()
}

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

...