php, curl - работа с сертификатами

В процессе интеграции веб приложений с другими приложениями, зачастую, может возникнуть задача:

  • Идентифицировать удаленный сервер, используя сертификат .cer.
  • Идентифицировать себя для удаленного сервера, используя сертификат .pfx
  • Передать данные, используя curl


Для решения этой задачи средствами php – curl, нам требуется иметь сертификаты в формате: .crt и .pem

Воспользуемся программой openssl.
После скачивания и установки, переконвертируем сначала клиентский сертификат

V:\ssl\bin\openssl.exe pkcs12 -in V:\ssl\cert.pfx -out V:\ssl\cert.key
V:\ssl\bin\openssl.exe rsa -in V:\ssl\cert.key -out V:\ssl\cert.pem
V:\ssl\bin\openssl.exe x509 -in V:\ssl\cert.key >> V:\ssl\cert.pem


V:\ssl\ - путь где установлена программа openssl и там же лежат наши сертификаты.


После второй команды наc попросят указать наш текущий пароль и задать новый. Новый пароль, мы будем использовать далее.


А теперь серверный:

V:\ssl\bin\openssl.exe x509 -in V:\ssl\cert.cer -inform DER -out V:\ssl\cert.crt -outform PEM


Все готово. Теперь, используя CURL соединение, подключимся к удаленному серверу.
Например:

curl_setopt($ch, CURLOPT_URL, 'https://xxx.xxx.xxx.xxx/');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);



В настройках CURL-соединения следует указать:

curl_setopt($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CAINFO, 'путь к .crt файлу');
curl_setopt($ch, CURLOPT_SSLCERT, 'путь к .pem файлу');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'новый пароль');