我正在寻找一种解决方案,通过 SSL 提供在本地网络子域下运行的 Web 应用程序。我们不想使用 DynDNS,而是使用我们自己域的子域。
我们当前的设置
根服务器(互联网)
我们有一个装有 ubuntu 16.04、apache 2 的根服务器,托管在我们的域 example.com 和所有子域终止的数据中心。
<VirtualHost *:443>
ServerName SUB.EXAMPLE.COM
SSLEngine on
SSLProxyEngine on
SSLProxyCheckPeerCN On
SSLProxyCheckPeerExpire On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / https://PUBLICIP:9443/
ProxyPassReverse / https://PUBLICIP:9443/
</VirtualHost>
应用服务器(本地)
Debian 与 Apache 2
<VirtualHost *:9443>
ServerName SUB.EXAMPLE.COM
ServerAdmin webmaster@localhost
DocumentRoot /var/www/MYAPP
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</IfModule>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/SUB.DOMAIN.COM/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/SUB.DOMAIN.COM/privkey.pem
</VirtualHost>
迄今为止的研究
- 我知道根服务器上的配置是错误的,因为我没有在那里提供证书,请参阅问题。
- 到目前为止,我发现的大多数解决方案都是关于从反向代理(我们的根服务器)进行 SSL 处理的,但两个服务器之间的连接不是通过 SSL 的(例如,因为它们在同一个网络中,所以没有必要)。虽然我们需要它,因为否则根服务器和应用程序之间的通信将不会被加密。
- 防火墙允许访问端口 9443,因此在尝试访问时https://公开:9443我得到 NET::ERR_CERT_COMMON_NAME_INVALID(这是正确的,因为该证书是针对 SUB.EXAMPLE.COM 的)。
问题
我是否必须获得 2 个证书?一个用于我们根服务器上的 SUB.EXAMPLE.COM,另一个用于我们的 PUBLICIP(据我所知,通过 Letsencrypt 无法实现)。或者还有其他方法可以解决这个问题(无需设置 DNS)?
答案1
因此,我的解决方案是在两台服务器上使用相同的证书,并在根服务器上使用以下虚拟主机配置:
<VirtualHost *:443>
ServerName SUB.EXAMPLE.COM
ProxyPass / https://PUBLICIP:9443/
ProxyPassReverse / https://PUBLICIP:9443/
SSLCertificateFile /etc/letsencrypt/live/SUB.EXAMPLE.COM/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/SUB.EXAMPLE.COM/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLProxyEngine on
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerName Off
SSLProxyCheckPeerExpire On
</VirtualHost>