学长的骚操作
https://blog.vadxq.com/article/acmesh-letsencrypt

Let’s Encrypt 是一个免费,自动化和开放的证书颁发机构。官方已经支持免费签发通配符域名证书,即泛域名证书,俗称野卡。签发步骤简单快捷,几行命令即可实现免费自动签发。

前提,先启动nginx

1.安装acme.sh

curl https://get.acme.sh | sh
可选择在.bashrc或者是如果zsh使用者可以使用.zshrc添加对用映射:alias acme.sh=~/.acme.sh/acme.sh

2.获取DNS api

acme.sh支持cloudflare,dnspod,aliyun,GoDaddy,CloudXNS等大约80余种DNS解析商。详情可看dnsapi(https://github.com/Neilpang/acme.sh/wiki/dnsapi)。这里一腾讯云为介绍,阿里云也一样。首先去腾讯云dnspod官网获取dns的DP_Id和DP_Key,腾讯云因为是使用的dnspod,所以需要去这个的官网申请。请注意,key只能查看一次,需记住!不过可以再次申请,忘记了也没多大问题。获取到了这两者后,回到服务器进行如下操作,添加至环境变量中:
export DP_Id=”89XXXX”
export DP_Key=”71943XXXXXXXXXXXXXXXXXXXXXXXX”
DNS api主要四用于后期修改dns解析验证此域名和服务器都是你自己的,相当于一个验证授权信息的玩意儿。

3.签发证书

接下来,当将dns api添加到环境变量中后,便要开始签发证书了,这一步也很简单的,别慌。
此处依旧使用腾讯云作示例:
acme.sh —issue —dns dns_dp -d vadxq.com -d .vadxq.com
其中,—dns表示通过dns方式签发,其实还可以http验证,不过这个不利于后期的自动更新,由于Let’s Encrypt签发的证书只有三个月有效期,所以此方法此处略过。
-d后面跟着域名,dns_dp是指dnspod,不同的域名解析商,此段不一样,具体看上一步的dnsapi。泛域名最好使用vadxq.com和
.vadxq.com两者结合,当然也可以只*.vadxq.com。目前两者都玩过,还没细究有何区别。
在这一步,acme.sh会自动在dns添加dns记录验证域名所有权。

4.copy/安装证书

证书生成后, 需要把证书 copy 到真正需要用它的地方。注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件。
正确的使用方法是使用 —installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置,。
你可以在nginx目录建一个专门存放证书的目录:
sudo ~/.acme.sh/acme.sh —installcert -d vadxq.com \
—key-file /etc/nginx/ssl/vadxq.com/vadxq.key \
—fullchain-file /etc/nginx/ssl/vadxq.com/fullchain.cer \
—reloadcmd “service nginx force-reload”
—reloadcmd:配置nginx重启命令。在这一步,acme.sh会记住操作命令,在证书快过期的时候,自动续期。需要将nginx指向复制后的目录。

至此,你的免费自动签发泛域名证书的步骤就完成了,打开你的页面查看是不是生效啦。

5.nginx配置文件参考

示例ssl配置文件vadxq.com.ssl.conf:
ssl on;
server_tokens off;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 60m;

ssl_session_tickets on;

ssl_stapling on;
ssl_stapling_verify on;

resolver 8.8.4.4 8.8.8.8 valid=300s;
resolver_timeout 10s;
ssl_prefer_server_ciphers on;

证书路径 绝对地址
ssl_certificate /etc/nginx/ssl/vadxq.com/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/vadxq.com/vadxq.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers “EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA3 84:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4”;

add_header Strict-Transport-Security “max-age=31536000;includeSubDomains;preload”;
#add_header X-Frame-Options deny;
add_header X-Content-Type-Options nosniff;
add_header x-xss-protection “1; mode=block”;
#add_header Content-Security-Policy “default-src ‘self’; script-src ‘self’ ‘unsafe-inline’ ‘unsafe-eval’ blob: https:; connect-src ‘self’ https:; img-src ‘self’ data: https: blob:; style-src ‘unsafe-inline’ https:; font-src https:”;

在需要引入SSL证书的nginx的server引入此文件即可
示例:blog.vadxq.com.conf
server {
server_name blog.vadxq.com;

  1. #charset koi8-r;<br /> #access_log /var/log/nginx/host.access.log main;
  2. location / {<br /> proxy_pass http://127.0.0.1:7191;<br /> proxy_set_header Host $host;<br /> proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;<br /> }
  3. location /api {<br /> add_header Access-Control-Allow-Origin *;<br /> add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';<br /> add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
  4. if ($request_method = 'OPTIONS') {<br /> return 204;<br /> }<br /> proxy_pass http://127.0.0.1:7190;<br /> proxy_redirect off;<br /> proxy_set_header Host $host;<br /> proxy_set_header X-Real-IP $remote_addr;<br /> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br /> proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;<br /> }
  5. location /sitemap.xml {<br /> add_header Access-Control-Allow-Origin *;<br /> add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';<br /> add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
  6. if ($request_method = 'OPTIONS') {<br /> return 204;<br /> }<br /> proxy_pass http://127.0.0.1:7190;<br /> proxy_redirect off;<br /> proxy_set_header Host $host;<br /> proxy_set_header X-Real-IP $remote_addr;<br /> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br /> proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;<br /> }
  7. listen 443 ssl;<br /> include /etc/nginx/ssl/vadxq.com.ssl.conf;<br />}

server {
listen 80;
server_name blog.vadxq.com;
return 301 https://$host$request_uri;
#return 404;
}
如上配置中的include,引入绝对地址下的ssl配置文件即可。

好啦,教程到此结束,谢谢大家捧场,有什么不对的或者有其他疑问,可以github上blog项目里提issue(https://github.com/vadxq/koa-nuxt-blog/issues)或者是邮件我哟~
by vadxq
2019.5.20

本文原文地址:清竹茶馆(https://blog.vadxq.com/article/acmesh-letsencrypt)