Вопрос или проблема
Я пытаюсь следовать этому руководству https://p11-glue.github.io/p11-glue/p11-kit/manual/remoting.html. Раньше у меня возникали проблемы с настройкой, но спасибо за ответ здесь ссылка, я смог использовать p11-remote. Однако возникла новая проблема.
После создания ключа и сертификата. Приватный ключ хранится на удаленном хосте. Я получаю доступ к нему через p11-kit-client
. Я хотел бы использовать их в конфигурации nginx. Однако возникла ошибка: (../nginx/error.log
)
2024/11/03 16:58:51 [emerg] 1237#1237: cannot load certificate key "engine:pkcs11:pkcs11:model=SoftHSM%20v2;token=mimi;object=test-key;type=private": ENGINE_load_private_key() failed (SSL: error:40000065:pkcs11 engine::object not found error:13000080:engine routines::failed loading private key)
2024/11/03 16:59:51 [debug] 1244#1244: bind() 0.0.0.0:10001 #8
2024/11/03 16:59:51 [debug] 1244#1244: counter: 00007FBE28745080,
Показано, что nginx не может загрузить ключ. Я дважды проверил с помощью openssl.
openssl req -engine pkcs11 -keyform engine -key "pkcs11:model=SoftHSM%20v2;token=mimi;object=test-key;type=private" -new -sha512 -out csr/nginx-test.csr -config req-proxy.cnf
Engine "pkcs11" set.
и
openssl s_client -connect host.docker.internal:443 \
-engine pkcs11 \
-keyform engine \
-key "pkcs11:model=SoftHSM%20v2;token=mimi;object=test-key;type=private" \
-cert /etc/ssl/certs/bundle.proxytest.crt
чтобы проверить, что OPENSSL может загрузить test-key
.
ЗАМЕТКИ:
- Команда генерации ключа выполнена на локальном хосте, затем я дважды проверил существование на удаленном сервере, просмотрев объекты (
p11tool
) ssh
соединения активированы. Openssl загрузил ключ через активный сокет pkcs11.- Я пробовал nginx с обычным файлом ключа, чтобы убедиться, что nginx работает с обычным файлом ключа.
- Версия Openssl 3.0.2. Она работает с
pkcs11
движком. nginx -t
возвращает OK.
Конфигурационный файл nginx:
error_log /var/log/nginx/error.log debug;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
ssl_engine pkcs11;
http {
upstream nginx_server_backend {
server nginx-server:10000;
keepalive 512;
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 10001 ssl;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_certificate /etc/ssl/certs/bundle.proxy.crt;
ssl_certificate_key "engine:pkcs11:pkcs11:model=SoftHSM%20v2;token=mimi;object=test-key;type=private";
}
access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/ssl_handshake.log ssl_handshake;
include /etc/nginx/conf.d/*.conf;
}
Спасибо за вашу поддержку заранее.
Ответ или решение
Возможные Причины Ошибки NGINX при Загрузке Закрытого Ключа через Unix-Socket
В данной ситуации проблема, с которой вы столкнулись, заключается в том, что NGINX не может загрузить приватный ключ через механизм PKCS#11, несмотря на успешное выполнение аналогичной операции с использованием OpenSSL. Давайте рассмотрим причины и возможные решения этой проблемы.
1. Верификация Конфигурации NGINX
Для начала убедитесь, что вы правильно настроили конфигурацию NGINX. Убедитесь, что директивы ssl_certificate
и ssl_certificate_key
указаны правильно. Например:
ssl_certificate /etc/ssl/certs/bundle.proxy.crt;
ssl_certificate_key "engine:pkcs11:pkcs11:model=SoftHSM%20v2;token=mimi;object=test-key;type=private";
Обратите внимание на правильность формата указания ключа. Вероятно, стоит проверить, что URL кодирование (например, %20
вместо пробела) действительно корректно обработано NGINX.
2. Уровень Дохода Доступа
Убедитесь, что у пользователя, под которым запускается NGINX, есть все необходимые права для доступа к вашему движку PKCS#11. На уровне ОС (например, через chmod
и chown
) можно назначить соответствующие права доступа к сокету. Вы также можете выполнить тест на уровне прав, запустив NGINX от имени пользователя, который успешно использует OpenSSL.
3. Версии и Совместимость
Вы упомянули, что используете NGINX и OpenSSL версии 3.0.2. Проверьте совместимость версии OpenSSL с версией NGINX. Также стоит удостовериться, что версия NGINX была собрана с поддержкой PKCS#11. Сделать это можно с помощью команды:
nginx -V
В выводе проверьте наличие --with-http_ssl_module
и --with-openssl
с версией, которую вы используете.
4. Отладка и Логи
Проведите дополнительную отладку, увеличив уровень логирования. В вашем конфигурационном файле NGINX указано:
error_log /var/log/nginx/error.log debug;
Изучите логи на предмет дополнительных ошибок, которые могли бы указать на проблемы с посещением сокета или с настройками самой системы.
5. Применение OpenSSL
Интересно отметить, что OpenSSL успешно работает с вашей конфигурацией, и это может указывать на особенности взаимодействия NGINX и указанного движка PKCS#11. Временами помогает простая перезагрузка NGINX после внесения изменений в конфигурацию вакансии.
Заключение
Вам следует последовательно проверить права доступа, конфигурацию, версии и улучшить логирование. Этот подход поможет вам выявить источник проблемы с загрузкой закрытого ключа в NGINX, ориентируясь при этом на успешные тесты с использованием OpenSSL. Понимание той тонкой грани, через которую проходят множество компонентов системы, поможет вам минимизировать время на отладку и получить работоспособное решение.