如何为Mojolicious设置SNI支持?

时间:2016-02-19 05:41:19

标签: perl cpan mojolicious

Perl的Mojolicious支持Server Name Identification (SNI),其中一些Web服务器使用一个HTTPS证书来托管多个站点。我正在研究一个没有设置使用它的系统,并且谷歌搜索不会发现任何使过程清晰且各个部分明显的东西。 StackOverflow问题Perl LWP GET or POST to an SNI SSL URL提到了一些事情。

那么,我需要做的一切是什么?

2 个答案:

答案 0 :(得分:6)

首先,它不支持SNI的Mojolicious(或LWP或其他)。这是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对其进行排序&#39 ;不像安装模块那么简单。

你需要注意的一些事情:

  • 您需要使用相同的工具编译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

答案 1 :(得分:-1)

不是问题的直接答案,而是更好的解决方案。

根据我作为~400域共享托管管理员的经验,在Apache中配置SSL更方便,并且在mod_perl2下运行Mojolicious。

从长远来看,将太多(网络)配置放入应用程序总是很痛苦。在许多情况下,多域应用程序也会变得不方便。

Apache中的配置允许通过标准脚本进行管理,例如:从letsencrypt续订SSL证书。

当然,其他设置可能有充分的理由和特殊要求值得额外的工作。