tnblog
首页
视频
资源
登录

免费证书管理

6728人阅读 2023/1/2 16:51 总访问:3466987 评论:0 收藏:0 手机
分类: 容器编排


免费证书管理

什么是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。

  1. mkdir /bob/certbot/certs -p
  2. cd /bob/certbot
  3. vim dockerfile


里面就做了安装certbot操作。

  1. FROM debian:buster
  2. RUN apt-get update -y && apt-get install -y certbot


执行如下命令进行生成容器镜像。当生成完成后,运行并共享当前的目录以及当前目录下的/certs目录,映射到/etc/letsencrypt目录下。

  1. # 生成
  2. docker build . -t certbot
  3. # 运行certbot容器
  4. docker run -it --rm --name certbot \
  5. -v ${PWD}:/letsencrypt \
  6. -v ${PWD}/certs:/etc/letsencrypt \
  7. certbot bash


由于我们在进行证书认证的时候,需要域名进行生成一些文件信息到/.well-known/acme-challenge/连接下进行CA验证,所以我们打开一个新的命令窗口运行一个nginx并将访问/.well-known/acme-challenge/的连接共享/letsencrypt/目录。

  1. cd /bob/certbot
  2. vim nginx.conf
  1. user nginx;
  2. worker_processes 1;
  3. error_log /var/log/nginx/error.log warn;
  4. pid /var/run/nginx.pid;
  5. events {
  6. worker_connections 1024;
  7. }
  8. http {
  9. include /etc/nginx/mime.types;
  10. default_type application/octet-stream;
  11. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  12. '$status $body_bytes_sent "$http_referer" '
  13. '"$http_user_agent" "$http_x_forwarded_for"';
  14. access_log /var/log/nginx/access.log main;
  15. sendfile on;
  16. keepalive_timeout 65;
  17. server {
  18. listen 80;
  19. location /.well-known/acme-challenge/ {
  20. root /letsencrypt/;
  21. }
  22. location / {
  23. gzip off;
  24. root /usr/share/nginx/html/;
  25. index index.html;
  26. }
  27. }
  28. }
  1. docker run -d --name nginx \
  2. -v ${PWD}/nginx.conf:/etc/nginx/nginx.conf \
  3. -v ${PWD}:/letsencrypt \
  4. -v ${PWD}/certs:/etc/letsencrypt \
  5. -p 80:80 \
  6. -p 443:443 \
  7. nginx


然后我们在certbot中执行生成证书相关的命令。

  1. # 向Let’s Encrypt请求生成的相关证书
  2. certbot certonly --webroot
  3. # 输入邮箱
  4. 86382516@qq.com
  5. # 是否同意条款
  6. A
  7. # 不通知到邮箱
  8. N
  9. # 写入我们的域名
  10. aidasi.top
  11. # 将相关证书文件输出到/letsencrypt文件夹下
  12. /letsencrypt


然后我们可以进行更改nginx的配置,将我们的ca文件配置到nginx中。

  1. cd /bob/certbot
  2. vim nginx.conf
  1. user nginx;
  2. worker_processes 1;
  3. error_log /var/log/nginx/error.log warn;
  4. pid /var/run/nginx.pid;
  5. events {
  6. worker_connections 1024;
  7. }
  8. http {
  9. include /etc/nginx/mime.types;
  10. default_type application/octet-stream;
  11. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  12. '$status $body_bytes_sent "$http_referer" '
  13. '"$http_user_agent" "$http_x_forwarded_for"';
  14. access_log /var/log/nginx/access.log main;
  15. sendfile on;
  16. keepalive_timeout 65;
  17. server {
  18. listen 80;
  19. location /.well-known/acme-challenge/ {
  20. root /letsencrypt/;
  21. }
  22. location / {
  23. gzip off;
  24. root /usr/share/nginx/html/;
  25. index index.html;
  26. }
  27. }
  28. server {
  29. listen 443 ssl default_server;
  30. listen [::]:443 ssl default_server ;
  31. server_name aidasi.top;
  32. ssl_certificate /etc/letsencrypt/live/aidasi.top/fullchain.pem;
  33. ssl_certificate_key /etc/letsencrypt/live/aidasi.top/privkey.pem;
  34. root /usr/share/nginx/html/;
  35. location / {
  36. gzip off;
  37. root /usr/share/nginx/html/;
  38. index index.html;
  39. }
  40. }
  41. }


更新配置

  1. docker exec -it nginx sh -c "nginx -s reload"


再次访问我们的域名https://aidasi.top/发现没什么问题了。

自动更新

  1. certbot renew --dry-run
  1. docker exec -it nginx sh -c "nginx -s reload"

撤销

  1. certbot revoke --cert-name aidasi.top
  2. certbot revoke --cert-path /etc/letsencrypt/live/aidasi.top/cert.pem

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术