Создание запроса SOAP PHP с сертификатом

Я пытаюсь создать соединение PHP SOAP с веб-службой .NET, у которой есть самозаверяющий сертификат, чтобы заблокировать службу для связи через HTTPS. Я продолжаю получать ошибки, и я не уверен, связано ли это с тем, как я создаю сертификат, настройку Apache / PHP, как пытаюсь установить SOAP-запрос или что-то еще. Если у кого есть какие-то указатели, они будут очень благодарны. Заранее спасибо.

Создание сертификата

Вот как я создаю сертификат.

  1. Создайте доверенный закрытый закрытый ключ:

    genrsa -out ca_authority_prv.pem 2048

  2. Создайте доверенный корневой сертификат:

    req -new -key ca_authority_prv.pem -x509 -out ca_authority_cert.pem

  3. Сделать доверенное лицо сертификата доверенным:

    x509 -in ca_authority_cert.pem -out ca_authority_trust.pem -trustout

  4. Выйдите из OpenSSL и создайте серийный файл:

    echo 1000> ca_authority.srl

  5. Создайте закрытый ключ клиента:

    genrsa -out Client_prv.pem 2048

  6. Создайте запрос клиента:

    req -new -key Client_prv.pem -out Client_req.pem

  7. Подпишите запрос клиента в ЦС:

    x509 -req -CA ca_authority_trust.pem -CAserial ca_authority.srl -CAkey ca_authority_prv.pem-in Client_req.pem -out Client_cert.pem

  8. Сделать pfx для сертификата клиента

    pkcs12 -export -in Client_cert.pem -inkey Client_prv.pem -out Client_cert.pfx

Настройка IIS

После создания этого сертификата я выполняю те же действия для сертификата сервера и:

  1. Добавьте доверенный корневой центр сертификации в надежный корневой магазин

  2. Добавление сертификата сервера в хранилище

  3. Установите IIS для использования сертификата сервера и потребуйте сертификаты клиента

Запрос PHP SOAP

Это код, который я использую для установки запроса SOAP PHP (ниже приведена ошибка):

$wsdl = "https://localhost/MyService/MyService.asmx"; $local_cert = "C:\\Certs\client_cert.pem"; $passphrase = "openSaysMe"; $soapClient = new SoapClient($wsdl, array('local_cert'=> $local_cert,'passphrase'=>$passphrase)); $theResponse = $soapClient->test(); 

ОШИБКА

 Warning: SoapClient::SoapClient() [soapclient.soapclient]: Unable to set private key file `C:\Certs\client_cert.pem' in C:\Program Files\Apache Group\Apache2\htdocs\soapWithAuth.php on line 53 Warning: SoapClient::SoapClient() [soapclient.soapclient]: failed to create an SSL handle in C:\Program Files\Apache Group\Apache2\htdocs\soapWithAuth.php on line 53 Warning: SoapClient::SoapClient() [soapclient.soapclient]: Failed to enable crypto in C:\Program Files\Apache Group\Apache2\htdocs\soapWithAuth.php on line 53 Warning: SoapClient::SoapClient(https://localhost/MyService/MyService.asmx) [soapclient.soapclient]: failed to open stream: operation failed in C:\Program Files\Apache Group\Apache2\htdocs\soapWithAuth.php on line 53 Warning: SoapClient::SoapClient() [soapclient.soapclient]: I/O warning : failed to load external entity "https://localhost/MyService/MyService.asmx" in C:\Program Files\Apache Group\Apache2\htdocs\soapWithAuth.php on line 53 Error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://localhost/MyService/MyService.asmx' 

ЖУРНАЛ ОШИБОК

 PHP Warning: SoapClient::SoapClient() [<a href='soapclient.soapclient'>soapclient.soapclient</a>]: failed to create an SSL handle in C:\\Program Files\\Apache Group\\Apache2\\htdocs\\soapWithAuth.php on line 54 

Мне удалось получить эту работу, но есть некоторые странности, о которых мне интересно. В частности, необходимость объединить клиентский сертификат и закрытый ключ в один файл для отправки вместе с запросом на мыло, а также с парольной фразой сертификата, была нарушена просьба, хотя в документации по ядру PHP явно включена эта опция. Если у кого-то есть информация о том, как улучшить это, я бы хотел его услышать.

1) Создайте сертификаты клиента и сервера OpenSsl и подпишите их с помощью центра сертификации. При создании сертификата не присваивайте им кодовую фразу, просто нажмите кнопку ввода в этой точке.

2) Импортируйте файл центра сертификации сервера в хранилище сертификатов машины под доверенным корнем. Вы можете получить это, используя команду MMC в командной строке, а затем добавьте оснастку «Сертификаты».

3) Импортировать сертификат сервера в хранилище личных хранилищ личных данных

4) Импортировать сертификат клиента в локальную учетную запись Личный магазин. Вы можете сделать это, набрав certmgr.msc в командной строке.

5) Убедитесь, что Apache имеет версию PHP для PHP. Если у вас уже установлена ​​не PHP-версия PHP, вы можете выполнить следующие шаги, чтобы настроить сервер Apache для работы с использованием SSL.

Внутри httpd.conff

 a) Remove the comment '#' at line : LoadModule ssl_module modules/mod_ssl.so b) Remove the comment '#' at the line inside `<IfModule ssl_module>`: Include /extra/httpd-ssl.conf and move this line after the block `<IfModule ssl_module>…. </IfModule>` 

Внутри php.ini

 c) Remove the comment ';' at the line which says: extension=php_openssl.dll 

6) Настройте IIS для использования сертификата и SSL, используя следующие шаги:

 a) Right click the 'Default Website' node choose 'Properties' b) 'Directory Security' tab 'Server Certificate' button. Follow the wizard to select the certificate you imported into the store then complete the wizard and return to the 'Directory Security' tab. c) Under 'Secure Communications' select the 'Edit' button. d) Check the 'Require Secure Channel (SSL) checkbox. 

7) Создание запроса SOAP PHP (метод test () должен быть допустимым методом в вашей веб-службе):

 $wsdl = "https://localhost/MyService/myservices.asmx?wsdl"; $local_cert = "C:\\SoapCerts\ClientKeyAndCer.pem"; $soapClient = new SoapClient($wsdl, array('local_cert' => $local_cert)); $theResponse = $soapClient->test(); 

8) Поместите этот файл в каталог Apache. По умолчанию: 'C: \ Program Files \ Apache Group \ Apache2 \ htdocs'

9) Вам потребуется доступ к сертификату клиента. В шагах, которые вы предприняли для создания сертификатов клиентов и серверов, вы также создали файлы закрытого ключа. Откройте client_prv.pem (файл закрытого ключа клиента) и скопируйте содержимое в новый документ с помощью текстового редактора. Вероятно, более безопасно использовать что-то вроде Textpad, который, надеюсь, не добавит кучу специальных символов, синтаксические анализаторы очень разборчивы. Сразу после того, как частная ключевая часть разместит содержимое клиентского сертификата (client_cer.pem), чтобы полученный файл был неэкспериментированной копией закрытого ключа клиента и клиента

сертификат. Сохраните полученный файл в каталог, который вы можете получить из файла php. В приведенном выше примере результирующий файл

Файл C: \ SoapCerts \ ClientKeyAndCer.pem.

9) Перейдите к localhost / nameOfYourFile.php. Вы должны увидеть успешное подключение к службе с ответом, соответствующим ожидаемым результатам вашего

Метод веб-сервиса.