V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
jonathon523
V2EX  ›  分享创造

使用 ACME.SH 申请 Google CA SSL 证书

  •  
  •   jonathon523 ·
    Jonathan523 · 2023-01-20 17:14:28 +08:00 · 6243 次点击
    这是一个创建于 673 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文原创于Cestlavie Blog|原文链接


    前言

    最近谷歌开放了自家的 GTS CA(Google Trust Services),谷歌作为全球大厂那不得好好嫖一下!目前该服务进入了 Public Review 阶段,不再需要申请内测资格,而且支持 acme.sh 快速申请,那不就是嫖他的好日子来了吗!

    证书简介

    GTS SSL 证书的特点是

    • 支持 IP 地址块持有者申请 IP 地址证书

    • 根 CA 为 GlobalSign,根 CA 的支持性和兼容性比 Let's Encrypt

    • 支持安全性和性能更好的ECC 证书

    • 支持多域名泛域名证书申请(例如*.cestlavie.moe

    • 有效期为90 天

    • 支持的 ACME 验证方式为TLS-ALPN-01HTTP-01、和 DNS-01

    • 暂不支持邮箱验证方式申请

    • 暂不支持国际化域名编码的域名

    申请步骤

    获取注册密钥

    打开shell.cloud.google.com,输入以下代码

    $ gcloud beta publicca external-account-keys create #创建凭据
    

    回显为

    $ gcloud beta publicca external-account-keys create
    API [publicca.googleapis.com] not enabled on project [<projectid>]. Would you like to enable and retry (this will take a few minutes)? (y/N)?  y #允许创建 publica API
    Enabling service [publicca.googleapis.com] on project [<projectid>]...
    Operation "operations/acat.p2-<projectid>-<uuid>" finished successfully.
    Created an external account key
    [b64MacKey: <hmac_key>
    keyId: <keyid>]
    

    保存好输出的<hmac_key><keyid>,接下来要用

    安装acme.sh

    curl  https://get.acme.sh | sh -s   # 请确保已安装 curl
    

    显示Install success!即为安装成功

    使用凭据注册

    acme.sh --set-default-ca --server google #切换默认 CA 为 Google
    acme.sh --server https://dv.acme-v02.api.pki.goog/directory \
    --register-account  --accountemail <Your_Email> --eab-kid <keyid> --eab-hmac-key <hmac_key> # 使用刚刚获取凭据注册账号
    

    签发证书

    1. 使用 TXT 记录手动验证 DNS
    acme.sh  --issue  --dns   -d yourdomain.com \
    --yes-I-know-dns-manual-mode-enough-go-ahead-please
    

    然后根据回显中

    Add the following TXT record:
    Domain: '_acme-challenge.yourdomain.com'
    TXT value: '<TXT_value>'
    

    设置 DNS 记录,完成后输入

    acme.sh  --renew   -d yourdomain.com \
    --yes-I-know-dns-manual-mode-enough-go-ahead-please
    

    完成证书申请

    显示Cert success即为申请成功

    可以在~/.acme.sh/yourdomain.com/下获取证书

    1. 使用 Cloudflare API 自动验证 DNS

    (注:这里默认使用了 Cloudflare 来演示自动申请证书,详细的支持列表及申请方法可以在这里找到)

    首先获取你的Global API Key可在此处获取

    然后在终端中输入

    export CF_Key='<YourGlobalAPIKey>'
    export CF_Email="<YourEmail>"
    

    接下来申请证书,输入

    acme.sh --issue --dns dns_cf -d yourdomain.com #单域名
    acme.sh --issue --dns dns_cf -d *.yourdomain.com #泛域名
    acme.sh --issue --dns dns_cf -d sub1.yourdomain.com -d sub2.yourdomain.com #多域名
    acme.sh --issue --dns dns_cf -d yourdomain.com --ecc #ECC 证书
    

    看到回显Cert success即为申请成功,可以在~/.acme.sh/yourdomain.com/下获取证书

    • 此时 Cloudflare 凭据会自动存储至~/.acme.sh/account.conf用于续期目的

    文中部分信息已做脱敏处理

    注:申请下的证书路径为

    参考文献

    1. acme.sh Wiki - github.com

    2. Automate Public Certificates Lifecycle Management via RFC 8555 (ACME) - google.com

    30 条回复    2023-01-27 09:36:03 +08:00
    ab
        1
    ab  
       2023-01-20 19:06:33 +08:00
    国内 VPS 可以吗?
    jonathon523
        2
    jonathon523  
    OP
       2023-01-20 19:59:59 +08:00 via Android
    @ab 可以的,在国内有申请节点,但是需要先魔法在 Google Cloud Shell 获得 b64MacKey 和 keyid
    666VS2333
        3
    666VS2333  
       2023-01-20 21:25:32 +08:00 via Android
    到期可以续吗
    jonathon523
        4
    jonathon523  
    OP
       2023-01-20 21:33:04 +08:00 via Android
    @666VS2333 可以的,支持 acme.sh 自动续期
    666VS2333
        5
    666VS2333  
       2023-01-20 22:48:16 +08:00 via Android
    @jonathon523 感谢老哥
    daiv
        6
    daiv  
       2023-01-20 23:06:18 +08:00
    Let's Encrypt / ZeroSSL

    现在多了这个, 给个切换的理由呗
    jonathon523
        7
    jonathon523  
    OP
       2023-01-21 01:19:11 +08:00 via Android
    @daiv 国内 VPS 申请方便;根 CA 为 GlobalSign ,根 CA 的支持性和兼容性比 Let's Encrypt 好;签发速度比 ZeroSSL 快得多,ZeroSSL 经常时不时抽风,这个不会。
    superares
        8
    superares  
       2023-01-21 08:18:17 +08:00 via iPhone
    可惜还是 preview 状态,cert-manager 还不支持
    simau
        9
    simau  
       2023-01-21 08:56:07 +08:00
    补充一下:需要先设置一下自己的 project id ,project id 可以在 gcp console 页找到,$ gcloud config set project project_id
    jonathon523
        10
    jonathon523  
    OP
       2023-01-21 08:59:56 +08:00 via Android
    @superares 已经是 Public Review 了
    官方文档里面有说
    For Kubernetes based workloads
    If you are using Kubernetes, thanks to cert-manager (another ACME client), it is just as easy.
    具体请看 https://cloud.google.com/blog/products/identity-security/automate-public-certificate-lifecycle-management-via--acme-client-api
    jonathon523
        11
    jonathon523  
    OP
       2023-01-21 09:03:28 +08:00 via Android
    @simau 可以先在 console.cloud.google.com 顶栏选好项目再点击 Cloud Shell 的图标创建 session ,或者在 shell.console.cloud.google.com 标签页切换栏中点击加号旁边的三角,选择对应的 project id
    jonathon523
        12
    jonathon523  
    OP
       2023-01-21 09:11:43 +08:00 via Android
    @daiv 还想到一个,Let's Encrypt 的证书因为很多翻墙的人和灰产在用,会被 GFW 重点关照。
    simau
        13
    simau  
       2023-01-21 09:20:16 +08:00
    @jonathon523 刚刚试过了,没魔法访问不了 https://dv.acme-v02.api.pki.goog ,op 确定是可以访问?
    superares
        14
    superares  
       2023-01-21 10:27:32 +08:00
    @jonathon523 好使。和 ZeroSSL 的方式一样
    jonathon523
        15
    jonathon523  
    OP
       2023-01-21 10:32:20 +08:00 via Android
    @simau 刚刚测试了一下好像确实访问不了了,估计是这两天刚墙
    我待会儿看看能不能搞个反向代理用
    me221
        16
    me221  
       2023-01-21 13:27:51 +08:00
    感谢分享, 不过国内不能顺利申请
    jonathon523
        18
    jonathon523  
    OP
       2023-01-21 16:14:02 +08:00 via Android
    @winterbells IP 地址证书需要 IP 地址块持有者申请,acme 没法搞
    siknet
        19
    siknet  
       2023-01-21 16:33:31 +08:00 via Android
    有老哥弄个自动续期的脚本嘛
    me221
        20
    me221  
       2023-01-21 18:36:30 +08:00
    我打算用 actions 自动续期, 发现 hmac_key 和 keyid 只能用一次....
    winterbells
        21
    winterbells  
       2023-01-21 20:20:37 +08:00 via Android
    @jonathon523 噢噢,突然理解了
    daiv
        22
    daiv  
       2023-01-21 22:24:41 +08:00
    @me221 #20 啊, 那岂不是很不方便
    jonathon523
        23
    jonathon523  
    OP
       2023-01-22 00:10:20 +08:00 via Android
    @me221 对的。但是限制仅限注册,所以建议服务器上部署来实现自动续期,或者发布一个私有的已经注册完成的 docker 实现

    @daiv acme.sh 还是会在你申请的服务器上创建定时任务,进行续期的,但是对于 action 这种每次都相当于新的服务器,需要重新注册,那就必须得换或者直接用注册好的 docker 镜像了
    bugfan
        24
    bugfan  
       2023-01-22 23:56:37 +08:00 via iPhone
    @siknet 哈哈 你看看 https://www.i996.me 里面的证书签发功能,只需要 2 步,就能帮你签好证书,支持房,域名证书,而且这个支持以文件夹方式下载和 http api 方式获取,方便你集成到自己程序里。如果你用 nginx 可以用文件夹方式获取,配置到计划任务就行了
    jonathon523
        25
    jonathon523  
    OP
       2023-01-23 08:40:46 +08:00 via Android
    @siknet acmesh 还是会在你申请的服务器上创建定时任务,进行续期的
    chancat
        26
    chancat  
       2023-01-23 12:41:09 +08:00 via Android
    谢谢分享,看看先
    blankmiss
        27
    blankmiss  
       2023-01-23 17:09:04 +08:00
    能签泛域名吗
    jonathon523
        28
    jonathon523  
    OP
       2023-01-23 18:29:14 +08:00 via Android
    @blankmiss 可以的
    elboble
        29
    elboble  
       2023-01-26 15:23:40 +08:00
    已经用上了,暂时没发现区别。

    对了,原来没用过 google 的云服务,这样算开了服务,会收费吗??
    jonathon523
        30
    jonathon523  
    OP
       2023-01-27 09:36:03 +08:00 via Android
    @elboble 这个是免费的,不会收费
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2500 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:44 · PVG 23:44 · LAX 07:44 · JFK 10:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.