一、介绍
Docker - HTTPD 类型的部署节点用于实现将OHTTPS中申请的证书自动化部署至Apache的http服务器httpd容器中。
如果官方镜像不满足需求,可以查看 [Docker 自定义] 文档,通过在构建自定义容器的Dockerfile中引入我们官方提供的push-node二进制包,实现证书的自动化部署。二、使用方法
使用 Docker - HTTPD 类型的部署节点,需要使用我们官方提供的httpd容器镜像ohttps/ohttps-httpd。
该镜像是基于httpd官方稳定版镜像httpd:2.4构建,添加了证书更新服务后生成的。ohttps/ohttps-httpd镜像内的其他内容和使用方式和httpd官方镜像完全一致,请放心使用。
拉取镜像命令为:
docker pull ohttps/ohttps-httpd
使用该镜像时,需要设置以下两个环境变量:
- PUSH_NODE_ID:即为部署节点创建完成后系统生成的部署节点的ID,部署节点的ID都是以push开头的,样例:push-53ejqm8p60gd7no9
- PUSH_NODE_TOKEN:即为创建部署节点时,通过点击生成按钮生成的32位令牌,样例:6b2440b1e3f180a3c9453f9d7766a565
在使用该镜像的容器首次启动时,会根据配置的PUSH_NODE_ID和PUSH_NODE_TOKEN从OHTTPS服务器拉取最新版证书,如果PUSH_NODE_ID对应的部署节点被多个证书配置为部署节点,则会同时拉取多个证书,拉取到的证书文件被存放在容器内/etc/httpd/certificates文件夹下,然后按照证书ID为子文件夹进行存放(证书ID为创建证书完成后系统生成的证书的ID,证书的ID都是以cert开头的,样例:cert-2enm4pr1q09g3x5z),则证书文件的全路径为:
- 私钥文件cert.key(PEM格式):
`/etc/httpd/certificates/${证书ID}/cert.key`
- 证书文件fullchain.cer(PEM格式):
`/etc/httpd/certificates/${证书ID}/fullchain.cer`
把上面路径中'${证书ID}'部分换成您的证书ID即为对应文件在容器中的存放路径。注意在容器启动前,请先完成证书部署节点的配置,将证书和部署节点关联,否则会导致容器无法成功启动。
三、最佳实践
这里我们会举个例子来说明具体如何使用 Docker - HTTPD 类型的部署节点。例如我们创建了一个 Docker - HTTPD 类型的部署节点,PUSH_NODE_ID和PUSH_NODE_TOKEN的值为:
- PUSH_NODE_ID:push-53ejqm8p60gd7no9
- PUSH_NODE_TOKEN:6b2440b1e3f180a3c9453f9d7766a565
我们为域名www.example.com申请了一个有单域名证书,这个证书的证书ID为cert-2enm4pr1q09g3x5z,然后我们在证书配置中将我们刚创建的节点配置为该证书的部署节点之一,那么该证书的证书文件在容器内的路径为:
- 私钥文件cert.key(PEM格式):/etc/httpd/certificates/cert-2enm4pr1q09g3x5z/cert.key
- 证书文件fullchain.cer(PEM格式):/etc/httpd/certificates/cert-2enm4pr1q09g3x5z/fullchain.cer
然后我们需要修改httpd的基础配置文件httpd.conf和ssl配置文件httpd-ssl.conf:
- 在httpd.conf中找到'Listen 80'这一行,然后在下面添加一行,这一行用于开启https的443监听端口。
Listen 443
- 在httpd.conf中找到以下这些模块,删除模块前面的注释符号#,这些模块是启动https服务会使用到的模块。
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
LoadModule http2_module modules/mod_http2.so
- 在httpd.conf中找到引入httpd-ssl.conf配置文件的这一行,删除前面的注释符号#。
Include conf/extra/httpd-ssl.conf
- 编辑httpd-ssl.conf文件为:
<VirtualHost *:80>
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile /etc/httpd/certificates/cert-2enm4pr1q09g3x5z/fullchain.cer
SSLCertificateKeyFile /etc/httpd/certificates/cert-2enm4pr1q09g3x5z/cert.key
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=63072000"
DocumentRoot "/usr/local/apache2/htdocs"
</VirtualHost>
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
对应的Dockerfile为:
FROM ohttps/ohttps-httpd
WORKDIR /etc/httpd
COPY ./httpd.conf /usr/local/apache2/conf/httpd.conf
COPY ./httpd-ssl.conf /usr/local/apache2/conf/extra/httpd-ssl.conf
ENV PUSH_NODE_ID='push-53ejqm8p60gd7no9'
ENV PUSH_NODE_TOKEN='6b2440b1e3f180a3c9453f9d7766a565'
根据上面的Dockerfile生成我们自己的镜像即可。