Я уже создал серверное приложение и приложение android. До сих пор они общались по http, но я посылаю конфиденциальную информацию в каждом запросе (например, JWT). Поэтому я хочу использовать Https вместо этого.
Я создал сертификат p12.
На стороне сервера:
- Я скопировал сертификат в
resources/keystore/sampleName.p12
Я добавил эти строки в свой 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 и работало локально.