Вопрос или проблема
Запуск..
- Сервер/WS: Apache Tomcat 9.0.80
- ОС: Windows Server 2019 Standard
- Java: OpenJDK 16.0.2 (64-бит, смешанный режим, совместный доступ)
У меня есть PFX файл, содержащий закрытый и открытый ключи (сертификат). Он также содержит промежуточный сертификат и корневой сертификат. PFX файл защищен паролем. Он был создан с помощью keytool. Псевдоним ключа (alias) – (т.е. mycertalias). Я импортировал закрытый ключ и сертификат в хранилище Windows через менеджер сертификатов (Локальный компьютер) (certlm.msc). В разделе Личное\Сертификаты. Дружественное имя сертификата совпадает с псевдонимом ключа. Затем я открыл server.xml в Tomcat и настроил коннектор:
<Connector
port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
URIEncoding="UTF-8"
SSLEnabled="true"
maxThreads="1500"
scheme="https"
secure="true"
clientAuth="false"
sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
sslProtocol="TLS"
keyAlias=""
keystoreFile=""
keystoreType="Windows-MY"
keystorePass=""
truststoreFile=""
truststoreType="Windows-ROOT"
truststorePass=""
enableLookups="true"
/>
Я настроил Tomcat для отладки всего, добавив Java Option: -Djavax.net.debug=all.
Tomcat работает под учетной записью Локальной системы.
Исключение, которое было выброшено, относится к Alias name [mycertalias] does not identify a key entry:
SEVERE [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Не удалось инициализировать компонент [Connector["https-jsse-nio-443"]]
org.apache.catalina.LifecycleException: Инициализация обработчика протоколов завершилась неудачей
at org.apache.catalina.connector.Connector.initInternal(Connector.java:1011)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:554)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1040)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
at org.apache.catalina.startup.Catalina.load(Catalina.java:724)
at org.apache.catalina.startup.Catalina.load(Catalina.java:746)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Нативный метод)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:307)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:477)
Caused by: java.lang.IllegalArgumentException: Псевдоним [mycertalias] не идентифицирует запись ключа
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:107)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:236)
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1324)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1337)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:652)
at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:75)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:1009)
... 13 more
Caused by: java.io.IOException: Псевдоним [mycertalias] не идентифицирует запись ключа
at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:343)
at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:253)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:105)
Я проверил PFX файл снова и снова. Псевдоним ключа является записью закрытого ключа, согласно keytool. Я экспортировал закрытый ключ и сертификат из хранилища Windows и подтвердил с помощью keytool, что псевдоним ключа совпадает с тем, что я изначально импортировал в указанное хранилище, которое, в данном случае, является “mycertalias”. Я даже импортировал закрытый ключ и сертификат в оснастку сертификатов учетной записи службы Tomcat, на случай если Tomcat ищет их там, а не в учетной записи компьютера. Это не дало результата.
Я знаю, что он находит хранилище Windows. Вопрос в том, относится ли Windows-MY к тому же хранилищу сертификатов или название хранилища изменилось на что-то другое для новых версий Windows, и мне нужно использовать его вместо этого?
Я пробовал Windows-MY-LOCALMACHINE, но Tomcat сообщает, что такого хранилища не существует. Так что это не так. Либо Windows-MY относится к другому хранилищу Windows, либо, по какой-то странной причине, он не может найти запись сертификата, даже если сертификат был импортирован с правильным псевдонимом ключа. Я пробовал установить в server.xml: keyAlias=””, удалить keyAlias, keyAlias=1 и даже keyAlias=”Tomcat”. Ничего не работает. Я пробовал установить keyAlias на Общее имя сертификата. Не работает. Я не знаю, что еще можно сделать, кроме как начать с нуля и воссоздать PFX файл.
Есть идеи, что может быть причиной здесь?
Службы Windows имеют отдельное хранилище Личных/Персональных сертификатов. Вы должны иметь возможность выбрать его, запустив mmc, загрузив сертификаты и выбрав службу, когда появится запрос.
Ответ или решение
Чтобы решить проблему с ошибкой "Alias name [mycertalias] does not identify a key entry" на Apache Tomcat 9.x при использовании хранилища сертификатов Windows на Windows Server 2019, выполните следующие шаги:
-
Проверка хранилища сертификатов:
Убедитесь, что сертификат действительно существует в правильном хранилище. Запуститеmmc
и добавьте оснастку "Certificates". Убедитесь, что вы выбираете "My User Account" (или "Local Computer" в зависимости от того, как вы запустили Tomcat) и проверьте наличие вашего сертификата под "Personal Certificates". Если Tomcat работает под учетной записью Local System, убедитесь, что сертификат открыт именно там. -
Правильная установка прав доступа:
Убедитесь, что учетная запись, под которой запущен Tomcat (обычно Local System), имеет права доступа к ключам в хранилище сертификатов. Вы можете сделать это в оснастке "Certificates", щелкнув правой кнопкой мыши на сертификате, выберите "All Tasks" -> "Manage Private Keys" и добавьте права доступа для Local System. -
Проверка значений в server.xml:
В файлеserver.xml
убедитесь, что указаны правильные значения. Проверьте следующие параметры:<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" URIEncoding="UTF-8" SSLEnabled="true" maxThreads="1500" scheme="https" secure="true" clientAuth="false" sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation" sslProtocol="TLS" keyAlias="mycertalias" <!-- Убедитесь, что здесь указан правильный alias --> keystoreFile="" <!-- Оставьте пустым для Windows-MY --> keystoreType="Windows-MY" <!-- Убедитесь, что это значение правильно --> keystorePass="" <!-- Для Windows-MY это значение не требуется --> truststoreFile="" truststoreType="Windows-ROOT" truststorePass="" enableLookups="true" />
-
Переустановка сертификата:
Если предыдущие шаги не помогли, попробуйте удалить сертификат из хранилища и заново его установить. Убедитесь, что он импортируется как "Personal" сертификат с включенной закрытой ключом. -
Проверка доступа к сертификату:
Убедитесь, что Java может получить доступ к Windows Store. Иногда правила безопасности могут блокировать доступ Java-приложений к хранилищу сертификатов. Также проверьте, нет ли в системе проблем с установкой Java или Tomcat. -
Перезагрузка службы Tomcat:
После внесения изменений убедитесь, что вы перезагрузили службу Tomcat, чтобы изменения вступили в силу. -
Использование альтернативного хранилища:
Если проблема не решается, вы можете рассмотреть возможность использования традиционного формата хранилища Java (например, PKCS12 или JKS) для вашего сертификата и запретить использовать Windows Store.
Если, после всего этого, у вас все еще возникают проблемы, рекомендуется запустить Tomcat с повышенной отладкой, чтобы проанализировать вывод и исключения.
Эти шаги должны помочь вам решить проблему с идентификацией ключа сертификата в хранилище Windows при использовании Tomcat 9.x на Windows Server 2019.