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