Let’s Encrypt 是一个免费,自动化和开放的证书颁发机构。官方已经支持免费签发通配符域名证书,即泛域名证书,俗称野卡。签发步骤简单快捷,几行命令即可实现免费自动签发。
前提,先启动nginx
安装acme.sh
1
| curl https://get.acme.sh | sh
|
可选择在.bashrc
或者是如果zsh使用者可以使用.zshrc
添加对用映射:alias acme.sh=~/.acme.sh/acme.sh
获取DNS api
acme.sh支持cloudflare,dnspod,aliyun,GoDaddy,CloudXNS等大约80余种DNS解析商。详情可看dnsapi。这里一腾讯云为介绍,阿里云也一样。首先去腾讯云dnspod官网获取dns的DP_Id和DP_Key,腾讯云因为是使用的dnspod,所以需要去这个的官网申请。请注意,key只能查看一次,需记住!不过可以再次申请,忘记了也没多大问题。获取到了这两者后,回到服务器进行如下操作,添加至环境变量中:
1 2
| export DP_Id="89XXXX" export DP_Key="71943XXXXXXXXXXXXXXXXXXXXXXXX"
|
DNS api主要四用于后期修改dns解析验证此域名和服务器都是你自己的,相当于一个验证授权信息的玩意儿。
签发证书
接下来,当将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记录验证域名所有权。
copy/安装证书
证书生成后, 需要把证书 copy 到真正需要用它的地方。注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件。
正确的使用方法是使用 –installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置,。
你可以在nginx目录建一个专门存放证书的目录:
1 2 3 4
| 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指向复制后的目录。
至此,你的免费自动签发泛域名证书的步骤就完成了,打开你的页面查看是不是生效啦。
nginx配置文件参考
示例ssl配置文件vadxq.com.ssl.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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 X-Content-Type-Options nosniff; add_header x-xss-protection "1; mode=block";
|
在需要引入SSL证书的nginx的server引入此文件即可
示例:blog.vadxq.com.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| server { server_name blog.vadxq.com; location / { proxy_pass http://127.0.0.1:7191; proxy_set_header Host $host; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } location /api { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; 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'; if ($request_method = 'OPTIONS') { return 204; } proxy_pass http://127.0.0.1:7190; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } location /sitemap.xml { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; 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'; if ($request_method = 'OPTIONS') { return 204; } proxy_pass http://127.0.0.1:7190; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } listen 443 ssl; include /etc/nginx/ssl/vadxq.com.ssl.conf; } server { listen 80; server_name blog.vadxq.com; return 301 https://$host$request_uri; }
|
如上配置中的include,引入绝对地址下的ssl配置文件即可。
好啦,教程到此结束,谢谢大家捧场,有什么不对的或者有其他疑问,可以github上blog项目里提issue(https://github.com/vadxq/koa-nuxt-blog/issues)或者是邮件我哟~