Perl 如何为Mojolicious设置SNI支持?

Perl 如何为Mojolicious设置SNI支持?,perl,cpan,mojolicious,Perl,Cpan,Mojolicious,Perl的支持,一些web服务器使用它来托管具有一个HTTPS证书的多个站点。我正在开发一个系统,而这个系统并没有被设置为使用它,而谷歌搜索并没有显示出任何能让过程清晰、各个部分清晰可见的东西。StackOverflow问题提到了几件事 那么,我需要做什么呢?首先,支持SNI的不是Mojolicous(或LWP或其他)。它是,但不是真的,因为它是,但不是真的因为它是你的版本 安装1.0或更高版本。您可能希望使用--prefix选项将其配置为安装在一个新目录中,这样就不会干扰您已经拥有的内容以及

Perl的支持,一些web服务器使用它来托管具有一个HTTPS证书的多个站点。我正在开发一个系统,而这个系统并没有被设置为使用它,而谷歌搜索并没有显示出任何能让过程清晰、各个部分清晰可见的东西。StackOverflow问题提到了几件事


那么,我需要做什么呢?

首先,支持SNI的不是Mojolicous(或LWP或其他)。它是,但不是真的,因为它是,但不是真的因为它是你的版本

  • 安装1.0或更高版本。您可能希望使用
    --prefix
    选项将其配置为安装在一个新目录中,这样就不会干扰您已经拥有的内容以及其他依赖的内容
  • 更新以根据新的openssl编译它。您需要1.50或更高版本。这里的问题是,晚辈会很乐意和年长的人一起工作。升级模块并不能获得新的openssl
  • 更新至1.56或更高版本。最早的版本是从2012年开始的,所以无论如何你都应该更新
  • Mojolicious 2.83(2012年发布,非常老)为客户端添加了SNI支持,Mojolicious 6.40(一个月前)为所有web服务器添加了SNI支持
您可以通过查看每个模块的更改文件来找到这些信息,但是在这里,让我们对其进行排序,它不像安装模块那么简单

有些事情你必须注意:

  • 您需要使用相同的工具编译perl、openssl和,以便它们是二进制兼容的
使用
OPENSSL\u PREFIX
变量告诉
cpan
(以及它运行的内容)在哪里找到正确的代码

如果您已经拥有最新但针对较旧版本的openssl编译的模块,您可以强制安装该模块以重新编译它,即使
cpan
认为它是最新的:

 $ cpan -f Net::SSLeay IO::Socket::SSL
有检查方法(在1.84中添加):


不是对这个问题的直接回答,而是一个可能更好的解决方案

根据我作为大约400个域共享主机管理员的经验,在Apache中配置SSL更方便,并且在mod_perl2下运行Mojolicous

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

Apache中的Have配置允许通过标准脚本进行管理,例如从letsencrypt更新SSL证书


当然,对于值得额外工作的其他设置,可能会有很强的理由和特殊要求。

我认为您的问题应该清楚地表明您是询问SNI的客户端支持(即在ClientHello中发送服务器名称)还是服务器支持,也就是说,使多站点Mojolicous服务器根据客户端请求的站点提供不同的证书。虽然后者可以通过IO::Socket::SSL实现,但我不确定Mojolicious是否提供了一种使用它的方法。客户端和服务器的答案是最好的。单靠IO::Socket::SSL无法做到这一点。它需要知道应该添加到SSL握手中的主机名。如果名称为PeerAddr,则将使用该名称,但如果仅提供IP地址或升级现有TCP套接字,则通常必须使用
SSL\u主机名
明确指定名称。这就是Mojo::IOLoop::Client实际上正在做的事情。我还没有找到答案。然而,我并不关心它实际上是如何发生的,我只关心我需要安装什么和设置它才能发生。我不寻找其他解决方案或解决办法。
 $ cpan -f Net::SSLeay IO::Socket::SSL
 $ /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