最近想在家庭内网安装私有云,当然了,现在有了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