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

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

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

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

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

    genrsa -out ca_authority_prv.pem 2048

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

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

  • Сделать доверенным органом сертификата:

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

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

    echo 1000 > ca_authority.srl

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

    genrsa -out Client_prv.pem 2048

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

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

  • Подпишите запрос клиента с помощью CA:

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

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

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

Настройка IIS

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

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

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

  • Настройка IIS для использования сертификата сервера и требуемых сертификатов клиента

Запрос SOAP PHP

Это код, который я использую для установки запроса 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'

ERROR LOG

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

Ответ 1

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

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

2) Импортируйте файл центра сертификации сервера в хранилище сертификатов Machine под доверенным корнем. Вы можете получить это, используя команду 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) Создание запроса PHP SOAP (метод 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. Вы должны увидеть успешное соединение с сервисом с ответом, соответствующим ожидаемым результатам вашего

Метод веб-службы.