p11-forwarding: NGINX не может загрузить закрытый ключ на удаленном сервере через unix-сокет, но openssl может.

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

Я пытаюсь следовать этому руководству 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.

ЗАМЕТКИ:

  1. Команда генерации ключа выполнена на локальном хосте, затем я дважды проверил существование на удаленном сервере, просмотрев объекты (p11tool)
  2. ssh соединения активированы. Openssl загрузил ключ через активный сокет pkcs11.
  3. Я пробовал nginx с обычным файлом ключа, чтобы убедиться, что nginx работает с обычным файлом ключа.
  4. Версия Openssl 3.0.2. Она работает с pkcs11 движком.
  5. 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. Понимание той тонкой грани, через которую проходят множество компонентов системы, поможет вам минимизировать время на отладку и получить работоспособное решение.

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

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