
免费证书管理
什么是CA?
Certification Authority 简称 CA,它是证书的认证权威机构。它的体系是一个树形结构,每一个 CA 可以有一到多个子 CA ,顶层 CA 被称为根 CA 。除了根 CA 以外,其他的 CA 证书的颁发者是它的上一级 CA 。这种层级关系组成了信任链(Trust Chain)。
比如我们的tnblog.net网站,可以看到有三层,第一层根证书就是Digicert Global Root CA
,然后是中间证书Encryption Everywhere DV TLS CA - G1
,最后才是我们的网站user.tnblog.net
证书。
一般浏览器的信任的CA证书都是要钱的,那么有没有不要钱的CA证书机构呢?当然有,我们今天要讲的Let’s Encrypt就是一家免费的证书机构的组织。
Let’s Encrypt 简介
为了在您的网站上启用 HTTPS,您需要从证书颁发机构(CA)获取证书(一种文件)。 Let’s Encrypt 正是其中一家证书颁发机构。 要从 Let’s Encrypt 获取您网站域名的证书,您必须证明您对域名的实际控制权。 这一过程通常由 Web 主机上运行的 ACME 协议客户端完成。
Certbot ACME 客户端
它可以在不下线您的服务器的前提下自动执行证书颁发、安装以及更新服务证书。
Let’s Encrypt 工作原理
我们以aidasi.top
域名举例。
该流程分为两步: 首先,ACME管理软件向证书颁发机构证明该服务器拥有域名的控制权。 之后,该管理软件就可以申请、续期或吊销该域名的证书。
域名认证
Let’s Encrypt 通过公钥识别服务器管理员。 证书管理软件首次与 Let’s Encrypt 交互时,会生成新的密钥对,并向 Let’s Encrypt CA 证明服务器控制着一个或多个域名。
证明的方式有三种:
1.配置DNS记录域名指定到IP中。
2.在https://aidasi.top/
的已知?URI?下放置一个?HTTP?资源
2.1.申请一次性的数字认证(nonce),算是在第二种上进行的一种验证方式。
细节
然后被公钥标识的代理被授权为域aidasi.top管理证书。我们称代理使用的密钥对 为域aidasi.top的已授权密钥对。
证书发放与撤销
一旦代理有了已授权秘钥对,请求,更新,撤销证书就很简单了,只需要发送证书管理消息,并用授权秘钥对他们签名就可以了。
什么是CSR?
CSR 即证书签名申请(Certificate Signing Request),获取 SSL 证书,需要先生成 CSR 文件并提交给证书颁发机构(CA也是这里的Let’s Encrypt)。
CSR 包含了用于签发证书的公钥、用于辨识的名称信息(Distinguished Name)(例如域名)、真实性和完整性保护(例如数字签名),通常从 Web 服务器生成 CSR,同时创建加解密的公钥私钥对。
在创建 CSR 过程中,需要提供相关组织机构信息,web 服务器会根据提供的信息创建证书的标识名称,用来识别证书,内容如下:国家或地区代码、省或市或自治区、城市或地区、组织机构、组织机构单位、通用名称
证书的发放
为了获取域证书,代理构建一个PKCS#10证书签名请求(CSR)给CA,请求CA使用指定的公钥来发放域aidasi.top
证书。通常,CSR中包含了由一个在CSR中的公钥关联的私钥加密的签名。代理会用域aidasi.top
的已授权秘钥为整个CSR签名,以便让CA知道自己是被授权的。
当CA接收到请求,会验证两个签名。如果两个签名都是正常的,CA会为域aidasi.top
发放证书以及CSR中的公钥,一并返回给代理。
LE使用ACME协议来完成域认证和证书发放,客户端代理必须使用ACME协议与LE通信。
证书的撤销
申请吊销证书的流程类似。 证书管理软件使用 aidasi.top
的授权私钥签署一个吊销请求,Let’s Encrypt CA 将验证该请求是否已被授权。 如果已授权,则将吊销信息发布到正常的吊销通道(即 OCSP)中,以便浏览器等依赖方知道他们不应该接受这个已被吊销的证书。
实践
首先我们需要先准备一台线上的服务器。
然后将我们的域名aidasi.top
指向该服务器地址,我这里使用的是腾讯云的域名。
生成certbot容器
这里我们编写certbot容器的dockerfile。
mkdir /bob/certbot/certs -p
cd /bob/certbot
vim dockerfile
里面就做了安装certbot操作。
FROM debian:buster
RUN apt-get update -y && apt-get install -y certbot
执行如下命令进行生成容器镜像。当生成完成后,运行并共享当前的目录以及当前目录下的/certs
目录,映射到/etc/letsencrypt
目录下。
# 生成
docker build . -t certbot
# 运行certbot容器
docker run -it --rm --name certbot \
-v ${PWD}:/letsencrypt \
-v ${PWD}/certs:/etc/letsencrypt \
certbot bash
由于我们在进行证书认证的时候,需要域名进行生成一些文件信息到/.well-known/acme-challenge/
连接下进行CA验证,所以我们打开一个新的命令窗口运行一个nginx并将访问/.well-known/acme-challenge/
的连接共享/letsencrypt/
目录。
cd /bob/certbot
vim nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
location /.well-known/acme-challenge/ {
root /letsencrypt/;
}
location / {
gzip off;
root /usr/share/nginx/html/;
index index.html;
}
}
}
docker run -d --name nginx \
-v ${PWD}/nginx.conf:/etc/nginx/nginx.conf \
-v ${PWD}:/letsencrypt \
-v ${PWD}/certs:/etc/letsencrypt \
-p 80:80 \
-p 443:443 \
nginx
然后我们在certbot中执行生成证书相关的命令。
# 向Let’s Encrypt请求生成的相关证书
certbot certonly --webroot
# 输入邮箱
86382516@qq.com
# 是否同意条款
A
# 不通知到邮箱
N
# 写入我们的域名
aidasi.top
# 将相关证书文件输出到/letsencrypt文件夹下
/letsencrypt
然后我们可以进行更改nginx的配置,将我们的ca文件配置到nginx中。
cd /bob/certbot
vim nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
location /.well-known/acme-challenge/ {
root /letsencrypt/;
}
location / {
gzip off;
root /usr/share/nginx/html/;
index index.html;
}
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server ;
server_name aidasi.top;
ssl_certificate /etc/letsencrypt/live/aidasi.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/aidasi.top/privkey.pem;
root /usr/share/nginx/html/;
location / {
gzip off;
root /usr/share/nginx/html/;
index index.html;
}
}
}
更新配置
docker exec -it nginx sh -c "nginx -s reload"
再次访问我们的域名https://aidasi.top/
发现没什么问题了。
自动更新
certbot renew --dry-run
docker exec -it nginx sh -c "nginx -s reload"
撤销
certbot revoke --cert-name aidasi.top
certbot revoke --cert-path /etc/letsencrypt/live/aidasi.top/cert.pem
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

