Problem z PHP SoapClient i SSL - crypto enabling timeout

Programowanie

Operując klasą SoapClient w celu połączenia się z web serwisem opatrym o SOAP poprzez protokół https/ssl, możemy natknąć się na dość enigmatyczny błąd, który może przyprawić nas o ból głowy. Co więcej pojawia się on tylko na specyficznych systemach operacyjnych z rodziny Linux...


Operując klasą SoapClient w celu połączenia się z web serwisem opatrym o SOAP poprzez protokół https/ssl, możemy natknąć się na dość enigmatyczny błąd, który może przyprawić nas o ból głowy. Co więcej pojawia się on tylko na specyficznych systemach operacyjnych z rodziny Linux - najczęściej Ubuntu i wynika on z błędu biblioteki openssl.

Przykładowo:

$soap = new SoapClient('https://domena.pl/wsdl');

Może w rezultacie dać taki oto błąd:

PHP Warning: SoapClient::SoapClient(): SSL: crypto enabling timeout in ... on line ...
PHP Warning: SoapClient::SoapClient(): Failed to enable crypto in ...

Jeśli serwer HTTPS ma wsparcie jedynie dla TLS 1.0 (nie kolejnych wersji czyli 1.1-2), SSLv2 lub SSLv3, gdzie w szczególności używa się szyfrów RC4-SHA można obejść ten problem w następujący sposób:

$soap = new SoapClient('https://domena.pl/wsdl', [
	'stream_context' => stream_context_create([
		'ssl' => [
			'ciphers' => 'RC4-SHA'
		]
	])
]);

Cały trik z obejściem wyżej wspomnianego błędu polega na zastąpieniu domyślnego kontekstu przy wywołaniu klasy SoapClient, swoim z dodatkową opcją zastosowania szyfrów RC4-SHA. To powinno skutecznie rozwiązać problem i zaoszczędzić wam dobrych kilka godzin szukania igły w stogu siana.

Opublikowano Czerwiec 2015