1.生成并获取证书
1.1 下载、安装acme.sh
点击「此处」至acme github仓库。acme考虑到国内网络环境,可能无法访问github,可直接从gitee拉取仓库。
#curl https://get.acme.sh | sh #curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh git clone https://gitee.com/neilpang/acme.sh.git cd acme.sh ./acme.sh --install -m xxx@example.com source .bashrc
1.2 证书生成获取方式一:http方式(更适用于VPS)
HTTP方式下,CA机构将通过向网站写入文件的方式以验证网站属权,通过验证后颁发证书。结合VPS/主机所处网络环境及自身软件包安装情况,有可能在使用standalone模式时需要安装socat并赋权。
同时,在网络受限、避免改动安全策略/组规则、80端口被占用等3种情况下,可使用--httpport指定端口。acme可以即时模拟/仿冒一个站点,以供CA机构写入文件并验证使用。
apt install socat setcap 'cap_net_bind_service=+ep' /usr/bin/socat acme.sh --issue -d example.eu.org -d *.example.eu.org --standalone #acme.sh --issue -d example.eu.org -d *.example.eu.org --standalone --httpport 6789
需要说明的是,-w指定的目录可自定义,同时可通过-d参数添加泛域名在内的多个域名。对于内网主机(包括盒子)使用http方式硬上,建议xxxxxx.eu.org保持与已有动态AAAA记录名称(fulldomainname)一致,可避免因为没有配置相应记录导致解析失败而“短暂失联”。
1.3 证书生成获取方式二:dns方式(更适用于内网主机)
DNS方式下,CA机构将通过向DNS域写入txt类型记录的形式以验证域属权,通过验证后颁发证书。acme目前默认CA使用zeroSSL,老E习惯改用Let's Encrypt。
export CF_Email="XXX@example.com" export CF_Key="api_key" acme.sh --server letsencrypt --issue --dns dns_cf -d example.com
1.4 更简单的额外选择
可以使用以下在线辅助页面申请(本人未测试,开源网页版acme客户端)。
https://github.com/xiangyuecn/ACME-HTML-Web-Browser-Client
2.安装证书
至此,我们可以使用acme.sh安装证书,默认情况下需要注意两点:
- pem公钥需要使用fullchain-file,而非以域名为前缀命名的文件
- 如果nginx以docker方式安装加载,证书安装目录的选择要考虑映射关系
acme.sh --installcert -d example.eu.org --key-file /home/dockers/nginx/conf/example.eu.org.key --fullchain-file /home/dockers/nginx/conf/example.eu.org.pem
3.nginx配置
系统未作其他特殊配置的情况下,可直接拷贝server段添加至nginx.conf文件中并使用 -s reload加载。
server { listen 3355 ssl; server_name example.eu.org; ssl_certificate /etc/nginx/conf/example.eu.org.pem; #公钥位置及挂载映射关系 ssl_certificate_key /etc/nginx/conf/example.eu.org.key; #私钥位置及挂载映射关系 location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8080/; #此处仍以反向代理go-proxy-bingai为例 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } }
4.验证
老E修改(增加)了挂载映射关系,因此对现有容器myginx进行了删除,并重新创建加载。由于证书文件安装到位后,需要确保nginx容器能正常加载对应的映射目录中找到并加载证书,添加映射关系是不可避免的。
docker stop mynginx docker rm -f mynginx #docker run -d -p 8080:8080 --name go-proxy-bingai --restart=unless-stopped adams549659584/go-proxy-bingai #已正常加载可不做处理 docker run --name mynginx --net host \ -v /home/dockers/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /home/dockers/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf \ -v /home/dockers/nginx/html:/usr/share/nginx/html \ -v /home/dockers/nginx/log:/var/log/nginx \ -v /home/dockers/nginx/conf:/etc/nginx/conf -d nginx
重新创建加载mynginx容器后,即可在浏览器中以https方式访问相应服务,原系统对外的http服务可与https服务共存。
文章评论