为网站启用HTTPS支持

一直以来都懒的给网站添加HTTPS,但是我雪几年前就搞了不能落后啊,今天又偶然看到Let's Encrypt现在可以申请泛域名证书了,折腾了一下。

1. 用到的工具

2. 步骤

2.1. 安装

$ wget -O -  https://get.acme.sh | sh

根据Acme.sh的wiki,安装过程包含了

  1. 把 acme.sh 安装到~/.acme.sh目录
  2. 创建alias acme.sh=~/.acme.sh/acme.sh方便使用
  3. 创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书

2.2. 生成证书

首先需要验证域名的拥有权,有两种方式:
一种在http根目录下生成验证文件,LE去访问你的域名看能否访问到这个验证文件,验证成功后acme.sh自动再将这个验证文件删除。
对于nginx服务器,直接执行

$ acme.sh --issue  -d example.com    --nginx

第二种是给予acme.shDNS服务商提供的API权限,acme.sh在DNS解析里增加txt记录去验证,这样的好处是可以验证泛域名。

由于我要进行泛域名的申请,我使用了第二种。具体步骤如下:

2.2.1. 申请API Access Key

https://ak-console.aliyun.com/#/accesskey申请API Access Key。

2.2.2. 将Key和Secret export到环境变量中

$ export Ali_Key="KEY"
$ export Ali_Secret="SECRET"

2.2.3. 生成证书

然后就可以

$ acme.sh --issue --dns dns_ali -d example.com -d *.example.com


API和Secret会被记录至 ~/.acme.sh/account.conf

2.2.4. 提取证书

生成完的证书在~/.acme.sh中,我们需要将其提取出来使用

$ acme.sh  --installcert  -d  <domain>.com   \
      --key-file   /etc/nginx/ssl/<domain>.key \
      --fullchain-file /etc/nginx/ssl/fullchain.cer \
      --reloadcmd  "service nginx force-reload"


这样,证书就被安装到了/etc/nginx/ssl目录

2.2.5. 修改nginx.conf

/etc/nginx/nginx.conf

  ##
  # SSL Settings
  ##

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
  ssl_prefer_server_ciphers on;
  ssl_certificate /etc/nginx/ssl/fullchain.cer;
  ssl_certificate_key /etc/nginx/ssl/xuchen.wang.key;

2.2.6. 修改各虚拟主机配置

/etc/nginx/sites-available/default

server {
  # listen 80;
  # SSL configuration
  #
  listen 443 ssl default_server;


注释掉listen 80;同时启用listen 443;

然后重开一个server段监听80端口,将其301转向https链接:

#Redirect http MAIN
server {  
   listen  80;         
   server_name xuchen.wang;  
   rewrite ^(.*) https://$host$1 permanent;  
}  

以上便配置完成。

可以看到成果:

3. 参考资料

  1. https://github.com/Neilpang/acme.sh
  2. https://www.xxorg.com/archives/4870

title: 为网站启用HTTPS支持
time: 2018-05-21 23:54
tags: HTTPS
category: Study

标签: HTTPS

发表评论: