Nginx Передать клиентский сертификат в PHP

yakov

Новичок
Пытаюсь сделать авторизацию по самоподписанным сертификатам в своем API.
Дошел до проверки сертификата на сервере и немного завис. Хотел сделать проверку сертификатов на уровне PHP через OpenSSL, но не могу передать через nginx нужные fastcgi_param.
Нашел кучу статей как сделать проверку на уровне nginx, но ни одной, как просто передать сертификаты в PHP.
На стороне клиента передаю через curl подписанные сервером клиентские сертификаты так:


Код:
        $opts[CURLOPT_CAPATH] = '';
        $opts[CURLOPT_CAINFO] = realpath(SRC_DIR .'/../etc/ssl/root_CA.crt');
        $opts[CURLOPT_SSLCERT] = realpath(SRC_DIR .'/../etc/ssl/client.crt');
        $opts[CURLOPT_SSLCERTPASSWD] = '';
        $opts[CURLOPT_SSLKEY] = realpath(SRC_DIR .'/../etc/ssl/client.key');
плюс ставлю:

Код:
            CURLOPT_SSL_VERIFYHOST => 0,
            CURLOPT_SSL_VERIFYPEER => 0,
Не подскажите, можно ли на nginx обойтись без проверки сертификата на уровне веб-сервера и передать их в FastCGI - в манах не нашел.
 

Активист

Активист
Команда форума
1. Что значит передать сертификаты в PHP ? Вы же организовываете SSL канал, PHP о сертификатах при SSL ничего не знает и знать не может. Public сертификаты юзера аттачатся как вложение (или передаются обычным POST) и далее работаете с ним через openssl, например для проверки подписи. Кто подписывает данные должен предоставить public сертификат , что бы вы его использовали при проверки ЭЦП (public сертификат центра сертификации хранится у вас на сервере). При этом на стороне юзера для шифрования используется его приватный ключ. Проверку подписи ЦС его публичного сертификата выполнить не забудьте.

2. Если у вас в цепочке нет ЦС, и вы сами организовываете ЦС, то вы генерируете пару публичный/приватный ключ на основе приватного ключа ЦС (подпись ЦС), публичный ключ ЦС выдаете в паблик. Сгенерированные публичный/приватный ключ отдаете юзеру. При этом при проверки подписи из п. 1, используете публичный ключ ЦС. Сервера ЦС и сервера проверки должны быть разными. Или вообще сервера ЦС могут быть не подключены к интернету.
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
в nginx
fastcgi_param SSL_CLIENT_S_DN $ssl_client_s_dn;

в php
PHP:
            $c = explode('/',$_SERVER['SSL_CLIENT_S_DN']);
            $certificate_details = array();
            foreach ($c as $k=>$v){
                if (!strpos($v,'=')){
                    continue;
                }
                list($key,$value) = explode('=',$v,2);
                $certificate_details[$key]=$value;
 
Сверху