Преобразование сертификата для подписи ГИС ЖКХ

Дано: флешка с сертификатом для подписи сообщений для ГИС ЖКХ,

Задача: выдернуть с рутокена контейнер в формате p12 и расчленить его на сертификат+открытый ключ+закрытый ключ. Задачу уже подобную год назад решал, но как оказалось мануал который сам для себя тогда делал немножко не точный. Потому обновлю.

Решение:

  1. Для получения файла с токена необходимо воспользоваться P12FromGostCSP
  2. Сертификат: openssl pkcs12 -in p12.pfx -clcerts -nokeys -out public.crt
  3. Публичный ключ: openssl x509 -in public.crt -out public.pem -outform PEM
  4. Закрытый ключ без пароля: openssl pkcs12 -in p12.pfx -nocerts -out key.pem -nodes

PHP: Использование CURL с сертифкатом

Задача: Некий удаленный ресурс проверяет сертификат пользователя, при попытке получить с него данные. В наличии только стандартные сертификаты выданные LetEncrypt.

Решение:

Сертификаты необходимо сконвертировать. В наличии:

  • sert.crt — сертификат домена в PEM формате
  • sert.key — приватный ключ PEM формате

Конвертируем используя промежуточную конвертацию в формат p12:

openssl pkcs12 -export -in sert.crt -inkey sert.key -out sert.p12
openssl pkcs12 -in sert.p12 -nodes -out result.pem

По итогу получили файл result.pem. Далее его и будем использовать при работе с curl:

$ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, "https://некий ресурс");    
                curl_setopt($ch, CURLOPT_SSLCERT, WUO_ROOT."result.pem" );
                curl_setopt($ch,CURLOPT_SSLCERTTYPE,"PEM");
                curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
                curl_setopt($ch, CURLOPT_POST, True);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                $post=http_build_query($post, '', '&');
                curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
                curl_setopt($ch, CURLOPT_VERBOSE, true);
                $result = curl_exec($ch);
                curl_close($ch);   

Запрос выбора SSL сертификата в компоненте WebView

Задача: при открытии страницы https необходимо позволить пользователю выбрать необходимый сертификат ssl из установленых в хранилище.

Решение: