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

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

сертификат Поколение

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

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

    genrsa-out ca_authority_prv.pem 2048

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

    req-new-key ca_authority_prv.Пэм-x509-на-из ca_authority_cert.Пем!--4-->

  3. сделайте доверенный авторитет сертификата:

    x509-на-в ca_authority_cert.pem-out ca_authority_trust.Пэм-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.Пем!--4-->

  7. подпишите запрос клиента с CA:

    x509-req-CA ca_authority_trust.pem-CAserial ca_authority.srl-CAkey ca_authority_prv.pem-in Client_req.pem-out Client_cert.Пем!--4-->

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

    формате pkcs12 -экспорт -в Client_cert.pem-inkey Client_prv.pem-out Client_cert.pfx-файл

в IIS Setup

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

  1. добавьте доверенный корневой ЦС в хранилище доверенных корневых компьютеров

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

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

PHP SOAP запрос

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

$wsdl = "https://localhost/MyService/MyService.asmx";
$local_cert = "C:Certsclient_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:Certsclient_cert.pem' in C:Program FilesApache GroupApache2htdocssoapWithAuth.php on line 53

Warning: SoapClient::SoapClient() [soapclient.soapclient]: failed to create an SSL handle in C:Program FilesApache GroupApache2htdocssoapWithAuth.php on line 53

Warning: SoapClient::SoapClient() [soapclient.soapclient]: Failed to enable crypto in C:Program FilesApache GroupApache2htdocssoapWithAuth.php on line 53

Warning: SoapClient::SoapClient(https://localhost/MyService/MyService.asmx) [soapclient.soapclient]: failed to open stream: operation failed in C:Program FilesApache GroupApache2htdocssoapWithAuth.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 FilesApache GroupApache2htdocssoapWithAuth.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 FilesApache GroupApache2htdocssoapWithAuth.php on line 54

1 ответов


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

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

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

3) импортируйте сертификат сервера в персональный сертификат хранилища машины магазин

4) импортируйте сертификат клиента в локальную учетную запись Personal store. Вы можете сделать это, введя команду certmgr.MSC в командной строке.

5) убедитесь, что Apache с SSL-версией 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 файлы\группу Apache\помощью apache2\htdocs в'

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

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

'.файл PEM'.

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

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