为网站部署SSL证书不仅能提升网站的安全性,还可以在浏览器地址栏左侧添加一把“锁”,非常的美观和舒适。因此必须安排!但我由于对web服务、docker容器端口映射等运行机制不太熟,在部署过程中踩了很多坑,不过也一一填了回来,最终部署成功,在此记录一下部署的过程。

SSL是指安全套接字协议,借用百度词条的定义:

SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。

百度百科:SSL

我的软件服务配置

  • 服务器系统:Ubuntu18.04
  • docker容器中系统:Debian
  • web服务:apache2

申请并下载证书

我图方便直接去阿里云申请了一个免费的证书:DigiCert 免费版 SSL(能用就行,免费的真香),下载apache版本的证书到本地,然后将整个文件夹(重命名为ssl)上传到服务器。(文件夹中有3个文件,分别是xxx_public.crt、xxx_key与xxx_chain.crt)。SSL证书也可以通过Certbot来申请,详情可见此文

使用命令将文件夹复制到WordPress容器的apache2目录下:

sudo docker cp ssl 容器名:/etc/apache2/

配置或修改docker容器端口映射

若尚未生成容器,则在生成的时候声明两个端口映射(80:80与443:443)即可。若已经生成了容器,并且端口映射不对,则参考下文。(其实只映射443:443也是可以的,我只是为了做http强制跳转https)

由于我之前是0.0.0.0:80->80/tcp,故需要再添加一条0.0.0.0:443->443/tcp

在进行下面的操作前先stop容器。

# 进入容器文件夹内
cd /var/lib/docker/containers/容器哈希值
# 修改hostconfig.json
sudo vi hostconfig.json

找到"PortBindings",并添加一条443端口映射:

"PortBindings":{
    "443/tcp":[{"HostIp":"","HostPort":"443"}],
    "80/tcp":[{"HostIp":"","HostPort":"80"}]
}
# 修改config.v2.json
sudo vi config.v2.json

找到"ExposedPorts",同样添加一条443端口:

"ExposedPorts":{"443/tcp":{},"80/tcp":{}}
# 重启docker,然后开启容器
sudo systemctl restart docker
sudo docker start 容器id
# 查看容器运行情况
sudo docker ps

若看到容器的ports为 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp两条,则端口已添加成功。

部署SSL

# 进入容器
docker exec -it 容器名 bash
# 开启ssl模块,首次运行可能需要按提示重启apache
a2enmod ssl

配置SSL证书

# apt update
# apt install vim
vi /etc/apache2/sites-available/default-ssl.conf

在打开的文件中修改或添加以下几项:

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/xxx_public.crt
SSLCertificateKeyFile /etc/apache2/ssl/xxx.key
SSLCertificateChainFile /etc/apache2/ssl/xxx_chain.crt

修改时请把证书文件名修改成自己的,然后保存退出,再做一个软连接,使得apache2能够加载到default-ssl.conf文件。

ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf

强制http跳转https

# 开启rewrite模块,首次运行可能需要重启apache
a2enmod rewrite
vi /etc/apache2/sites-available/000-default.conf

在文件中的<VirtualHost *80><VirtualHost>标签之间加上以下代码(请自行修改其中网站主页的URL):

<Directory "/var/www/html"> 
    RewriteEngine   on
    RewriteBase /
    # FORCE HTTPS
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://blog.fyz666.xyz$1 [R,L]
</Directory>

退出容器,并重启容器:

exit
sudo docker restart 容器id

至此,所有配置已经完成,最后需要检查一下服务器80、443端口是否开放。