跳转至

免费申请SSL证书

前言

HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol。它是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议,HTTP信息是明文传输,HTTPS则是具有安全性的ssl/tls加密传输协议。HTTP的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全,官方文档已经有切换HTTPS的指导手册了http切换https,我为什么会在这里多此一举呢,是因为使用服务器生成的证书在访问的时候,浏览器会提示不安全,证书不可信,具体的原因可以自行搜索一下(可信的CA机构)。

image.png

今天在这里就介绍一款安全、可被浏览器信任的证书:Let’s Encrypt免费证书

准备工作

  • 一台可以访问互联网的服务器(最低配置:2C/2G)

申请证书

1. 安装snapd

1
sudo yum install epel-release -y

image.png

1
sudo yum install snapd -y

image.png

1
sudo systemctl enable --now snapd.socket

image.png

1
2
sudo service snapd start
sudo ln -s /var/lib/snapd/snap /snap

image.png

2. 安装certbot

1
sudo snap install core

image.png

image.png

1
sudo snap refresh core

image.png

1
sudo snap install --classic certbot

image.png

1
sudo ln -s /snap/bin/certbot /usr/bin/certbot

image.png

至此certbot安装已完成,接下来就是申请证书了

3. 证书申请

这是使用的是泛解析域名,填写蓝鲸平台的主域名就可以了

1
certbot certonly --email 邮箱地址 -d *.平台主域名 --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory 

image.png

在域名控制台,将下面的TXT格式的解析和域名做个解析,这是域名所属权的校验

image.png

这里需要注意的是TXT解析,解析值需要加上双引号(经测试,华为域名解析需要加双引号,阿里域名解析则不需要)

image.png

解析完成以后,直接回车,校验没问题的话,会返回证书在服务器的位置和到期时间,因为这是免费的,所以使用期限只有3个月,后面会介绍自动续费的方式

image.png

4. 证书续费(自动续费)

其实续费很简单,流程和申请一样:

1
2
certbot renew  --cert-name zkmlops.com # 证书有效期小于30天才会renew
certbot renew   --force-renewal --cert-name zkmlops.com # 强行renew

但是每次都需要手动更新域名解析的值,这很不“运维”,我想让他可以自己更新域名解析。各种翻阅资料,查询华为API文档后,真被我捣鼓出来了,直接放代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python

from huaweicloudsdkcore.auth.credentials import BasicCredentials
from huaweicloudsdkcore.exceptions import exceptions
from huaweicloudsdkdns.v2.region.dns_region import DnsRegion
from huaweicloudsdkdns.v2 import *
import os

domain = os.environ["CERTBOT_DOMAIN"]
value = os.environ["CERTBOT_VALIDATION"]

ak = ""
sk = ""

credentials = BasicCredentials(ak, sk)

client = DnsClient.new_builder() \
    .with_credentials(credentials) \
    .with_region(DnsRegion.value_of("cn-east-3")) \
    .build()

try:
    request = UpdateRecordSetRequest()
    request.zone_id = ""  # 自己在控制台查
    request.recordset_id = "" # 自己在控制台查
    listUpdateRecordSetReqRecordsbody = [
        '\"' + value + '\"'
    ]
    request.body = UpdateRecordSetReq(
        records=listUpdateRecordSetReqRecordsbody,
        type="TXT",
        name="_acme-challenge.xxxxx.com."
    )
    response = client.update_record_set(request)
    print(response)
except exceptions.ClientRequestException as e:
    print(e.status_code)
    print(e.request_id)
    print(e.error_code)
    print(e.error_msg)

image.png

因为我的域名是在华为上申请的,所以我只捣鼓出了华为的脚本,阿里的脚本你们自己捣鼓吧: - 华为API调试控制台:https://apiexplorer.developer.huaweicloud.com/apiexplorer/sdk?product=DNS&api=ListRecordSets - 阿里API调试控制台::https://next.api.aliyun.com/api-tools/sdk/Alidns?version=2015-01-09&language=python-tea

有了脚本我们续费就可以使用脚本来帮我们修改解析了

certbot renew  --cert-name chenshanb3.com --manual-auth-hook /path/to/certbot_renew_hw.py

也可以加入定时任务

0 0 15 * * certbot renew  --cert-name chenshanb3.com --manual-auth-hook /path/to/certbot_renew_hw.py

总结

虽然每三个月续费一次很麻烦,但是架不住免费呀,在专业机构申请证书动不动就是几万、几十万,使用免费的,运维成本不就降下来了(手动滑稽)~~~ 市面上还有很多域名申请的软件和服务,比如“宝塔面板”,官网地址:https://www.bt.cn/new/index.html,我也安装体验了一下,以下观点只代表我个人: 1. 需要注册才能进入面板使用 2. 都是收费的,唯一免费用的也是Let’s Encrypt免费证书 所以我放弃使用宝塔面板 如果你有更好的域名申请方式,欢迎推荐~~~~

(需要注意的是,一台服务器只能给5个域名申请证书,每天申请的次数也有限制,申请完成以后,别多次测试,不然你就只能换台服务器了。snap和certbot都是国外的软件,所以懂的都懂,安装过程可能会有点慢,耐心等待就可以了)