使用 acme.sh 申请 Let’s Encrypt 泛域名 SSL 证书

安装 acme.sh

#安装
curl  https://get.acme.sh | sh

#让alias生效
source ~/.bashrc

DNS 方式生成证书

首先去 DNS 服务器申请 API Token,然后对应运行相关命令。这里命令是以 Dnspod 为例,其它服务商查阅https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md

#导入密钥
export DP_Id="1234"
export DP_Key="example"
#申请证书
acme.sh --issue --dns dns_dp -d example.com -d *.example.com

安装证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件。正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

mkdir /ect/nginx/ssl
acme.sh  --installcert  -d  example.com   \
        --key-file   /etc/nginx/ssl/example.com.key \
        --fullchain-file /etc/nginx/ssl/example.com.pem \
        --reloadcmd  "service nginx force-reload"

Nginx 配置

生成 ssl_dhparam

openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

nginx 配置示例

server {
    root /www/example;
    
    index index.php index.html index.htm index.nginx-debian.html;
    
    server_name *.example.com;
    
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    location ~ \.php$ {
            include snippets/fastcgi-php.conf;

    #       # With php7.0-cgi alone:
    #       fastcgi_pass 127.0.0.1:9000;
    #       # With php7.0-fpm:
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }    

    location ~ /\.ht {
            deny all;
    }

    listen 443 ssl;
    ssl_certificate ssl/example.com.pem;
    ssl_certificate_key ssl/example.com.key;
    ssl_dhparam ssl/dhparam.pem;        
}

server {
    listen 80;
    server_name *.example.com;
    return 301 https://$host$request_uri;
}

自己配置时,遇到 ssl_certificate 和 ssl_certificate_key 文件使用绝对路径时,Nginx 加载 conf 出错,这里使用相对路径。