В процессе интеграции веб приложений с другими приложениями, зачастую, может возникнуть задача:
- Идентифицировать удаленный сервер, используя сертификат .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\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_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, 'новый пароль');
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, 'новый пароль');