$certFile = 'ful_path/yourcert.pem';
$context = stream_context_create();
$result = stream_context_set_option($context, 'ssl', 'local_cert',
$certFile);
$result = stream_context_set_option($context, 'ssl', 'verify_peer',
false);
$result = stream_context_set_option($context, 'ssl', 'verify_host',
false);
$result = stream_context_set_option($context, 'ssl',
'allow_self_signed', true);$sock = stream_socket_client('tls://www.somewhere.com:9999',
$errno,$errstr, 30, STREAM_CLIENT_CONNECT, $context);
добавили: www.somewhere.com к сертификатам сервера
удалили &$
проверил срок действия yourcert.pem
если не переводить весь код в curl, я застрял. это должно быть что-то настолько очевидное, как нос на моем лице … но что …
Во-первых, позвольте мне сказать это:
PHP5.6 по умолчанию использует хранилища сертификатов CA, управляемые вашей операционной системой. Если вы не подключаетесь к DNS-имени, которое предоставляет самозаверяющий сертификат или что-то подобное, вам, вероятно, вообще не нужен контекст SSL.
Прежде чем делать что-либо еще, попробуйте подключиться без всякого контекста ssl. Если сертификат удаленного сайта действителен и подписан любым стандартным центром сертификации, он должен «просто работать» автоматически в PHP 5.6.
Тем не менее … в вашем фрагменте кода есть несколько очень сомнительных вещей. Действительно невозможно понять, в чём заключается настоящая проблема, не зная больше о том, что вы пытаетесь сделать, поэтому я просто переберу все это.
$result = stream_context_set_option($context, 'ssl', 'local_cert',
$certFile);
^ Вы подключаетесь к сайту, который требует ВЫ предоставить сертификат, который проверяет удаленный сервер? Если нет (и это почти наверняка так), вы не должны указывать "local_cert"
вариант.
$result = stream_context_set_option($context, 'ssl', 'verify_peer',
false);
^ Это ужасная идея, поскольку она подвергает вас атакам «Человек посередине». Вам следует никогда делайте это, если вы не тестируете что-либо в одноразовом сценарии. НЕ ДЕЛАЙТЕ ЭТОГО.
$result = stream_context_set_option($context, 'ssl', 'verify_host',
false);
^ Это даже не вещь. Нет никаких "verify_host"
вариант в PHP.
$result = stream_context_set_option($context, 'ssl',
'allow_self_signed', true);
Итак … в общем, нет хорошего способа ответить на это с информацией, которую вы предоставили. Но я указал на очевидные проблемы …
Других решений пока нет …