Я пытаюсь настроить 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