Невозможно проверить сертификат клиента с помощью сервера Akka HTTP (Play Framework) - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь настроить HTTPS-сервер с проверкой подлинности сертификата клиента с помощью Play Framework (2.7).Но проверка подлинности клиента всегда завершается ошибкой с unable to find valid certification path to requested target.

Сертификат клиента подписывается настраиваемым центром сертификации, который использует самозаверяющий сертификат.В моей настройке этот пользовательский ЦС является единственным ЦС, которому сервер должен доверять.

В application.conf Я добавил следующую конфигурацию, чтобы настроить сервер HTTPS и заменить хранилище доверия по умолчанию на собственный сертификат ЦС..

play {
  server {
    https {
      keyStore {
        path = "/path/to/store",
        password = "password",
        type = "PKCS12"
      }
      needClientAuth = true
    }
  }
}

ssl-config {
  trustManager = {
    stores = [
      { type = "PEM", path = "path/to/ca/certificate" }
    ]
  }
}

При включенной отладке при инициализации приложения я вижу, что загружен специальный сертификат CA:

adding as trusted cert:
  Subject: EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
  Issuer:  EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
  Valid from Wed Jul 06 15:38:40 CEST 2005 until Tue Jul 01 15:38:40 CEST 2025

Тем не менее, я также вижу следующие строки немного дальше вжурналы:

trustStore is: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts
trustStore type is : jks
trustStore provider is : 
init truststore

Я не ожидал и не хочу, чтобы сервер использовал хранилище доверенных сертификатов JRE по умолчанию.Как я могу полностью отключить его?

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

Когда клиент подключается, я вижу в журналах, что его сертификат правильно читается:

chain [0] = [
Subject: EMAILADDRESS=devnull@mydomain.com, CN=My User, OU="User#41183", O=MyOrg, C=FR
Validity: [From: Thu Jan 11 10:17:12 CET 2018, To: Tue Jan 10 10:17:12 CET 2023]
Issuer: EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
]
chain [1] = [
Subject: EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
Validity: [From: Wed Jul 06 15:38:40 CEST 2005, To: Tue Jul 01 15:38:40 CEST 2025]
Issuer: EMAILADDRESS=ca@mydomain.com, CN=CustAuth, O=MyOrg, L=City, ST=12345, C=FR
]

Эмитент клиента совпадает с ранее загруженным пользовательским сертификатом CA.Однако выдается следующая ошибка:

application-akka.actor.default-dispatcher-2, fatal error: 46: General SSLEngine problem
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Что мне не хватает или что я делаю не так?

Редактировать: я заметил, что если я импортирую сертификат собственного CA в доверие по умолчаниюstore, аутентификация работает.

Edit 2: похоже, связано с реализацией по умолчанию поставщика движка SSL:

2019-04-08 13:21:46 +0200 [DEBUG] from play.core.server.ssl.DefaultSSLEngineProvider in application-akka.actor.default-dispatcher-3 - Using default trust store for client side CA verification
...