Конфигурация JBoss Https с сертификатом CER/P7b завершается неудачно
Мой вопрос похож на этот: Tomcat не может найти ключевую запись в хранилище ключей
У меня есть файл CER, который я импортировал в JKS, используя следующую команду:
keytool -importcert -file codesign_Base64.cer -keystore imported_keystore.jks -alias my_alias
Затем у меня есть следующая строка конфигурации в standalone.xml для jBoss.
<subsystem xmlns="urn:jboss:domain:web:1.1" native="false" default-virtual-server="default-host">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" redirect-port="8443"/>
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true">
<ssl name="ssl" key-alias="my_alias " password="change_this" certificate-key-file="C:\Programs\Siemens\JBoss7.1.0\domain\configuration\imported_keystore.jks " protocol="TLSv1" verify-client="false"/>
</connector>
<virtual-server name="default-host" enable-welcome-root="false">
<alias name="localhost"/>
<alias name="example.com"/>
</virtual-server>
</subsystem>
При этом, когда я пытаюсь запустить приложение, я вижу следующие сообщения об ошибках в файлах журнала jBoss, которые отображают ошибки такого рода.
11:46:19,692 ERROR [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-4) Error initializing endpoint: java.io.IOException: Alias name mykey does not identify a key entry
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:517) [jbossweb-7.0.10.Final.jar:]
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:452) [jbossweb-7.0.10.Final.jar:]
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:168) [jbossweb-7.0.10.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:977) [jbossweb-7.0.10.Final.jar:]
at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:190) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.connector.Connector.init(Connector.java:983) [jbossweb-7.0.10.Final.jar:]
at org.jboss.as.web.WebConnectorService.start(WebConnectorService.java:267) [jboss-as-web-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_75]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_75]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_75]
Но если я изучу содержимое хранилища ключей Java, я все равно смогу увидеть наличие соответствующего ключа.
C:\Programs\Siemens\JBoss7.1.0\domain\configuration>keytool -list -keystore C:\Programs\Siemens\JBoss7.1.0\domain\configuration\winstore.jks
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
my_alias, Jun 23, 2017, trustedCertEntry,
Certificate fingerprint (SHA1): 8D:64:10:8B:F6:0D:1E:17:01:52:1C:97:8A:89:75:80:2D:2F:45:6B
Я столкнулся с подобной проблемой, когда я попытался с сертификатом P7B также. Единственное, что сработало до сих пор, это если сертификат был сгенерирован вручную - самоподписанный сертификат. И это не стратегия продвижения вперед для организации, очевидно,
Пожалуйста, дайте мне знать, чего здесь не хватает. Похоже, что аналогичный пост, который я включил выше, намекает на сценарий "только сертификат и не ключ", который я не могу описать.
Любые указатели наверняка помогут, поскольку я разместил это в нескольких местах, и у меня нет никаких ответов в данный момент.
Спасибо, Паван.
1 ответ
Нет, ваше хранилище ключей НЕ содержит приватный ключ. Посмотри где написано trustedCertEntry
? Доверенный сертификат НЕ является частным ключом, это всего лишь сертификат, а сертификат не является частным ключом. Серверу SSL/TLS требуется закрытый ключ И соответствующая цепочка сертификатов; один сертификат не может быть использован для выполнения протокола, поэтому ваш сервер не может принимать никакие HTTPS-соединения, и поэтому любой браузер, который пытается соединиться с HTTPS (вероятно, после перенаправления из HTTPS), терпит неудачу. P7B также не содержит закрытого ключа, хотя он может содержать несколько сертификатов, в то время как CER обычно содержит только один. (В отличие от этого, клиенту обычно требуются только "корневые" сертификаты CA, и не требуется закрытый ключ, если не используется довольно редкая опция "аутентификации клиента".)
Тебе необходимо privateKeyEntry
который содержит как приватный ключ, так и цепочку сертификатов для этого ключа и желаемые имена хостов. Есть два способа (с вариантом) сделать это для Java:
1: использовать keytool
создать новый закрытый ключ (с фиктивным самозаверяющим сертификатом) в JKS и создать для него CSR (запрос на подпись сертификата или просто Cert[ificate] Req[uest]). Отправьте CSR и другие необходимые данные, такие как платеж, в центр сертификации (ЦС) для получения подходящего сертификата, обычно сопровождаемого хотя бы одним "цепным" или "промежуточным" сертификатом, который может понадобиться клиентам для доверия сертификату. использование keytool
импортировать сертификат / цепочку в тот же JKS и запись, которая уже содержит приватный ключ (заменяя фиктивный самоподписанный сертификат); При желании вы также можете импортировать сертификат (ы) цепочки в виде записей доверенных сертификатов.
Метод 1 является каноническим и описывается, как правило, неоднократно, на веб-сайте каждого поставщика сертификатов, на которого я когда-либо обращался, как CA, так и посредников; Я не знаю, как ты скучал по ним всем. Обратите внимание, что эти описания часто относятся к Tomcat, наиболее широко используемому веб-серверу на основе Java; компонент веб-сервера Jboss, теперь называемый Wildfly, на самом деле является форком Tomcat. Вот первые два гугл находит меня:
* https://www.digicert.com/csr-creation-java.htm
* https://knowledge.symantec.com/support/ssl-certificates-support/index?page=content&id=INFO227
2А. Используйте другие инструменты (например, Windows, MacOS или OpenSSL) для генерации закрытого ключа и получения подходящего сертификата, обычно с использованием CSR, из ЦС, включая его цепочку. При необходимости экспортируйте / конвертируйте / объединяйте цепочку сертификатов privatekey AND в файл PKCS12 (также называемый PFX в Microsoft-land) и, возможно, затем используйте keytool -importkeystore
конвертировать PKCS12 в JKS. (Во многих случаях в Java 8 вы можете использовать PKCS12 напрямую, без преобразования его в JKS, и Java 9, как ожидается, будет поощрять это.)
2B: Если у вас уже есть сгенерированный приватным ключом и подходящий сертификат / цепочка, полученная с помощью других инструментов, просто поместите их в PKCS12 и, вероятно, преобразуйте в JKS, как указано выше.
Обратите внимание, что некоторые другие графические интерфейсы, такие как Microsoft, MacOS и Firefox, фокусируются на сертификате: они отображают доверенный другой сертификат как просто "сертификат", а комбинацию "приватный ключ плюс сертификат" как "сертификат с приватным ключом". Но разница все еще жизненно важна; сервер должен иметь приватный ключ, и попытка использовать "сертификат без приватного ключа" завершается неудачно. Вместо этого в Java есть разные типы записей хранилища ключей - хотя для некоторых хранилищ ключей эти типы на самом деле не хранятся напрямую.