/ / PHP stream_socket_client vs. cURL w TCP SSL - php, ssl, curl

PHP stream_socket_client vs. cURL w TCP SSL - php, ssl, curl

Mam problem z używaniem cURL do POST XML na adres TCP z SSL. Muszę przekazać certyfikat SSL w żądaniu, który zawiera klucz prywatny + certyfikat, aby zweryfikować siebie.

Właśnie uruchomiłem test z użyciem biblioteki stream_socket_client() i używa stream_context_set_option aby dodać opcję local_cert w którym przekazuje certyfikat. Teraz mogę zweryfikować się za pomocą tej metody, ale nie mogę tego zrobić w cURL. Wszystko co dostaję to connection reset by peer błąd, co oznacza, że ​​weryfikacja certyfikatu nie powiodła się. Jaka jest różnica? Czy muszę zrezygnować z cURL, ponieważ byłoby to (moim zdaniem) znacznie czystsze rozwiązanie.

$content jest poprawnym XML.

    $headers = [
"Content-type: text/xml",
"Content-length: " . strlen($content),
"Connection: close",
];

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, "epptest.ficora.fi");
curl_setopt($curl, CURLOPT_PORT, 700);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $content);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSLCERT, __DIR__ . "/certificate.pem");
curl_setopt($curl, CURLOPT_SSLCERTTYPE, "PEM");

$output = curl_exec($curl);

echo "Error " . curl_errno($curl) . ": "" . curl_error($curl) .""";

var_dump($output);

pełne cURL:

 * Rebuilt URL to: epptest.ficora.fi/
* Hostname in DNS cache was stale, zapped
*   Trying 87.239.122.59...
* Connected to epptest.ficora.fi (87.239.122.59) port 700 (#0)
> POST / HTTP/1.1
Host: epptest.ficora.fi:700
Accept: */*
Content-type: text/xml
Content-length: 406
Connection: close

* upload completely sent off: 406 out of 406 bytes
* Recv failure: Connection was reset
* Closing connection 0

Odpowiedzi:

0 dla odpowiedzi № 1
curl_setopt($curl, CURLOPT_URL, "epptest.ficora.fi");

Twój adres URL nie zawiera takiej metody http:// lub https://. W tym przypadku zakłada się cURL http:// tylko i próbuje połączyć się bezpośrednio z serwerem,tzn. bez uzgadniania SSL. Można to wyraźnie zobaczyć z pełnego wyjścia cURL. Aby to naprawić, użyj poprawnego adresu URL, tj. Użyj poprawnej metody na początku adresu URL.