Я пытаюсь установить сервер wildfly9 с авторизацией сертификата клиента. Для этого у меня есть:
На клиенте: создайте самоподписанный сертификат:
keytool -genkey -keystore client.keystore -validity 3650
-keyalg RSA -keysize 4096 -storetype pkcs12 -alias myClient
На клиенте: экспортный сертификат
keytool -exportcert -keystore client.keystore -alias myClient
-storetype pkcs12 -file myClient.crt
На сервере: Импортируйте файл сертификата crt в хранилище доверенных сертификатов.
keytool -import -file myClient.crt
-keystore /etc/pki/wildfly/client.truststore
На сервере: настройка конфигурации wildfly (включение аутентификации клиента по сертификату):
<security-realm name="UndertowRealm">
<server-identities>
<ssl>
<keystore path="/etc/pki/wildfly/server.keystore" keystore-password="123456" alias="server" key-password="123456"/>
</ssl>
</server-identities>
<authentication>
<truststore path="/etc/pki/wildfly/client.truststore" keystore-password="123456"/>
<local default-user="$local" skip-group-loading="true"/>
<properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/>
</authentication>
</security-realm>
...
<subsystem xmlns="urn:jboss:domain:undertow:2.0">
<server name="default-server">
<https-listener name="https" socket-binding="https" security-realm="UndertowRealm" verify-client="REQUIRED"/>
...
</server>
</subsystem>
Клиент - это скрипт на Python. Для этого клиента мне нужен сертификат и ключ в формате PEM. Чтобы экспортировать сертификат в PEM, я делаю (все на стороне клиента):
Ключ сертификата экспорта:
keytool -v -importkeystore -srckeystore client.keystore
-srcalias myClient -destkeystore myClient.key.tmp.pem
-deststoretype PKCS12 -destkeypass 123456
Удалите пароль с ключа (да, конечно, я также ограничу доступ к ключу позже, изменив режим файла):
openssl pkcs12 -in myClient.key.tmp.pem -nocerts
-nodes > myClient.key.pem
Удалите все внешние '----- BEGIN PRIVATE KEY -----' и '----- END PRIVATE KEY -----' myClient.key.pem
Экспортируйте сертификат как PEM:
keytool -exportcert -keystore client.keystore -alias myClient -rfc -file myClient.pem
Но каждый раз, если я хочу подключить сервер, я получаю (на сервере) ошибку:
2016-10-31 09:50:55,102 DEBUG [io.undertow.request.io] (default I/O-1) Error reading request: javax.net.ssl.SSLException: Received fatal alert: unknown_ca
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1666)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1634)
at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1800)
at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1083)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
at org.xnio.ssl.JsseSslConduitEngine.engineUnwrap(JsseSslConduitEngine.java:688)
at org.xnio.ssl.JsseSslConduitEngine.unwrap(JsseSslConduitEngine.java:620)
at org.xnio.ssl.JsseSslConduitEngine.unwrap(JsseSslConduitEngine.java:574)
at org.xnio.ssl.JsseSslStreamSourceConduit.read(JsseSslStreamSourceConduit.java:89)
at org.xnio.conduits.ConduitStreamSourceChannel.read(ConduitStreamSourceChannel.java:127)
at io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:150)
at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:128)
at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:56)
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:88)
at org.xnio.nio.WorkerThread.run(WorkerThread.java:539)
Если я отключу аутентификацию сертификата клиента, все будет в порядке. значит, с аутентификацией сертификата клиента должно быть что-то не так.
Кто-нибудь знает, что случилось?
Мы не можем решить эту проблему. У нас есть еще одна установка (наша тестовая система), которую мы можем успешно настроить. Тем не мение. Теперь мы поставили перед сервером wildfly прокси-сервер apache httpd. Прокси-сервер apache теперь также управляет материалами сертификатов клиента. У нас это работает.