使用 ACME 申请免费“永久”的 SSL 证书(补发-上一篇图裂了) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
MagicCoder

使用 ACME 申请免费“永久”的 SSL 证书(补发-上一篇图裂了)

  •  
  •   MagicCoder Jul 18, 2024 2608 views
    This topic created in 648 days ago, the information mentioned may be changed or developed.

    三个多月没写文章了,上半年经历了被裁员,找工作,入职,转正等一系列事情,目前总算是尘埃落定了,继续开始搞创作

    前言

    通过 https 协议访问网站时,SSL 证书确保了数据传输的安全性。目前,大多数云服务提供商提供的免费证书有效期只有 90 天,想要更长时间的证书则需要付费。这意味着每隔 90 天就需要重新签发并替换证书文件。

    折腾一番后,我找到了一个免费且优雅的方案,只需要在服务器上安装相关脚本,就能申请到免费的域名证书,它会定期检查证书的有效期,实现到期自动续期与更新,从而有效地获得了一个“永久”的证书。

    本文就跟大家详细分享下这个方案,欢迎各位感兴趣的开发者阅读本文。

    环境搭建

    我们需要用到ACME这个程序来完成证书的申请与签发。

    程序安装

    首先,我们需要通过SSH连接到服务器,通过以下命令来安装:

    curl https://get.acme.sh | sh 

    安装程序会自动做以下操作:

    • 自动把acme.sh安装到你的 home 的.acme.sh目录下,即~/.acme.sh/
    • 自动创建一个 bash的别名,方便命令行的直接使用: alias acme.sh=~/.acme.sh/acme.sh
    • 自动为你创建 cron 任务, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新,则会自动更新证书。

    更改默认证书

    因为 acme 已经被 ZeroSSL 收购,其默认的证书方式为 ZeroSSL ,但此证书生成时会携带邮箱,因此需要更换为letsencrypt

    acme.sh --set-default-ca --server letsencrypt 

    申请泛域名证书

    泛域名证书是一种能够为同一个主域名(例如 kaisir.cn )下的所有子域名(如 www.kaisir.comresource.kaisir.cn 等)提供安全加密的数字证书。能够通过一个单一的证书来保护主域名及其所有子域名的数据传输,使得网站管理者无需为每个子域名分别购买和管理多个 SSL 证书。

    通过 acme 申请的证书,可以绑定满足该通配符型规则的任意三级子域名,例如:

    www.kaisir.cn test.kaisir.cn aaa.kaisir.cn bb.kaisir.cn ... 

    如果你对数字证书比较感兴趣,可以移步我的另一篇文章:数字证书的理解

    获取 DNS API 参数

    acme 提供的泛域名证书只能通过 dns 的形式来做验证,因此我们需要进入域名解析控制台(你可以在此处找到你的域名解析提供商)创建 API ID 和 API Key 。

    我这里以阿里云为例,登录成功后,去到阿里云的RAM 访问控制面板来创建用户。

    image-20240619225842654

    • 创建完用户之后,点击添加权限按钮

    image-20240619225912624

    • 勾选第一页的所有权限

    image-20240619225956814

    • 复制AccessKey IDAccessKey Secret下来,保存好。

    image-20240619230641776

    配置环境变量

    由于每个平台的环境变量名称是不一样的,因此你需要去acme-dnsapi 网站里找到你平台的变量名。我这里以阿里云为例,将 key 和 secret 换成上一步创建的即可。

    export Ali_Key="key" export Ali_Secret="secret" 

    生成证书

    做完上述操作后,我们的准备工作就做完了,可以使用acme.sh脚本来创建证书了。

    acme.sh --issue --dns dns_ali -d kaisir.cn -d '*.kaisir.cn' --dnssleep 300 --debug 
    • --dns 用于指定 dns 校验平台,我这里是阿里云
    • 第一个-d是你的网站主域名,第二个是泛域名
    • --dnssleep用于等待操作,因为把 txt 添加到后台,解析不一定能做到立刻生效,所以需要延时一下,此处我设置了 300 秒的延时,执行命令的过程会有个等待倒计时。
    • --debug开启调试模式,创建过程中会打印详细的日志出来,方便定位错误。

    创建成功后,你将看到如下所示的内容:

    image-20240619231229712

    安装证书

    最后,我们只需要找到创建好的证书,将其在服务器上的路径填写到 nginx 中即可。脚本会在证书快到期时,自动续期并创建相关文件。

    本章节将以我的服务器为例,跟大家分享下如何去做相关的配置。

    配置路径映射

    如果你的服务是直接运行在宿主机上的,请跳过这一步。

    我的服务是运行在 docker 容器里的,因此需要先把服务器的证书路径映射进容器中,此处我以docker-compose为例,在volumes节点下添加映射即可。

     nginx-server: image: nginx:1.18.0 container_name: local_nginx volumes: - /root/.acme.sh/kaisir.cn_ecc:/usr/share/acme 

    注意:如果你只使用了 docker ,则需要在运行docker run指令时,通过添加-v参数来添加路径映射,例如docker run -v /root/.acme.sh/kaisir.cn_ecc:/usr/share/acme

    • /root/.acme.sh/kaisir.cn_ecc 是宿主机上的路径
    • /usr/share/acme是容器内部的路径

    如果你对 docker 不是很了解,可以移步我的另一篇文章:使用 docker 来编排 Web 应用

    配置 nginx

    随后,我们就可以打开nginx的配置文件,指定ssl 证书的位置即可。

    • /usr/share/acme/就是我们上一步所映射出来的路径
    • fullchain.cer就是我们申请到的泛域名证书
    server { # 配置 ssl 证书 ssl_certificate /usr/share/acme/fullchain.cer; ssl_certificate_key /usr/share/acme/kaisir.cn.key; } 

    实现效果

    最后,我们重启 nginx ,通过浏览器访问网站就能看到证书信息了

    image-20240620230554443

    • 访问子域名的服务也是正常的

    image-20240620232129698

    • 证书详情如下所示

    image-20240620232154469

    写在最后

    至此,文章就分享完毕了。

    我是神奇的程序员,一位前端开发工程师。

    如果你对我感兴趣,请移步我的个人网站,进一步了解。

    • 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注
    • 本文首发于神奇的程序员公众号,未经许可禁止转载
    Supplement 1    Jul 18, 2024
    文章中阿里云的 ram 控制台授权那里给的权限太多了,其实只用给一个就可以了,v 站没法更新了,原文已经更正错误了。原文地址: https://www.kaisir.cn/post/178
    9 replies    2024-07-19 13:43:08 +08:00
    yuezk
        1
    yuezk  
       Jul 18, 2024
    人生苦短,我用 Caddy 。https://caddyserver.com/
    MagicCoder
        2
    MagicCoder  
    OP
       Jul 18, 2024
    @yuezk 这个也不错
    bugfan
        3
    bugfan  
       Jul 18, 2024
    这看着太繁琐了。。。。有个免安装 acme ,免申请 dns api key 的工具。很方便

    https://www.i996.me
    或者关注微信公众号

    进去配置你的域名,然后执行一条命令就拉下来证书了,啥都不用安装。

    可以试试
    NIOB
        4
    NIOB  
       Jul 18, 2024
    最后一步证书路径和 nginx 配置确定之后可以用 acme install 命令去自动化执行(包含自定义后续指令)。
    root71370
        5
    root71370  
       Jul 18, 2024
    人生苦短 我用 1panel
    BugCry
        6
    BugCry  
       Jul 18, 2024
    人生苦短 我用 traefik
    MagicCoder
        7
    MagicCoder  
    OP
       Jul 18, 2024
    文章中阿里云的 ram 控制台授权那里给的权限太多了,其实只用给一个就可以了,v 站没法更新了,原文已经更正错误了。原文地址: https://www.kaisir.cn/post/178
    BanShe
        8
    BanShe  
       Jul 19, 2024
    人生苦短 我用 caddy
    skyrim61
        9
    skyrim61  
       Jul 19, 2024
    里面有个坑, 阿里云权限授权, 应该是给 管理 DNS 解析, 而不是 OP 截图里面的!
    About     Help     Advertise     Blog     API     FAQ     Solana     1177 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 52ms UTC 23:47 PVG 07:47 LAX 16:47 JFK 19:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86