Справочная информация:
В некоторых PHP-кодах, связанных с сторонним веб-сервисом, работает следующий код:
// connect to web-service
$remote_addr = "tcp://{$data['ip']}:{$data['port']}";
$socket = stream_socket_client($remote_addr, $errno, $errstr, 30);
if (!$socket) throw "Couldn't create socket: $errstr\n";
// configure SSL options on socket
stream_context_set_option($socket, 'ssl', 'local_cert', $data['cert']);
stream_context_set_option($socket, 'ssl', 'verify_peer', false);
stream_context_set_option($socket, 'ssl', 'allow_self_signed', true);
stream_context_set_option($socket, 'ssl', 'cafile', $data['cafile']);
// do SSL handshake
stream_set_blocking ($socket, true);
stream_socket_enable_crypto ($socket, true, STREAM_CRYPTO_METHOD_SSLv3_CLIENT);
stream_set_blocking ($socket, false);
//... start talking HTTP
Далее мы завернем этот код PHP в наш собственный веб-сервис JSON-RPC, чтобы вызвать его из внутренней системы управления, написанной на Perl.
При профилировании этого «решения» я обнаружил, что могу значительно повысить производительность, удалив косвенное обращение Perl-PHP (через HTTP). Я пытался перенести код на Perl, но у меня возникли проблемы с параметрами SSL.
Я использую $ua->ssl_opts()
метод LWP::UserAgent
для передачи правильных опций до Net::SSL
(Crypt::SSLeay
). Я использовал strace
, чтобы определить, читаются ли сертификаты, и похоже, что они есть. Однако я не уверен, удалось ли Net::SSL
прочитать ключ из PEM.
Вопрос:
Какие конкретные $ua->ssl_opts()
аргументы мне нужны, чтобы соответствовать поведению кода PHP?
Примечания:
$data['cert']
- полный путь к файлу PEM, содержащему
- Наш "клиентский" сертификат - выдан третьей стороной
- Наш не -шифрованный (RSA) закрытый ключ - выдан третьей стороной
$data['cafile']
- полный путь к самозаверяющему подписывающему сертификату, выданному третьей стороной
- Я не ищу советы по безопасности относительно открытого текста закрытого ключа.