Как настроить Tomcat для использования SSL-шифрования с закрытым ключом, хранящимся на удаленном сервере?

Как настроить Tomcat для использования SSL-шифрования с закрытым ключом, хранящимся на удаленном сервере?

Я хочу узнать, есть ли способ настроить Tomcat server.xmlдля использования SSL-шифрования с закрытым ключом, хранящимся удаленно на сервере. Я могу себе представить, что конфигурация сервера будет примерно такой:

Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
proxyPort=""
keystoreFile="{./script-return}/keystore.jks"
keystorePass="12345"
keystoreType="jks"
truststorePass="12345"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />

Но keystoreFileдиректива указывает на скрипт, который извлекает закрытый ключ с удаленного сервера.

Есть ли способ в конфигурации Tomcat указать на скрипт оболочки для извлечения ключа?

Я нашел кое-что оTrustManagerно я вижу, что путь должен указывать на путь в файловой системе, что для меня не является альтернативой.

решение1

«Извлечение ключа» полностью сводит на нет смысл использования HSM — это означает, что закрытый ключ все равно будет храниться в памяти Tomcat (поэтому его можно будет украсть, например, с помощью Heartbleed), и любой, кто посмотрит на него, server.xmlвсе равно сможет украсть его,просто запустив ту же самую командукак это делает Tomcat.

Ваша идея будет иметь смысл только в том случае, если вы сможете сделать Tomcatотправлять запросы на подписаниек HSM. Это немного увеличит задержку (из-за того, что каждое TLS-подключение должно будет попасть в HSM), но это единственный подход, который действительно добавляет некоторую безопасность.

(Это даже не обязательно должен быть настоящий HSM; это может быть даже SoftHSM2, работающий в той же системе, и он все равно будет более безопасным, если он надежно хранит ключ в одной учетной записи пользователя, а Tomcat — в другой.)

Использование модуля PKCS#11 в той же системе

Вы можете пролистать этот раздел, но основные шаги по использованию PKCS#11 с Tomcat следующие:

  1. Создайте файл с:/etc/java-<name>.cfg
    имя =<hsm_name>
    библиотека = /usr/lib/p11-kit-proxy.so
    (Измените путь к библиотеке в соответствии с вашим дистрибутивом. Полную документацию по этому конфигурационному файлу можно найти вРуководство по Java PKCS#11.)
  2. Добавьте новую строку в ваш java.securityфайл:
    поставщик.безопасности.НОМЕР=sun.security.pkcs11.SunPKCS11 /etc/java-<имя>.cfg
  3. Запустите keytool и убедитесь, что он отображает содержимое вашего HSM:
    keytool --list --storetype PKCS11
  4. Наконец, настройте Tomcat для использования PKCS#11:

    <Connector ...
               keystore="NONE"
               keystoreType="PKCS11"
               keystoreProvider="SunPKCS11-hsm_name"
               keystorePass="[HSM PIN here]" />
    

Использование модуля PKCS#11 с удаленного сервера

Thep11-комплектВ комплект поставки входят два компонента, которые позволяют достичь этого:

  1. Модуль p11-kit-proxy.soPKCS#11, который действует как мультиплексор и может быть настроен на загрузку различных других модулей в соответствии с конфигурацией. Помимо прочего, он может взаимодействовать с модулем вне процесса по каналу.

  2. Инструмент p11-kit remote, который действует как другой конец трубы для поддержки модуля p11-kit вне процесса. Его можно использовать через SSH или любой другой туннель.

Итак, сначала со стороны HSM:

  1. Установите p11-kit и выберите или создайте учетную запись пользователя, который будет его использовать.
  2. Создайте файл в этой учетной записи пользователя, чтобы сообщить p11-kit о вашем модуле HSM PKCS#11. Содержимое файла состоит из одной строки:~/.config/pkcs11/modules/<name>.module
    модуль: /usr/lib/<hsm_pkcs11_name>.так
    (В качестве альтернативы вы можете создать его в общесистемном каталоге /usr/share/p11-kit/modules/.)
  3. Обязательно p11-kit listработайте p11tool --list-tokensс HSM.

Примечание: шаги 2–3 на самом деле не нужны для этого плана; они только для того, чтобы возможные проблемы можно было заметить на ранней стадии. Если окажется, что p11-kit несовместим с модулем HSM, это сэкономит вам немного работы. (А если он совместим, то вы сможете использовать p11toolдля управления им.)

Затем со стороны Tomcat:

  1. Установите также p11-kit.
  2. Создайте пару ключей SSH для Tomcat и поместите ее в учетную запись HSM authorized_keysдля использования SSH без пароля.
  3. Снова создайте файл в домашнем каталоге учетной записи пользователя Tomcat, но на этот раз содержимое файла должно выглядеть следующим образом:~/.config/pkcs11/modules/<name>.module
    удаленный: |ssh пользователь@hsmserver p11-kit удаленный /usr/lib/<hsm_pkcs11_name>.так
  4. Опять же, убедитесь p11-kit listи p11tool --list-tokensработайте. Они должны просто волшебным образом установить SSH-соединение и показать информацию об удаленном HSM.
  5. Для ускорения удаленного доступа включите мультиплексирование соединений в SSH через ~/.ssh/config:
    Хозяинhsmсервер
    ControlPath ~/.ssh/S.%r@%h:%p
    ControlMaster авто
    ControlPersist 1h

Если все работает, попробуйте использовать keytoolс модулем p11-kit-proxy PKCS#11:

  1. Создайте /etc/java-p11-kit.cfgфайл с:
    имя = p11-kit 
    библиотека = /usr/lib/p11-kit-proxy.so
    (Измените путь к библиотеке в соответствии с вашим дистрибутивом. Полную документацию по этому конфигурационному файлу можно найти вРуководство по Java PKCS#11.)
  2. Добавьте новую строку в ваш java.securityфайл:
    поставщик.безопасности.НОМЕР=sun.security.pkcs11.SunPKCS11 /etc/java-p11-kit.cfg
  3. Запустите keytool и убедитесь, что он отображает содержимое вашего HSM:
    keytool --list --storetype PKCS11
  4. Наконец, настройте Tomcat для использования модуля p11-kit-proxy PKCS#11:

    <Connector ...
               keystore="NONE"
               keystoreType="PKCS11"
               keystoreProvider="SunPKCS11-p11-kit"
               keystorePass="[HSM PIN here]" />
    

Связанный контент