Включение связи HTTPS между моим сервером и моим клиентом - PullRequest
1 голос
/ 19 апреля 2020

Я уже создал серверное приложение и приложение android. До сих пор они общались по http, но я посылаю конфиденциальную информацию в каждом запросе (например, JWT). Поэтому я хочу использовать Https вместо этого.

Я создал сертификат p12.

На стороне сервера:

  1. Я скопировал сертификат в resources/keystore/sampleName.p12
  2. Я добавил эти строки в свой application.properties

    server.ssl.key-store-type=PKCS12
    server.ssl.key-store-password=samplePassword
    server.ssl.key-store=classpath:keystore/sampleName.p12
    server.ssl.key-alias=sampleName
    

На стороне android я использую okHttp и создаю клиента следующим образом

val httpClient = OkHttpClient.Builder()
    .certificatePinner(
        CertificatePinner.Builder()
            .add(
                https://10.0.2.2:8080,
                "sha256/lVIcG+gpmlabsq1bW5RbvB+kqVSHKdOFyoxjo9+SLEs="
            ).build()
    )
    .build()

Я использую https://10.0.2.2:8080, потому что я запускаю только приложение сервера Локально, и я также запускаю приложение android на эмуляторе на том же ноутбуке.

Чтобы получить sha256/lVIcG+gpmlabsq1bW5RbvB+kqVSHKdOFyoxjo9+SLEs=, я использовал keytool -list -v -keystore sampleName.p12 -storetype PKCS12 -storepass samplePassword и преобразовал отпечаток sha256, который был в шестнадцатеричном, в base64.

Теперь, когда я пытаюсь отправить любой запрос на сервер, я получаю

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found

Я явно что-то упускаю, но не знаю что. Есть ли что-нибудь еще, что мне нужно сделать? Или я сделал что-то не так? Или это просто не должно работать локально?

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

Но все же я буду представлять решение, и мне действительно нужно, чтобы оно было solid и работало локально.

1 Ответ

0 голосов
/ 20 апреля 2020

CertificatePinning - это дополнение к обычным проверкам сертификатов. Это только еще больше ограничивает выбор сертификата, поскольку по умолчанию вы примете любой сертификат для своего хоста.

См. Добавление пользовательского сертификата в клиент OkHttp для существующего ответа.

Или читайте здесь

https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java

https://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/

...