申请并部署免费的 SSL/TLS 证书

ssl,tls · 浏览次数 : 22

小编点评

**免费 CA 选择** 您可以考虑以下免费 CA 选择: * **Let's Encrypt** * **ZeroSSL** **Let's Encrypt** * 是由 Internet Security Research Group (ISRG) 发起的公共利益项目。 * 提供 ACME 协议,允许您使用任何 ACME 客户端获取 SSL/TLS 证书。 * 支持所有主要的浏览器。 **ZeroSSL** * 是由 ZeroSSL 公司开发的证书服务。 * 只支持 HTTPS 协议。 * 拥有优越的性能。

正文

对于囊中羞涩的我们来说,只要能白嫖,就绝不乱花钱。惯常申请免费 SSL/TLS 证书的途径有:

  • 各大云服务平台限量提供。比如阿里云会给每个账号每年 20 个证书的申请额度。缺点是不支持泛域名,一年后须重新申请并部署;
  • 一些网络服务商如Cloudflare会提供自动化的证书服务,只要在它们的官网作简单配置即可。缺点是流量都要经其中转,在某些未很好覆盖的区域网站性能会受限;
  • 直接从免费证书颁发机构(CA)那里申请。通过脚本可使得获取、安装和续期 SSL/TLS 证书完全自动化。缺点是有一定的操作门槛。

本文介绍最后这种方式。

免费 CA 选择

免费 CA,常考虑的有 Let’s EncryptZeroSSL。两者差异可自行网搜,基本上都能满足我们普通用户的需求,选择哪一个更依赖于申请过程是否顺利。

以 Let’s Encrypt 作一简单介绍。它是由 Internet Security Research Group (ISRG) 发起的公共利益项目,于2016年推出,由 Mozilla, Cisco, Akamai, Linux Foundation, Google, Microsoft, OVH 和其它一些组织支持。这个项目的主要目标是促进 HTTPS 协议的普及。Let’s Encrypt 使用 ACME 协议来验证您对给定域名的控制权并向您颁发证书,也就是说,要获得 Let’s Encrypt 证书,需要选择一个 ACME 客户端。

这里以 acme.sh 为例。acme.sh 实现了 ACME 协议, 默认 CA 是 ZeroSSL。然而笔者在申请时一直报Order status is processing, lets sleep and retry,retry 多次后报 504,不知为何。所以笔者将默认 CA 设置为 Let’s Encrypt:acme.sh --set-default-ca --server letsencrypt

申请并部署证书

安装 acme.sh

不清楚 docker 模式安装会否自动续期,所以直接安装到宿主机 curl https://get.acme.sh | sh -s email=xxx@xxx。直接安装会自动创建 cronjob, 每天自动检测所有的证书, 如果快过期了需要更新, 则会自动更新证书。

如前所述,设置默认 CA:acme.sh --set-default-ca --server letsencrypt

申请

在证书申请过程中,acme.sh 需要确认域名属于你本人,有两种验证方式:http 和 dns。

  • http mode: 支持自动更新证书;不支持通配符即泛域名。
  • dns mode:支持泛域名;但如果不同时配置 Automatic DNS API,将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。所以,如果你有多个二级域名需要绑定证书,要么就使用下述 http mode 的指令,要么就去 dns 服务商处拿到 API Access(可能会有一些要求)。 参看acme.sh 支持的 dns 服务商列表

这里我们以 http mode 为例。

先设置好 DNS 解析记录,将待申请证书的域名 A 记录到服务器 IP。然后如下脚本申请证书,acme.sh 会同时进行域名验证。

acme.sh --issue -d demo.com -d www.demo.com -d admin.demo.com --webroot /srv/www/html/

只需要指定域名,并指定对应的网站根目录,acme.sh 会自动生成验证文件,并放到网站根目录,然后自动完成验证,最后会删除验证文件。

如果你用的是直接在宿主机安装的 nginx 服务器,甚至不需要指定网站根目录。acme.sh 可以智能地依据 nginx 配置自动完成验证:

acme.sh --issue -d demo.com ... --nginx

上述脚本的前提是 acme.sh 可以调用 nginx 指令,否则会报 nginx command is not found 错误。所以如果 nginx 是以 docker 方式安装,这种方式将无法成功;还是得使用 --webroot 的方式,只要将 nginx 根目录映射出来即可,如下:

docker run --name ngix -v /srv/www/html:/usr/share/nginx/html:ro -v /srv/www/nginx.conf:/etc/nginx/nginx.conf:ro -p 80:80 -p 443:443 --network inner_net --restart=always -d --label=sh.acme.autoload.domain=anything nginx:stable-alpine

注意脚本中的 label,用于后续部署证书时 acme.sh 定位该容器。这里的 anything 可以替换为任意字符。

域名验证无误的话,acme.sh 会去 CA 那里获取证书,并下载到本地。一个主域名及其多个子域名同时申请的话,CA 只为它们签发一张证书。

部署

还是以 nginx docker 容器为例。

# The label value to find the container
# 多个不同域名申请证书时可重复使用该容器
export DEPLOY_DOCKER_CONTAINER_LABEL=sh.acme.autoload.domain=anything

# The target file path in the container.
# The files will be copied to the position in the container.
export DEPLOY_DOCKER_CONTAINER_KEY_FILE="/etc/nginx/ssl/demo.com/key.pem"
export DEPLOY_DOCKER_CONTAINER_CERT_FILE="/etc/nginx/ssl/demo.com/cert.pem"
export DEPLOY_DOCKER_CONTAINER_CA_FILE="/etc/nginx/ssl/demo.com/ca.pem"
export DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE="/etc/nginx/ssl/demo.com/full.pem"

# The command to reload the service in the container.
export DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="nginx -s reload"

# -d 指定 acme.sh --issue 时第一个[二级]域名或其执行结果产生的目录名
acme.sh --deploy --deploy-hook docker -d demo.com

笔者尚不清楚自动更新证书时是否会将新证书自动拷贝至容器内,推测应该是会的,这些临时环境变量应该会以当前申请的域名配置项的形式固化到磁盘中。

配置 nginx.conf

在 http 节中加入如下配置

server {
     listen 443 ssl;
     # 二级域名配置相同,本文略过
     server_name demo.com;
     root /usr/share/nginx/html;
     # 上一步证书拷贝的地址
     ssl_certificate /etc/nginx/ssl/demo.com/cert.pem;
     ssl_certificate_key /etc/nginx/ssl/demo.com/key.pem;
 
     ssl_session_cache shared:SSL:1m;
     ssl_session_timeout 5m;
 
     #默认加密套件
     ssl_ciphers HIGH:!aNULL:!MD5;
     #表示优先使用服务端加密套件。默认开启
     ssl_prefer_server_ciphers on; 
 
    location / {
           index index.html index.htm;
    }
}

吊销证书

假如因某种原因需要吊销证书的话,可执行如下脚本:

acme.sh --revoke -d demo.com -d www.demo.com -d admin.demo.com

笔者尚不清楚在一个主域名及其多个子域名共用一张证书的情况下,是否可只给部分域名吊销证书。

与申请并部署免费的 SSL/TLS 证书相似的内容:

申请并部署免费的 SSL/TLS 证书

对于囊中羞涩的我们来说,只要能白嫖,就绝不乱花钱。惯常申请免费 SSL/TLS 证书的途径有: 各大云服务平台限量提供。比如阿里云会给每个账号每年 20 个证书的申请额度。缺点是不支持泛域名,一年后须重新申请并部署; 一些网络服务商如Cloudflare会提供自动化的证书服务,只要在它们的官网作简单

[转帖]acme.sh-实现自动化部署SSL证书

https://cloud.tencent.com/developer/article/2055254 前言 ; acme 我一直使用的都是Let's Encrypt免费的证书,昨天看到群里的大佬发出了一个测试的证书申请的脚本命令,我才接触到acme.sh,于是我查阅了很多大佬的博文了解这个脚本的使

电信企业宽带安装总结

背景 因为部分兼容以及性能测试用的服务器无法购买 这边通过大学时期上上铺在读博士的同学联系到了: 齐鲁软件园公共设施服务中心的管理人员 可以在EDA机房申请几台鲲鹏服务器进行试用. 但是因为不提供网络所以非常复杂. 经过多方比较, 联系到了电信公司,准备进行电信宽带的部署. 因为想要固定IP地址.

[转帖]生成并配置https本地证书

https://www.cnblogs.com/linyufeng/p/14591357.html 1. 生成证书 https证书可以在网上申请免费证书 https://freessl.cn/ ,也可以本地生成.本地生成可以使用keytools和mkcert, keytools是一个Java数据证书

FreeSSL申请免费证书

FreeSSL申请免费证书 FreeSSL 是一个免费证书和 SSL 证书管理平台。旨在为个人和小型企业提供免费 SSL 证书,以加强他们的网站和应用程序的安全性。与传统的 SSL 证书颁发机构不同,FreeSSL 使用自动化过程生成 SSL 证书,并提供一个管理面板,让用户可以轻松管理他们的证书和

【FAQ】申请Health Kit权限的常见问题及解答

华为运动健康服务(HUAWEI Health Kit)提供原子化数据开放,用户数据被授权获取后,应用可通过接口访问运动健康数据,对相关数据进行增、删、改、查等操作。这篇文章汇总了申请开通Health Kit测试权限的常见问题,并给出了详细解答,希望为开发者提供相关参考。 (1) 申请Health K

uniapp+thinkphp5实现微信登录

前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F

LLM实战:当网页爬虫集成gpt3.5

本文主要是通过Scrapegraph-ai集成gpt3.5实现一个简单的网页爬取并解析的demo应用,其中涉及到gpt3.5免费申请,Scrapegraph-ai底层原理简介,demo应用源码等。

CANN开发实践:4个DVPP内存问题的典型案例解读

摘要:由于DVPP媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于DVPP内存问题的典型案例,并给出原因分析及解决方法。 本文分享自华为云社区《FAQ_DVPP内存问题案例》,作者:昇腾CANN。 DVPP

微信小程序生态15- 批量提交微信小程序审核的一种方式

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是『微信小程序生态系列文章』正文! # 需求背景 我们是一个提供SaaS服务的小程序服务商,会给每一个客户申请一个专属的小程序,到目前为止已经差不