Создание PHP SOAP-запроса с сертификатом - PullRequest
10 голосов
/ 22 августа 2011

Я пытаюсь создать соединение 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. Подпишите запрос клиента с помощью 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

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

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

Настройка IIS

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

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

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

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

Запрос PHP SOAP

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

$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'

ОШИБКА 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 Ответ

14 голосов
/ 23 августа 2011

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

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

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

3) Импортируйте сертификат сервера в хранилище компьютеров Личное хранилище сертификатов

4) Импортсертификат клиента в локальном аккаунте Личного магазина.Вы можете сделать это, набрав 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 Files \ Apache Group \ Apache2 \ htdocs'

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

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

'C: \ SoapCerts \ ClientKeyAndCer.pem'.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...