使用acme.sh配置nginx的https证书(使用dns验证)


最近想在家庭内网安装私有云,当然了,现在有了let's encrypt,直接一步到位加上ssl起步更好,在经过一番尝试之后,当然也是众所周知的原因,没有办法正常使用80端口,幸好可以通过到dns验证域名所有权。我选择了第三方的acme.sh来配置了一下,用起来还不错。在正常服务器上可以在这里找到适合自己的官方客户端:https://certbot.eff.org/

 

1、下载acme.sh

acme.sh的中文说明有详细介绍,这里不再赘述:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

2、dns验证操作

以 dnspod 为例, 你需要先登录到 dnspod 账号, 生成你的 api id 和 api key, 都是免费的。这个在dnspod的用户中心-》安全设置-》API Token中获得。这里给出的 api id 和 api key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了。

export DP_Id="1234"

export DP_Key="sADDsdasdgdsf"

acme.sh   --issue   --dns dns_dp  -d www.aa.com

3、安装证书

默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.

正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

acme.sh  --installcert  -d  www.mydomain.com   \
        --key-file   /etc/nginx/ssl/www.mydomain.com.key \
        --fullchain-file /etc/nginx/ssl/www.mydomain.com.cer \
        --reloadcmd  "service nginx force-reload"

(一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload)

--installcert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.

4、使用证书:

尽量使用443端口,如果不可以用,可以设置其他的访问时加上端口号如:https://www.mydomain.com:8443

server{
    listen 443 ssl; 
    server_name www.mydomain.com ;
    index index.html;
    root  /wwwroot/www.mydomain.com;
    .....

    #证书文件
    ssl_certificate     /etc/nginx/ssl/www.mydomain.com.cer;
    #私钥文件
    ssl_certificate_key /etc/nginx/ssl/www.mydomain.com.key;
    #使用长连接
    keepalive_timeout   70;

    .....
}

5、跳转到安全链接:

这里使用了81端口,其实大部分时候使用80即可。

server
    {
        listen 81;
        #listen [::]:81;
        server_name www.mydomain.com ;
        rewrite ^(.*)$  https://$host$1 permanent;
    }

 

6、关于更新证书

查看crontab设置发现多了一条设置,看来acme.sh很贴心的给配置好了.

53 0 * * * "/installpath/.acme.sh"/acme.sh --cron --home "/installpath/.acme.sh" > /dev/null

7、关于sudo的问题处理

我使用的系统是基于debian的,而且不是直接登录的root账号,使用sudo时会提示找不到命令。经过反复测试发现一个简单的办法就是将acme.sh的安装目录做软连接到/root目录下。然后将执行程序也做软连接到/bin目录下。

sudo ln -s ~/.acme.sh/ /root/.acme.sh
sudo ln -s ~/.acme.sh/acme.sh /bin/acme.sh

Archives