PHP Soapcall с подписанным сертификатом - PullRequest
0 голосов
/ 17 января 2020

Я пытался заставить это работать, но, похоже, ничего не работает вообще ...

В настоящее время у меня есть служба SOAP (от правительства), где я не могу ничего изменить , Теперь у меня есть SOAP вызов, работающий в SoapUI, но мне нужно, чтобы это работало в коде (php).

Теперь, что они ожидают от меня, чтобы вызов "работающий" был в SoapUI должен иметь так называемую «конфигурацию безопасности WS». Я настроил это следующим образом:

WS-Security configuration

WSS-запись Timestamp имеет всего TTL 60, с точностью до миллисекунд.

Теперь необходимо выполнить настройку запроса WSS (там у меня сделано хранилище ключей)

Как только я go добавлю к запросу, мне просто нужно добавить следующее тело:

Request preview

Теперь я получил ответ, который просто работает как брелок, скажем, в SoapUI (5.5.0).

Когда я пытаюсь сделать то же самое Точная вещь в PHP, она не работает ... Я нашел действительно старый класс, который должен фактически аутентифицировать вызов, используя ключ PEM и пароль для этого сертификата ...

Я думаю, что работает, (хотя не уверен)

Код, который я нашел и изменил, следующий:

https://gitlab.com/snippets/1930847

Теперь я вызываю код с использованием следующего кода:

$client_options = [
            'ssl' => [
                'cert' => storage_path('checkinatwork/keystore.p12'),
                'certpasswd' => 'MY_PASSWORD_OF_THE_KEY'
            ]
        ];
        $client = new SignedSoapClient('https://www.url.be/registry/dbffff0b-ed82-4ac5-8422-826bad0fbcd6/SecurityTokenService/1.0/be/socialsecurity/sts/v1/SecurityTokenService_v1.wsdl', $client_options);

        $client->__setLocation('https://url.be/SecurityTokenService/v1');
        $request = $client->__soapCall('RequestSecurityToken', []);
        return $request->__getLastRequest();

Ответ, который я получаю от сервера, следующий (я использую код внутри команды Laravel, поэтому я добавил опцию -v.

* Expire in 0 ms for 6 (transfer 0x555976dc88a0)
* Expire in 1 ms for 1 (transfer 0x555976dc88a0)
* Expire in 0 ms for 1 (transfer 0x555976dc88a0)
* Expire in 2 ms for 1 (transfer 0x555976dc88a0)
* Expire in 0 ms for 1 (transfer 0x555976dc88a0)
* Expire in 1 ms for 1 (transfer 0x555976dc88a0)
* Expire in 4 ms for 1 (transfer 0x555976dc88a0)
* Expire in 1 ms for 1 (transfer 0x555976dc88a0)
* Expire in 1 ms for 1 (transfer 0x555976dc88a0)
* Expire in 4 ms for 1 (transfer 0x555976dc88a0)
* Expire in 2 ms for 1 (transfer 0x555976dc88a0)
* Expire in 2 ms for 1 (transfer 0x555976dc88a0)
* Expire in 4 ms for 1 (transfer 0x555976dc88a0)
* Expire in 3 ms for 1 (transfer 0x555976dc88a0)
* Expire in 3 ms for 1 (transfer 0x555976dc88a0)
* Expire in 8 ms for 1 (transfer 0x555976dc88a0)
* Expire in 4 ms for 1 (transfer 0x555976dc88a0)
* Expire in 4 ms for 1 (transfer 0x555976dc88a0)
* Expire in 16 ms for 1 (transfer 0x555976dc88a0)
* Expire in 7 ms for 1 (transfer 0x555976dc88a0)
* Expire in 7 ms for 1 (transfer 0x555976dc88a0)
* Expire in 16 ms for 1 (transfer 0x555976dc88a0)
* Expire in 9 ms for 1 (transfer 0x555976dc88a0)
* Expire in 9 ms for 1 (transfer 0x555976dc88a0)
* Expire in 16 ms for 1 (transfer 0x555976dc88a0)
* Expire in 10 ms for 1 (transfer 0x555976dc88a0)
* Expire in 10 ms for 1 (transfer 0x555976dc88a0)
* Expire in 16 ms for 1 (transfer 0x555976dc88a0)
* Expire in 14 ms for 1 (transfer 0x555976dc88a0)
* Expire in 14 ms for 1 (transfer 0x555976dc88a0)
* Expire in 16 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 16 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 32 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 32 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 64 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 64 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 64 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 50 ms for 1 (transfer 0x555976dc88a0)
* Expire in 200 ms for 1 (transfer 0x555976dc88a0)
*   Trying 85.91.178.151...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x555976dc88a0)
* Connected to domain.be (IP) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: CERTIFICATE_RESPONSE_DATA
*  start date: Nov  5 10:16:25 2018 GMT
*  expire date: Nov  5 10:26:00 2020 GMT
*  subjectAltName: host "domain.be" matched cert's "domain.be"
*  issuer: ISSUER DATA
*  SSL certificate verify ok.
> POST /SecurityTokenService/v1 HTTP/1.1
Host: domain.be
Accept: */*
Content-Length: 370
Content-Type: multipart/form-data; boundary=------------------------887f9c2af3ff5bf8

< HTTP/1.1 500 Internal Server Error
HTTP/1.1 500 Internal Server Error
< Date: Fri, 17 Jan 2020 08:27:27 GMT
Date: Fri, 17 Jan 2020 08:27:27 GMT
< Server: Apache
Server: Apache
< Content-Length: 349
Content-Length: 349
< X-Powered-By: Servlet/2.5 JSP/2.1
X-Powered-By: Servlet/2.5 JSP/2.1
< Connection: close
Connection: close
< Content-Type: text/xml; charset=utf-8
Content-Type: text/xml; charset=utf-8

<
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Fault><faultcode xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512">wst:RequestFailed</faultcode><faultstring>The specific request failed</faultstring></soapenv:Fault></soapenv:Body></soapenv:Envelope>* Closing connection 0

Итак, я получил действительно описательный ответ об ошибке ... Я должен быть в состоянии получить такой же, точный запрос и ответ в PHP, как если бы я имел в SoapUI.

Есть ли у кого-нибудь идея о том, как решить эту проблему?

Я также получаю тогда, когда запрос будет завершен, следующая ошибка:

SoapFault : SoapClient::__doRequest() returned non string value

Но это будет я думаю, что это будет позже.

Поэтому моя главная цель в этом вопросе - получить такой же запрос и хороший ответ, как если бы я использовал SoapUI.

Заранее спасибо!

1 Ответ

0 голосов
/ 18 января 2020

SoapClient PHP не может обрабатывать файлы сертификата p12. Вы должны преобразовать его в файл pem. Для этой цели вы можете использовать oppenssl toolkit .

После установки вы можете преобразовать файл сертификата p12 с помощью следующей команды CLI

openssl pkcs12 -in mycert.p12 -out mycert.pem -nodes -clcerts

После преобразования в pem file измените параметры SoapClient ssl.

$options = [
    'local_cert' => dirname(__FILE__) . 'mycert.pem',
    'athentication' => SOAP_ATHENTICATION_DIGEST
];

$client = new SoapClient(
    $wsdl,
    $options
);

Если вы хотите сохранить закрытый ключ и файл сертификата отдельно, используйте следующий пример.

$context = stream_context_create([
    'ssl' => [
        'local_cert' => '/path/to/cert/file',
        'local_pk'   => '/path/to/private/key'
    ]
]);

$client = new \SoapClient($wsdl, [
    'stream_context' => $context,
    // other options
]);

Надеюсь, это немного поможет ...

...