我正在配置几个共享相同 SSL 证书的域,内容将位于不同的文件夹中,显然所有内容都将位于同一服务器上。
我的域名是:
example.com(用于网站)
api.example.com(用于 Web 服务)
我通过Let's Encrypt (free)获得了 SSL 证书。
证书是为两个域生成的,因此它可以放在同一个目录中。
/etc/apache2/ssl/example.com/
后来我在 Apache 站点目录中进行了相应的配置。
/etc/apache2/sites-available/
此外,执行站点的激活:
a2ensite example.com
a2ensite api.example.com
网站的结构是:
-> /var/www/
-> website/
-> api/
这些是设置:
/etc/apache2/sites-available/example.com
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/website/
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/example.com/error.log
<Directory "/var/www/website/">
Options FollowSymLinks
AllowOverride None
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/website/
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/example.com/error_ssl.log
SSLEngine on
SSLCertificateKeyFile /etc/apache2/ssl/example.com/privkey.pem
SSLCertificateFile /etc/apache2/ssl/example.com/cert.pem
SSLCertificateChainFile /etc/apache2/ssl/example.com/chain.pem
<Directory "/var/www/website/">
Options FollowSymLinks
AllowOverride None
</Directory>
</VirtualHost>
/etc/apache2/sites-available/api.example.com
<VirtualHost *:80>
ServerName api.example.com
DocumentRoot /var/www/api/
#RewriteEngine On
#RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
<Directory "/var/www/api/">
Options FollowSymLinks
AllowOverride None
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerName api.example.com
DocumentRoot /var/www/api/
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
SSLEngine on
SSLCertificateKeyFile /etc/apache2/ssl/example.com/privkey.pem
SSLCertificateFile /etc/apache2/ssl/example.com/cert.pem
SSLCertificateChainFile /etc/apache2/ssl/example.com/chain.pem
<Directory "/var/www/api/">
Options FollowSymLinks
AllowOverride None
</Directory>
</VirtualHost>
缺点是:
当我在浏览器中访问该站点example.com
时,它的内容已打开api.example.com
。
这引起了我的问题:
我分享我的解决方案。
在对这个要求进行了一些搜索后,我找到了这个 Apache 参数。
这让我们知道了一个关于 Apache 的术语。
SNI
服务器名称指示
根据互联网参考,我引用:
这意味着我们必须使
SNI
我们的服务器能够使用相同的 SSL 证书为多个子域提供服务。我们该怎么做呢?
首先要做的是修改以下文件:
在其中我们添加以下内容:
之后,文件被编辑:
在其中我们添加以下指令:
该指令
NameVirtualHost *:443
更需要添加,因为它下面的内容通常是配置中的默认值ports.conf
。最后,我们保存并重新启动 Apache。
在此之后,子域允许它们独立使用并使用相同的 SSL 证书。
更新
该指令
ServerName
指示可以在 中使用的服务器名称之一virtualhost
,但我们可以使用另一个指令,如果有多个域使用相同的内容,这将很有用。像这样离开我们的配置。
允许
example.com
其他站点使用相同的配置。