告别黄三角,配置 SSL 证书

告别黄三角,配置 SSL 证书

前言

SSL证书(Secure Sockets Layer Certificate),也被称为数字证书,是一种用于保障互联网上数据传输安全的技术手段。它主要用于验证网站身份、实现服务器与客户端之间的加密通信,并确保数据在传输过程中的机密性、完整性和真实性。

浏览器访问 http 协议时,会进行安全警告。要想访问 https 协议,就需要先获取 SSL 证书。一般的CA证书需要进行付费购买,价格还不便宜。

本文使用的是 acme.sh脚本,会从 ZeroSSL证书颁发机构(CA)获取和更新免费 TLS/SSL 证书。

准备环境

# 安装
curl https://get.acme.sh | sh
# 说明:
# 该命令会从 GitHub 上下载 sh 脚本并执行
# 然后把下载的文件解压到用户的 ~/.acme.sh目录下
# 并且给命令行设置一个acme.sh的 alias 别名

# 注册账号
acme.sh --register-account -m name@mail.com
# 注册成功后,会在 ~/.acme.sh/acme.sh.env 中记录账号信息

签发证书

  • HTTP文件验证

    适用于可以直接控制 Web 服务器(如 Nginx、Apache)的情况

    # 生成证书
    acme.sh --issue -d example.com --webroot /path/to/webroot
    # /path/to/webroot 是您的 Web 服务器文档根目录的路径。
    # 如果成功,则会在 ~/.acme.sh/example.com/ 目录下生成证书文件。
    
    • 脚本验证的文件地址是 http://example.com/.well-known/acme-challenge/test.txt,请确保服务器可以访问该地址。
    • 如果不能正常访问,可以使用路由跳转的方式来验证。比如可以使用 nginx 配置一个路由,将请求转发到其他服务器。
    • 如果 web 服务器和脚本不在同一台服务器上,可以先执行一遍命令以生成测试文件,然后将测试文件上传到服务器上,最后再次执行 --issue 命令以正常生成证书。
  • DNS验证

    适用于需要通过修改 DNS 记录进行验证的情况:

    # 生成证书
    acme.sh --issue -d example.com --dns dns_aliacme.sh --issue -d example.com --dns dns_cloudflare --dns_cloudflare_email your@email.com --dns_cloudflare_api_key your_api_key
    # 请替换为实际的 DNS 服务商、邮箱地址和 API 密钥。
    # 该命令会在 Cloudflare 上创建一个 TXT 记录,用于验证 DNS 记录。
    

生成结果

验证通过后,Acme.sh 会为您签发证书。证书默认保存在 ~/.acme.sh/example.com/ 目录下,包括:

  • example.com.crt: 包含完整证书链的PEM格式证书文件。
  • example.com.key: 私钥文件。
  • example.com.cer: 只包含域名证书的PEM格式文件。

配置 Web 服务器

# 复制证书文件
acme.sh --installcert -d example.com \
--key-file          /opt/ssl/cert/key.pem \
--fullchain-file    /opt/ssl/cert/cert.pem \
--reloadcmd         "systemctl reload nginx"

# key.pem 是私钥文件,cert.pem 是证书文件。
# --reloadcmd 指定在证书更新成功后执行的命令。
  • Nginx ssl 配置

    # 配置nginx
    server {
        listen 443 ssl;
        server_name example.com;
    
        # SSL 证书文件路径
        ssl_certificate /opt/ssl/cert.pem;
        # SSL 私钥文件路径
        ssl_certificate_key /opt/ssl/key.pem;
        # 安全的加密套件列表
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        # 允许的协议版本
        ssl_protocols TLSv1.2 TLSv1.3;
        # 使用服务器提供的加密套件
        ssl_prefer_server_ciphers on;
        # 设置会话超时时间
        ssl_session_timeout  5m;
    }
    

自动续期

Acme.sh 默认会设置定时任务(cron job),定期检查并自动续期即将过期的证书。会根据之前执行的命令行参数,自动更新证书。
记录操作参数文件路径 ~/.acme.sh/example.com/example.com.conf

其他操作

# 查看生成的证书列表
acme.sh --list

# 查看证书的详细信息
acme.sh --info -d example.com
LICENSED UNDER CC BY-NC-SA 4.0