• 使用acme.sh配置https证书


    想使用免费的https证书怎么办?想自动给证书续期怎么办?

    Let’s Encrypt 是一家免费、开放、自动化的证书颁发机构(CA),为公众的利益而运行。 它是一项由 Internet Security Research Group (ISRG) 提供的服务。
    以尽可能对用户友好的方式免费提供为网站启用 HTTPS(SSL/TLS)所需的数字证书

    官网上列出有很多可支持生成证书及维护的客户端工具
    https://letsencrypt.org/zh-cn/docs/client-options/
    这里选择acem.sh,使用很简单

    0、证书链问题

    最重要的问题,所以先说
    按一般的教程配置后,浏览器都通过了,但是微信小程序无法使用访问,这是因为微信要求证书链完整,必须引用那个fullchain.cer才可以。

    一定要注意,引用的cer文件不能是域名位名称那个cer文件,否则微信小程序不认,必须配置为fullchain.cer才可以。
    这个问题坑了我太久了。

    文末附证书评级检测方法。

    一、acme.sh 安装

    1. 执行远程脚本
    curl https://get.acme.sh | sh -s email=我的邮箱地址
    
    • 1

    这一步之后,会在当前用户的home目录下初始化相关文件。如果是root用户,那么其位于为/root目录下。
    直接使用ls命令将无法查看,因为下载的文件是以点.开头,而在linux上这种格式的文件是属于隐藏文件。因此应以ls -al命令进行查看

    1. 给路径下的可执行文件指定一个方便使用的别名。
    alias acme.sh=/root/.acme.sh/acme.sh
    
    • 1

    执行后,可在其它目录下使用acme.sh

    问题:上面脚本的执行会从境外服务器下载文件,很多时候可能会超时而下载失败。
    如果你的安装服务器位于中国大陆境内, 访问 github 可能会不成功.
    所以安装可能会失败.
    推荐从这里下载安装:
    https://gitee.com/neilpang/acme.sh
    安装步骤:
    根据 How-to-install#3-or-git-clone-and-install
    git clone https://gitee.com/neilpang/acme.sh.git
    cd acme.sh
    ./acme.sh --install -m my@example.com

    二、单域名证书生成

    1. 生成证书。
      由于我已经安装了nginx反向代理,ssl服务也是通过nginx提供,因此我这里选择的验证方式为本地nginx
    acme.sh --issue -d 我的域名 --nginx
    
    • 1
    1. 修改nginx中cert路径指向这里

    ! 下面一定要注意,引用的cer文件不能是域名位名称那个cer文件,否则微信小程序不认,必须配置为fullchain.cer才可以。

    server {
        listen 443 ssl;
        
        server_name 目标域名;
        
        ssl_verify_client      off;
        ssl_certificate /root/.acme.sh/我的域名/fullchain.cer;  #需要将cert-file-name.pem替换成已上传的证书文件的名称。
        ssl_certificate_key /root/.acme.sh/我的域名/我的域名.key; #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型。
        ssl_prefer_server_ciphers on;
    
        	……其它配置项
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    有些情况下,可能这种方式

    Pending, The CA is processing your order, please just wait. (1/30)
    [Fri Jan 26 10:22:14 CST 2024] Pending, The CA is processing your order, please just wait. (2/30)
    [Fri Jan 26 10:22:18 CST 2024] Pending, The CA is processing your order, please just wait. (3/30)
    [Fri Jan 26 10:22:22 CST 2024] Invalid status, 206.d.gdatacloud.com:Verify error detail:139.198.108.126: Fetching http://xxxxx/.well-known/acme-challenge/0koFSrvUu0diIpOujYG1OfUQ3x3WCF3PS5Ec: Timeout during connect (likely firewall problem)
    [Fri Jan 26 10:22:22 CST 2024] Restoring from /root/.acme.sh/206.d.gdatacloud.com_ecc/backup/206.d.gdatacloud.com.nginx.conf to /etc/nginx/conf.d/zhilian.conf
    [Fri Jan 26 10:22:22 CST 2024] Reload nginx
    [Fri Jan 26 10:22:23 CST 2024] Please check log file for more details: /root/.acme.sh/acme.sh.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这样的话,就在nginx中增加配置webroot,以下如果用root属性,那么需要在对应路径下提前创建好目录/.well-known/acme-challenge/

    location /.well-known/acme-challenge/ {
       root /var/opt/z/iiot/index-web/;
    }
    
    • 1
    • 2
    • 3

    然后使用命令

    acme.sh --issue -d 206.d.gdatacloud.com --nginx --force --webroot /var/opt/z/iiot/index-web/
    
    • 1

    再不行,就可能是证书提供商需要切换指定,这里指定使用zeroSSL生成。(注意zeroSSL和lets encrypt生成的证书路径是不同的)

    acme.sh --server zerossl  --issue -d 206.d.gdatacloud.com --nginx --force --webroot /var/opt/z/iiot/index-web/
    
    • 1

    三、泛解析域名生成

    需要使用dns认证方式

    1. 先执行命令
    acme.sh --issue --dns -d *.demo.我的域名 \
     --yes-I-know-dns-manual-mode-enough-go-ahead-please
    
    • 1
    • 2

    执行后在输出信息中将包含

    [Sun Jan 29 06:30:19 PM CST 2023] Add the following TXT record:
    [Sun Jan 29 06:30:19 PM CST 2023] Domain: '_acme-challenge.demo.我的域名'
    [Sun Jan 29 06:30:19 PM CST 2023] TXT value: 'HJiuhaoFfJehACWOQEiMc6z7DsSEtp0HynIg'
    
    • 1
    • 2
    • 3

    按照提示信息,在域名解析中添加一条txt记录,域名和值分别为上面所输出的内容中提示的填写。
    如图:
    在这里插入图片描述
    域名解析配置完成后,再次执行

    acme.sh --renew -d *.demo.我的域名 \
      --yes-I-know-dns-manual-mode-enough-go-ahead-please
    
    • 1
    • 2

    四、补充

    查看定时任务

    在第一步执行远程脚本后,会自动生成定时任务检查证书并自动更新,不必再自己每年手动替换生成证书。
    可使用指令查看本机已开启的定时任务

    [root@i-ltysspwz ~]# crontab -l
    14 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
    
    • 1
    • 2
    • crontab -l 表示列出所有的定时任务
    • crontab -r 表示删除用户的定时任务,当执行此命令后,所有用户下面的定时任务会被删除,执行crontab -l后会提示用户:“no crontab for admin”

    301重定向

    可在nginx中配置将80端口的访问301重定向到https的地址上。

    server {
        server_name a.demo.我的域名;
        listen 80;
        ssl_certificate /root/.acme.sh/*.demo.我的域名/*.demo.我的域名.cer;
        ssl_certificate_key /root/.acme.sh/*.demo.我的域名/*.demo.我的域名.key;
        return 301 https://u.demo.我的域名$request_uri;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    证书链问题补充

    可以在https://myssl.com/ 查看自身域名的评级,如果引用的是域名位名称的cer文件,那一般评级会是B,下面会给出降级原因主要为证书链不完整。
    在这里插入图片描述

    使用fullchain.cer后,再次检测刷新报告,证书将成为A
    在这里插入图片描述

    再进一步按提示在nginx中增加配置,即可将评级提升为A+

    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    add_header Strict-Transport-Security "max-age=31536000";
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    五、通过内网穿透进行证书生成

    需要有公网服务器,因为域名提供商要进行地址校验。

    在这里插入图片描述

  • 相关阅读:
    Python函数中的可变长度参数:*args和**kwargs
    网络原理 --- 传输层Ⅰ UDP协议
    【C语言从青铜到王者】第六篇·详解C指针
    Mysql全局优化总结
    Java——》synchronized锁粗化&锁消除
    spring的一个properties配置文件,引用另外一个properties配置的变量
    macOS下如何使用Flask进行开发
    Rabbitmq基本使用以及与springboot集成简单示例
    【无标题】
    web-3(httpd2.4)
  • 原文地址:https://blog.csdn.net/weixin_38800446/article/details/128044749