对于囊中羞涩的我们来说,只要能白嫖,就绝不乱花钱。惯常申请免费 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 证书的更多相关文章

  1. 使用acme.sh自动申请、续期、部署免费的SSL证书

    参考文档:https://github.com/acmesh-official/acme.sh 一个使用纯shell操作的免费SSL证书申请部署工具. 免费的SSL证书由以下CA机构提供: ZeroS ...

  2. 新开源HTML5单文件网页版ACME客户端,可在线申请Let's Encrypt、ZeroSSL免费HTTPS多域名通配符泛域名SSL/TLS证书(RSA/ECC/ECDSA)

    目录 开源项目的起源 项目地址 使用方法 第一步:选择Let's Encrypt.ZeroSSL或其他证书颁发机构 第二步:证书配置,填写域名 第三步:完成域名所有权的验证 第四步:下载保存证书PEM ...

  3. Hexo瞎折腾系列(7) - Coding Pages申请SSL/TLS证书错误

    问题 今天我的个人站点SSL/TLS证书到期,我的证书是由Coding Pages提供的,每次申请成功后有效期是三个月,证书到期后可以继续免费申请.但是当我登陆进入Coding Pages服务的后台并 ...

  4. 手把手教你为基于Netty的IM生成自签名SSL/TLS证书

    1.引言 对于IM聊天应用来说,为了提升安全性,对聊天消息加密是常规操作. 众所周之,Netty是高性能的Java NIO网络通信框架,因而用Netty来写IM是再正常不过了.网上关于为Netty生成 ...

  5. 如何在Nginx不绑定域名下使用SSL/TLS证书?

    前提 该文主要记录如何在没有购买域名的情况下使用SSL/TLS协议,即地址前面的http变成了https.但是这样的SSL协议是会被浏览器认为是不安全的.在开发或者测试环境可以这样搞,生产环境下还是乖 ...

  6. iOS https认证 && SSL/TLS证书申请

    1.下面列出截止2016年底市面上常见的免费CA证书: 腾讯云SSL证书管理(赛门铁克TrustAsia DV SSL证书)阿里云云盾证书服务(赛门铁克DV SSL证书)百度云SSL证书服务Let's ...

  7. 申请免费的ssl通配符证书

    吐曹: 为了给我网站配置免费的htpps证书费死劲了, 折腾了一天, 找阿里阿里给我反馈的和我自己看的一样, 没什么用 我用Certbot生成证书以后怎么访问都是阿里的免费的hppts证书, 我都把阿 ...

  8. win10系统iis下部署搭建https (ssl/tls)本地测试环境

    有时想要把公司的某些XX项目部署成https站点,是为了在传输层加密传输,防止他人嗅探站点重要数据信息,平常我们使用的http方式都是明文方式传输的很不安全,容易被他人窃取.而有些时候要在本地搭建ht ...

  9. 使用Let’s Encrypt生成免费的SSL证书

    SSL(安全套接层,Secure Sockets Layer),及其继任者 TLS (传输层安全,Transport Layer Security)是为网络通信提供安全及数据完整性的一种安全协议.TL ...

  10. 免费的SSL证书,你值得拥有!Let's Encrypt 试用体验记录

    早上收到 Let’s Encrypt 的邮件,说偶之前申请的已经通过了,于是马上开始试用.Let’s Encrypt 是一个新的数字证书认证机构,它通过自动化的过程消除创建和安装证书的复杂性,为网站提 ...

随机推荐

  1. 在python中实现二叉树

    二叉树设计 定义节点类 class Node: # 修改初始化方法 def init(self,value): self.value = value # 节点值 self.left = None # ...

  2. mongodb基础整理篇————聚合操作[三]

    前言 简单整理一下聚合操作. 正文 什么是聚合框架: 作用于一个或多个集合上 对集合的数据进行的一系列运算 将这些数据转换为期望的形式 从效果而言, 聚合框架相当于SQL 查询中的: Group By ...

  3. docker 应用篇————docker安装[二]

    前言 这其实是去年的一篇blog,忘了写了.本来我想先发一下理论的,但是水平.... 正文 如果你不熟悉linux,而是使用windows,那么你可以这样下载windows桌面版或者说你在这之前完全不 ...

  4. Kotlin泛型的高级特性

    Kotlin中是可以将内联函数中的泛型进行实化的. 那么具体该怎么写才能将泛型实化呢?首先,该函数必须是内联函数才行,也就是要用inline 关键字来修饰该函数.其次,在声明泛型的地方必须加上reif ...

  5. 动手实现自己的http服务器【精简版】

    1 package v2; 2 3 import java.io.IOException; 4 import java.io.OutputStream; 5 import java.io.PrintS ...

  6. Flink 自定义 ClickHouse Table Connector 的简单实现

    本次实现基于 Flink 1.18 版本,具体的对象之间的关系可以先参考官网的图: 先拿官网上的 Socket 示例来说一下实现过程: 首先编写 SocketDynamicTableFactory 实 ...

  7. 力扣54(java)-螺旋矩阵(中等)

    题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. 示例 1: 提示: m == matrix.lengthn == matrix[i].leng ...

  8. 一文了解阿里一站式图计算平台GraphScope

    简介: 随着大数据的爆发,图数据的应用规模不断增长,现有的图计算系统仍然存在一定的局限.阿里巴巴拥有全球最大的商品知识图谱,在丰富的图场景和真实应用的驱动下,阿里巴巴达摩院智能计算实验室研发并开源了全 ...

  9. 阿里云何万青:南坡VS北坡,阿里云高性能计算行业实践

    ​简介:北坡模式:借助于云上大计算性能突破来提供HPC服务,切入的重点更加聚焦于云服务. 随着数字化转型的深入,行业应用对算力提出更高要求.为满足不同行业灵活的业务形态与计算需求,以云计算技术为服务模 ...

  10. WPF 引用 UWP 控件 不打包为 MSIX 分发的方法

    按照微软的官方文档,大部分的文档都会说如果用了 XAML Islands 等技术的时候,需要新建一个打包项目,将 WPF 应用打包为 msix 等才可以进行分发和使用.但是实际上不打包也可以,此时可以 ...