Соответствие опциям SSL сокетов PHP в Perl - PullRequest
1 голос
/ 24 марта 2012

Справочная информация:

В некоторых 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'] - полный путь к самозаверяющему подписывающему сертификату, выданному третьей стороной

  • Я не ищу советы по безопасности относительно открытого текста закрытого ключа.

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

SSL псевдоэксперт здесь. Проходя по вашему вопросу и оба документы , вот что, кажется, имеет паритет:

  1. 'local_cert'

    SSL_cert_file . С здесь .

  2. 'verify_peer'

    verify_hostname . С здесь и здесь , снова.

  3. 'allow_self_signed'

    Без проверки четности. Однако этот параметр является спорным, поскольку для этого вам потребовалось verify_peer.

  4. 'cafile'

    SSL_ca_file . Также с здесь .

Вы также можете установить SSL_version для поддержки вашей потребности в SSLv3. И, похоже, это так.

0 голосов
/ 27 марта 2012

В модуле Crypt :: SSLeay есть тестовый файл, с помощью которого вы можете проверить ваш сертификат / SSL-соединение.

perl eg / net-ssl-test -cert = certs / notacacert.pem-key = certs / notacakeynopass.pem -CAfile your_ca_file.ca -d GET test_url

Вы можете использовать env vars для настройки файлов / пути:

из: http://metacpan.org/pod/Crypt::SSLeay

# debugging (SSL diagnostics)
$ENV{HTTPS_DEBUG} = 1;

# default ssl version
$ENV{HTTPS_VERSION} = '3';

# client certificate support
$ENV{HTTPS_CERT_FILE} = 'certs/notacacert.pem';
$ENV{HTTPS_KEY_FILE}  = 'certs/notacakeynopass.pem';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...