Я хочу узнать, есть ли способ настроить 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 следующие:
- Создайте файл с:
/etc/java-<name>.cfg
имя =<hsm_name>
(Измените путь к библиотеке в соответствии с вашим дистрибутивом. Полную документацию по этому конфигурационному файлу можно найти вРуководство по Java PKCS#11.)
библиотека = /usr/lib/p11-kit-proxy.so - Добавьте новую строку в ваш
java.security
файл:поставщик.безопасности.НОМЕР=sun.security.pkcs11.SunPKCS11 /etc/java-<имя>.cfg
- Запустите keytool и убедитесь, что он отображает содержимое вашего HSM:
keytool --list --storetype PKCS11
Наконец, настройте Tomcat для использования PKCS#11:
<Connector ... keystore="NONE" keystoreType="PKCS11" keystoreProvider="SunPKCS11-hsm_name" keystorePass="[HSM PIN here]" />
Использование модуля PKCS#11 с удаленного сервера
Thep11-комплектВ комплект поставки входят два компонента, которые позволяют достичь этого:
Модуль
p11-kit-proxy.so
PKCS#11, который действует как мультиплексор и может быть настроен на загрузку различных других модулей в соответствии с конфигурацией. Помимо прочего, он может взаимодействовать с модулем вне процесса по каналу.Инструмент
p11-kit remote
, который действует как другой конец трубы для поддержки модуля p11-kit вне процесса. Его можно использовать через SSH или любой другой туннель.
Итак, сначала со стороны HSM:
- Установите p11-kit и выберите или создайте учетную запись пользователя, который будет его использовать.
- Создайте файл в этой учетной записи пользователя, чтобы сообщить p11-kit о вашем модуле HSM PKCS#11. Содержимое файла состоит из одной строки:
~/.config/pkcs11/modules/<name>.module
модуль: /usr/lib/<hsm_pkcs11_name>.так
(В качестве альтернативы вы можете создать его в общесистемном каталоге/usr/share/p11-kit/modules/
.) - Обязательно
p11-kit list
работайтеp11tool --list-tokens
с HSM.
Примечание: шаги 2–3 на самом деле не нужны для этого плана; они только для того, чтобы возможные проблемы можно было заметить на ранней стадии. Если окажется, что p11-kit несовместим с модулем HSM, это сэкономит вам немного работы. (А если он совместим, то вы сможете использовать p11tool
для управления им.)
Затем со стороны Tomcat:
- Установите также p11-kit.
- Создайте пару ключей SSH для Tomcat и поместите ее в учетную запись HSM
authorized_keys
для использования SSH без пароля. - Снова создайте файл в домашнем каталоге учетной записи пользователя Tomcat, но на этот раз содержимое файла должно выглядеть следующим образом:
~/.config/pkcs11/modules/<name>.module
удаленный: |ssh пользователь@hsmserver p11-kit удаленный /usr/lib/<hsm_pkcs11_name>.так
- Опять же, убедитесь
p11-kit list
иp11tool --list-tokens
работайте. Они должны просто волшебным образом установить SSH-соединение и показать информацию об удаленном HSM. - Для ускорения удаленного доступа включите мультиплексирование соединений в SSH через
~/.ssh/config
:Хозяинhsmсервер
ControlPath ~/.ssh/S.%r@%h:%p
ControlMaster авто
ControlPersist 1h
Если все работает, попробуйте использовать keytool
с модулем p11-kit-proxy PKCS#11:
- Создайте
/etc/java-p11-kit.cfg
файл с:имя = p11-kit
(Измените путь к библиотеке в соответствии с вашим дистрибутивом. Полную документацию по этому конфигурационному файлу можно найти вРуководство по Java PKCS#11.)
библиотека = /usr/lib/p11-kit-proxy.so - Добавьте новую строку в ваш
java.security
файл:поставщик.безопасности.НОМЕР=sun.security.pkcs11.SunPKCS11 /etc/java-p11-kit.cfg
- Запустите keytool и убедитесь, что он отображает содержимое вашего HSM:
keytool --list --storetype PKCS11
Наконец, настройте Tomcat для использования модуля p11-kit-proxy PKCS#11:
<Connector ... keystore="NONE" keystoreType="PKCS11" keystoreProvider="SunPKCS11-p11-kit" keystorePass="[HSM PIN here]" />