场景

Apache 运行在前端作为反向代理,后端程序运行在 docker 容器中。

SSL 证书获取方法

使用 certbot --apache 无法获取 SSL 证书,要通过 certbot certonly --manual 手动获取,过程中使用 python:2-alpine 镜像创建临时容器用于身份校验,注意容器的端口映射。

sudo docker run --rm -it -p 80:2368 python:2-alpine /bin/sh

原理是使用 python2 搭建一个临时的 web 环境实现域名校验,依照 certbot 的交互式提示在临时容器中创建相关内容即可。

配置 https

获取到的 SSL 证书存储在 /etc/letsencrypt/live/your.domian/ 目录。

apache 虚拟主机配置文件示例:

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName it.ismy.fun

        ProxyPass / http://localhost:2368/
        ProxyPassReverse / http://localhost:2368/

	SSLCertificateFile /etc/letsencrypt/live/it.ismy.fun/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/it.ismy.fun/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
</IfModule>

提示:配置文件中 Include /etc/letsencrypt/options-ssl-apache.conf 这一行引用了 Let's encrypt 提供的 SSL 标准配置信息,引用它可以省去在每个虚拟机配置文件中重复粘贴大量 SSL 配置内容。

http 重定向到 https

修改 http 配置文件,例如:

<VirtualHost *:80>
ServerName it.ismy.fun

RewriteEngine on
RewriteCond %{SERVER_NAME} =yourdomian.com [OR]
RewriteCond %{SERVER_NAME} =otherdomian.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>