How To Install SSL on Apache2 Server

说起来有点惭愧,距离上一次更新这边blog的文章已经有半年了。期间还差点丢失了所有的配置和文章文件…… 这半年我也没闲着主站那边没少更新吃喝玩乐的文章…… Anyway,公司前一阵子需要我使用client certificate来做登陆网站的验证。虽然Traefik也支持Client Authentication,但是我对于它的同一个服务器上不同的sub domain只能用同一个Client authentication的配置有点不满。(至少旧版是这样,我没有研究新版)因此决定回归到Apache看看怎么弄,顺便把Apache2服务器的SSL的配置方法和CertBot的使用方法也写一下好了。

之前我有写过一篇如何在XAMPP的环境下的Apache来安装SSL,今天这篇我们直接实战在服务器端配置。

本文的前提是你已经知道如何ssh到服务器并且已经安装了Apache2。

创建Apache2的virtual host跟Nginx的server block差不多,都是去到sites-available文件夹

获取SSL证书

如果需要免费的SSL证书可以参考How do we apply SSL certificates for free

本文会先获取一张通配符的证书***.sslfor.fun**证书获取成功之后把文件放到/etc/ssl/sslfor.fun这个文件夹下

Enable SSL Module

1
sudo a2enmod ssl

创建virtual host 文件

Virtual Host就是告诉Apache如果某个request来到你的server了,如何把这个request direct到相对应的文件夹。这里我用sslfor.fun和www.sslfor.fun 为例,分别把sslfor.fun和www.sslfor.fun 引入到不同的文件夹

1
2
3
4
cd /etc/apache2/sites-available/
#文件名可以随便起,方便自己记忆即可
sudo nano sslforfun.conf
sudo nano wwwsslforfun.conf

sslforfun.conf的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<VirtualHost *:80>
ServerName sslfor.fun
DocumentRoot "/var/www/html/"
</VirtualHost>

<VirtualHost *:443>
ServerName sslfor.fun
DocumentRoot "/var/www/html/"

SSLEngine on
SSLCertificateFile /etc/ssl/sslfor.fun/domain.cert.pem
SSLCertificateKeyFile /etc/ssl/sslfor.fun/private.key.pem
SSLCertificateChainFile /etc/ssl/sslfor.fun/intermediate.cert.pem
</VirtualHost>

wwwsslforfun.conf的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<VirtualHost *:80>
ServerName www.sslfor.fun
DocumentRoot "/var/www/html/www"
</VirtualHost>

<VirtualHost *:443>
ServerName www.sslfor.fun
DocumentRoot "/var/www/html/www"

SSLEngine on
SSLCertificateFile /etc/ssl/sslfor.fun/domain.cert.pem
SSLCertificateKeyFile /etc/ssl/sslfor.fun/private.key.pem
SSLCertificateChainFile /etc/ssl/sslfor.fun/intermediate.cert.pem
</VirtualHost>

连接Virtual Host

1
2
3
4
5
6
sudo ln -s /etc/apache2/sites-available/sslforfun.conf /etc/apache2/sites-enabled/

sudo ln -s /etc/apache2/sites-available/wwwsslforfun.conf /etc/apache2/sites-enabled/

#测试一下Apache的配置是否有问题
sudo apachectl configtest

重启服务器就可以了

1
sudo systemctl restart apache2