前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SSL证书自动化-acme实战(Let’s Encrypt)

SSL证书自动化-acme实战(Let’s Encrypt)

作者头像
用户10002156
发布2023-12-13 13:37:32
8140
发布2023-12-13 13:37:32
举报
文章被收录于专栏:生活处处有BUG生活处处有BUG

背景

由于 HTTP 是明文传输,在使用 NextCloud 等服务时不够安全,需要配置 SSL 证书。不想让在被别人浏览的时候,出现莫名的广告[运营商劫持]。

签发 SSL 证书需证明这个域名的所有权,一般有两种方式验证: http 和 dns 验证。使用 acme.sh 能够定时自动续签,非常方便。泛域名证书貌似只能使用 DNS 验证的方式,这种方式要获取 DNS 验证 api,不同服务器商家各有不同,腾讯云的在 API 密钥 - DNSPod。在该页面的 DNSPod Token 中创建密钥。

安装acme.sh

代码语言:javascript
复制
# curl https://get.acme.sh | sh -s email=jxiao@visionmedicals.com

# 如果是国内的机器,可以使用拖回源码直接安装
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m jxiao@visionmedicals.com

普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:

  1. 1. 并创建 一个 shell 的 alias, 例如 .bashrc,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
代码语言:javascript
复制
vim ~/.bashrc
# 在合适的位置写入:
alias acme.sh=~/.acme.sh/acme.sh
source ~/.bashrc

新版acme.sh使用ZeroSSL作为CA,建议切换到Let’s Encrypt的CA:

代码语言:javascript
复制
acme.sh --set-default-ca --server letsencrypt

acme.sh 依赖于cron执行定时任务,安装完成后,输入 crontab -l 命令,能看到如下输出:

代码语言:javascript
复制
13 0 * * * "/home/ubuntu/.acme.sh"/acme.sh --cron --home "/home/ubuntu/.acme.sh" > /dev/null

定时任务保证了证书在到期前能自动续期。由于ACME协议和Let’s Encrypt CA都在频繁的更新,因此建议开启acme.sh的自动升级

代码语言:javascript
复制
acme.sh  --upgrade  --auto-upgrade

使用acme.sh签发证书

有4种方式可以选择

方式一:如果网站已经运行Nginx/Apache,指定对应插件就可以了

代码语言:javascript
复制
acme.sh --issue -d tmp1210.visionmedicals.cn --nginx # 如果是apache,换成 --apache

方式二:如果你的服务器上已经运行了web软件,指定webroot即可签发证书:

代码语言:javascript
复制
acme.sh --issue -d 域名 --webroot web目录

方式三:如果没有运行web软件并且80端口空闲,可以使用acme.sh自己监听80端口进行验证:

代码语言:javascript
复制
~/.acme.sh/acme.sh --issue -d 域名 --standalone

方式四:可以使用DNS方式,手动添加DNS记录进行验证:

代码语言:javascript
复制
~/.acme.sh/acme.sh --issue --dns -d 域名
# 命令结束后,acme.sh会显示解析记录,需要到DNS后台设置解析
# 设置好解析后,生成证书
~/.acme.sh/acme.sh --renew -d 域名

对于DNS方式,acme.sh内置了许多DNS服务商的插件,使用方法参考:https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md

如果有通配符证书要求,需要使用DNS验证方式,其他方式一个证书的域名数不能超过20

申请好证书的证书位于~/.acme.sh目录内,不建议直接使用,而是将其安装到指定目录:

代码语言:javascript
复制
~/.acme.sh/acme.sh --install-cert -d 域名 \
--key-file       密钥存放路径(例如/etc/nginx/ssl/域名.key)  \
--fullchain-file 证书存放路径(例如/etc/nginx/ssl/域名.pem) \
--reloadcmd     "service nginx force-reload"

实践demo

step1.先配置好域名解释

step2.配置一个新的站点

使能够正常http访问

代码语言:javascript
复制
server {
    listen       80;
    listen  [::]:80;
    server_name  tmp1210.visionmedicals.cn;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

step3.生成证书到指定目录

代码语言:javascript
复制
root@iZ7xva33l57s9vs0useftcZ:~/software/docker/nginx/config/conf.d/cert# acme.sh --issue -d tmp1210.visionmedicals.cn --webroot /root/www/html \
--key-file       /root/software/docker/nginx/config/conf.d/cert/tmp1210.visionmedicals.cn.key  \
--fullchain-file  /root/software/docker/nginx/config/conf.d/cert/tmp1210.visionmedicals.cn.cer
[Sun Dec 10 10:22:57 PM CST 2023] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Sun Dec 10 10:22:57 PM CST 2023] Creating domain key
[Sun Dec 10 10:22:57 PM CST 2023] The domain key is here: /root/.acme.sh/tmp1210.visionmedicals.cn_ecc/tmp1210.visionmedicals.cn.key
[Sun Dec 10 10:22:57 PM CST 2023] Single domain='tmp1210.visionmedicals.cn'
[Sun Dec 10 10:22:57 PM CST 2023] Getting domain auth token for each domain
[Sun Dec 10 10:23:02 PM CST 2023] Getting webroot for domain='tmp1210.visionmedicals.cn'
[Sun Dec 10 10:23:02 PM CST 2023] tmp1210.visionmedicals.cn is already verified, skip http-01.
[Sun Dec 10 10:23:02 PM CST 2023] Verify finished, start to sign.
[Sun Dec 10 10:23:02 PM CST 2023] Lets finalize the order.
[Sun Dec 10 10:23:02 PM CST 2023] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/1457692006/228224606046'
[Sun Dec 10 10:23:04 PM CST 2023] Downloading cert.
[Sun Dec 10 10:23:04 PM CST 2023] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/0491a19b4d10bf136b5df595eba6f4d4d2c0'
[Sun Dec 10 10:23:05 PM CST 2023] Cert success.
-----BEGIN CERTIFICATE-----
MIIENDCCAxygAwIBAgISBJGhm00QvxNrXfWV66b01NLAMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMzEyMTAxMzIzMDNaFw0yNDAzMDkxMzIzMDJaMCQxIjAgBgNVBAMT
GXRtcDEyMTAudmlzaW9ubWVkaWNhbHMuY24wWTATBgcqhkjOPQIBBggqhkjOPQMB
BwNCAASoISM1YfxvlDvTe/iHwgydXhAGRzTp2eLK+iUkmgOUOJhmk3CE6HMohVaY
0g44DXwE6HgEUAIRQ0PlDSbuZwy5o4ICGzCCAhcwDgYDVR0PAQH/BAQDAgeAMB0G
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1Ud
DgQWBBQNEDw2Iuan7ZpzBIe7dYoqgAOrLTAfBgNVHSMEGDAWgBQULrMXt1hWy65Q
CUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9y
My5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3IzLmkubGVuY3Iub3Jn
LzAkBgNVHREEHTAbghl0bXAxMjEwLnZpc2lvbm1lZGljYWxzLmNuMBMGA1UdIAQM
MAowCAYGZ4EMAQIBMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHYASLDja9qmRzQP
5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGMVBw0hAAABAMARzBFAiEA7yG807CL
tKPMk/fs4vVfcV8h3HXzwTY2HTBuVYgahxkCICq/5IyoGPzwy+9pQZaRA5kUMcvP
KfsusGVXNtbCL/XTAHYAouK/1h7eLy8HoNZObTen3GVDsMa1LqLat4r4mm31F9gA
AAGMVBw0kQAABAMARzBFAiEA53/yYbPIwlRGvOXu9eihUAp2khzsGgAAuQ1XFcxy
CvICIEB+p2bUXl+yKnxpHqBLO95YbTh6cBjuP/xzueESUkLhMA0GCSqGSIb3DQEB
CwUAA4IBAQCFRZ5AucidEQD08yrtR6TwAzWYWnfEE7m5ItY2r8VQnIsEXKr/O5+x
rfOEu6d0WO3ZvnjZT5RQzaF6e2517Vu7nZvu5vSAelYe+b/ygmFI7OJOTk4Hpf5N
tdQ8Pd4WAz6WLKA0hfgydRS90tLjfsRUmgR3IdlZveM/dVmvzJAA1If/ZoWsFIpo
2AEPeN3Q8a5eLOyouc5seuBxj3AzNSyBqBJZETIuPVpM6jNFCWAHTrIJJkCsmYJ2
feWnTGIx1hpAAq4dXBb5AEZ1YuWsiGN2ufQfDYOIRo2M2zObNOuKL+Dggnw75T30
9cKxoNPVjTa1lfWfQAKJWOXt8aiQI+pY
-----END CERTIFICATE-----
[Sun Dec 10 10:23:05 PM CST 2023] Your cert is in: /root/.acme.sh/tmp1210.visionmedicals.cn_ecc/tmp1210.visionmedicals.cn.cer
[Sun Dec 10 10:23:05 PM CST 2023] Your cert key is in: /root/.acme.sh/tmp1210.visionmedicals.cn_ecc/tmp1210.visionmedicals.cn.key
[Sun Dec 10 10:23:05 PM CST 2023] The intermediate CA cert is in: /root/.acme.sh/tmp1210.visionmedicals.cn_ecc/ca.cer
[Sun Dec 10 10:23:05 PM CST 2023] And the full chain certs is there: /root/.acme.sh/tmp1210.visionmedicals.cn_ecc/fullchain.cer
[Sun Dec 10 10:23:05 PM CST 2023] Installing key to: /root/software/docker/nginx/config/conf.d/cert/tmp1210.visionmedicals.cn.key
[Sun Dec 10 10:23:05 PM CST 2023] Installing full chain to: /root/software/docker/nginx/config/conf.d/cert/tmp1210.visionmedicals.cn.cer

step4.更新配置

代码语言:javascript
复制
server {
    listen       443 ssl;
    server_name tmp1210.visionmedicals.cn;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    ssl_certificate      conf.d/cert/tmp1210.visionmedicals.cn.cer;
    ssl_certificate_key  conf.d/cert/tmp1210.visionmedicals.cn.key;
    ssl_session_timeout  5m;
    ssl_session_cache    shared:SSL:1m;
    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:aNULL:!MD5:!ADH:!RC4;
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers  on;


}

server {
    listen 80;
    server_name tmp1210.visionmedicals.cn;
    rewrite ^ https://$host$1 permanent;
}

我有个大胆的想法

小伙伴在平常有没有遇到以下这种情况:遇到技术难题时,网上教程一堆堆,优秀的很多,但也有很多是过时的,或者是copy来copy去,甚至错别字都没改。

我公众号的技术文章,都是亲自校验过的。至少可以保证在发文的一段时间,不会过时。如果你在实操过程中,有遇到问题,可以在同名公众号留言,免费解答,相互学习,相互成长^v^

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生活处处有BUG 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 安装acme.sh
  • 使用acme.sh签发证书
  • 实践demo
    • step1.先配置好域名解释
      • step2.配置一个新的站点
        • step3.生成证书到指定目录
          • step4.更新配置
          • 我有个大胆的想法
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档