Tomcat 9.x: Имя алиаса не идентифицирует ключевую запись для хранилища ключей Windows-MY (Windows Server 2019)

Вопрос или проблема

Запуск..

  • Сервер/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, выполните следующие шаги:

  1. Проверка хранилища сертификатов:
    Убедитесь, что сертификат действительно существует в правильном хранилище. Запустите mmc и добавьте оснастку "Certificates". Убедитесь, что вы выбираете "My User Account" (или "Local Computer" в зависимости от того, как вы запустили Tomcat) и проверьте наличие вашего сертификата под "Personal Certificates". Если Tomcat работает под учетной записью Local System, убедитесь, что сертификат открыт именно там.

  2. Правильная установка прав доступа:
    Убедитесь, что учетная запись, под которой запущен Tomcat (обычно Local System), имеет права доступа к ключам в хранилище сертификатов. Вы можете сделать это в оснастке "Certificates", щелкнув правой кнопкой мыши на сертификате, выберите "All Tasks" -> "Manage Private Keys" и добавьте права доступа для Local System.

  3. Проверка значений в 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"
    />
  4. Переустановка сертификата:
    Если предыдущие шаги не помогли, попробуйте удалить сертификат из хранилища и заново его установить. Убедитесь, что он импортируется как "Personal" сертификат с включенной закрытой ключом.

  5. Проверка доступа к сертификату:
    Убедитесь, что Java может получить доступ к Windows Store. Иногда правила безопасности могут блокировать доступ Java-приложений к хранилищу сертификатов. Также проверьте, нет ли в системе проблем с установкой Java или Tomcat.

  6. Перезагрузка службы Tomcat:
    После внесения изменений убедитесь, что вы перезагрузили службу Tomcat, чтобы изменения вступили в силу.

  7. Использование альтернативного хранилища:
    Если проблема не решается, вы можете рассмотреть возможность использования традиционного формата хранилища Java (например, PKCS12 или JKS) для вашего сертификата и запретить использовать Windows Store.

Если, после всего этого, у вас все еще возникают проблемы, рекомендуется запустить Tomcat с повышенной отладкой, чтобы проанализировать вывод и исключения.

Эти шаги должны помочь вам решить проблему с идентификацией ключа сертификата в хранилище Windows при использовании Tomcat 9.x на Windows Server 2019.

Оцените материал
Добавить комментарий

Капча загружается...