2016-02-19 5 views
6

Perl's Mojolicious поддерживает Server Name Identification (SNI), который некоторые веб-серверы используют для размещения нескольких сайтов с одним сертификатом HTTPS. Я работаю над системой, которая не настроена для ее использования, а поиск по-разному не вызывает ничего, что делает процесс понятным и кажущиеся разные части. В вопросе StackOverflow Perl LWP GET or POST to an SNI SSL URL упоминается несколько вещей.Как настроить поддержку SNI для Mojolicious?

Итак, что мне нужно делать?

+0

Я думаю, что ваш вопрос должен быть прояснен, если вы спрашиваете о поддержке клиента для SNI (т.е. отправки имени сервера в ClientHello) или поддержки сервера, то есть создание многосайтового Mojolicious сервера предоставляет разные сертификаты в зависимости от того, на каком сайте клиент просил. Хотя последний может быть реализован с помощью IO :: Socket :: SSL, я не уверен, поддерживает ли Mojolicious способ его использования. –

+0

Ответы для клиента и сервера будут лучшими. –

ответ

6

Во-первых, это не Mojolicious (или LWP или что-то еще), поддерживающее SNI. Это IO::Socket::SSL, но на самом деле это не так, потому что это Net::SSLeay, но на самом деле это не так, потому что это ваша версия openssl.

  • Установить openssl 1.0 или новее. Вероятно, вы захотите использовать опцию --prefix для настройки, чтобы установить ее в новый каталог, чтобы не беспокоить то, что у вас уже есть, и от чего зависят другие вещи.
  • Обновление Net::SSLeay, чтобы скомпилировать его против нового openssl. Вам нужна версия 1.50 или новее. Проблема здесь в том, что более поздний Net::SSLeay с радостью будет работать со старым openssl. Обновление модуля не дает вам нового openssl.
  • Обновление IO::Socket::SSL до 1.56 или новее. Самый ранний выпуск - с 2012 года, поэтому вам все равно следует обновить.
  • Mojolicious 2.83 (выпущен в 2012 году, настолько старый) добавил поддержку SNI для клиентов, а Mojolicious 6.40 (месяц назад) добавила его для всех веб-серверов.

Вы можете найти эту информацию, посмотрев в файле Изменения для каждого модуля, но пока мы здесь, давайте Net::SSLeay отсортирован это не так просто, как установка модуля.

Некоторые вещи, которые вы должны обратить внимание на:

  • Вы должны скомпилировать Perl, OpenSSL и Net::SSLeay с теми же инструментами, так что они являются бинарными совместимы.

Используйте переменную OPENSSL_PREFIX сказать cpan (и материал, он работает), где найти правильный openssl.

$ export OPENSSL_PREFIX=/usr/local/ssl 
$ cpan Net::SSLeay IO::Socket::SSL 

Если у вас уже есть последняя Net::SSLeay но скомпилирован с более старой версии OpenSSL, вы можете принудительно установить модуль перекомпилировать его, даже если cpan считает его уточненный:

$ cpan -f Net::SSLeay IO::Socket::SSL 

IO::Socket::SSL есть методы, чтобы проверить это (добавленные в 1.84):

$ /usr/local/ssl/bin/openssl version 
OpenSSL 1.0.1r 28 Jan 2016 
$ perl -MIO::Socket::SSL -le 'print IO::Socket::SSL->VERSION' 
2.024 
$ perl -MIO::Socket::SSL -le 'print IO::Socket::SSL->can_client_sni' 
1 
+0

IO :: Socket :: Только SSL не может этого сделать. Он должен знать имя хоста, которое должно добавить к SSL-квитированию. Если имя указано как PeerAddr, оно будет использоваться, но если будет предоставлен только IP-адрес или обновлены существующие сокеты TCP, имя должно быть указано явно с помощью 'SSL_hostname'. И вот что делает Mojo :: IOLoop :: Client. –

+0

Я еще не с ответом. Тем не менее, меня не волнует, как это происходит на самом деле, только то, что мне нужно для установки и настройки для этого. –

-1

не прямой ответ на этот вопрос, но, может быть, лучше так lution.

Из моего опыта администрирования совместного использования доменов ~ 400 удобнее настраивать SSL в Apache, а Mojolicious работает под mod_perl2.

Включение слишком большой (сетевой) конфигурации в приложение всегда является болью в долгосрочной перспективе. Во многих случаях многодоменные приложения также могут оказаться неудобными.

Конфигурация в Apache позволяет управлять стандартными сценариями, например. обновление SSL-сертификатов от letencrypt.

Конечно, могут быть веские причины и особые требования к другим установкам, которые стоят дополнительной работы.

+0

Я не ищу другие решения или обходной путь. –

+1

Thx для downvoting. –