我正在尝试设置以下环境:
有一个 FTP 服务器(Debian 9,proftpd 1.3.6-4),可通过 访问1.2.3.4
。两个域指向该 IP 地址
- example1.com ->
1.2.3.4
- example2.com ->
1.2.3.4
每个域名都有自己的证书。
我如何使用 proftpd 提供这两个证书?
根据这个 (ProFTPd:一个 IP 地址上有多个域虚拟主机)应该是可能的。
所以我的配置看起来像:
<VirtualHost example1.com>
TLSEngine on
TLSLog /var/log/proftpd/tls.log
TLSProtocol SSLv23
TLSOptions NoCertRequest EnableDiags NoSessionReuseRequired
TLSVerifyClient off
TLSRSACertificateFile /etc/apache2/ssl/cert-example1.com.pem
TLSRSACertificateKeyFile /etc/apache2/ssl/privkey-example1.com.pem
</VirtualHost>
<VirtualHost example2.com>
TLSEngine on
TLSLog /var/log/proftpd/tls.log
TLSProtocol SSLv23
TLSOptions NoCertRequest EnableDiags NoSessionReuseRequired
TLSVerifyClient off
TLSRSACertificateFile /etc/apache2/ssl/cert-example2.com.pem
TLSRSACertificateKeyFile /etc/apache2/ssl/privkey-example2.com.pem
</VirtualHost>
不幸的是,它们都不起作用。如果我在其中输入 IP 地址而不是 DNS 名称,它只适用于一个域。
我打开了调试功能,想看看发生了什么。我总是收到一条no matching vhost found for 1.2.3.4
消息
答案1
对于 Windows:尝试 WinSCP,它已经支持该功能一段时间了。
我不知道有任何其他客户端实现了该功能。我猜想只是 FTP(S) 现在已经超出了范围,因为在大多数应用程序中实现该功能应该是一件轻而易举的事。
编辑:包括一些解释为什么此功能依赖于客户端支持,如@RalfFriedl 所要求的:
为了使服务器能够根据客户端期望的主机名向客户端提供不同的 SSL 证书,它需要知道客户端期望的主机名。
到达服务器的 TCP/IP 连接本身不包含此信息(它仅适用于数字 IP 地址和 TCP 端口号)。
因此,如果服务器想要针对相同的地址和端口根据客户端的期望发送不同的证书,则客户端需要提供该信息。
对于基于 FTP(E)S 名称的虚拟主机,客户端在启动 SSL 协商之前,会发送一个带有预期主机名作为参数的 HOST 命令,以使服务器能够在启动 SSL 连接升级(在此期间将证书发送给客户端)之前知道客户端想要与哪个主机名进行通信。
(当然,此机制也可以在没有 SSL 的情况下使用,只需让服务器根据目标主机名提供不同的内容等。我不知道 ProFTPd 是否这样做,这不是这里的问题。)