将网站升级到https协议

获取免费证书

为了鼓励https的普及,EFF成立了免费证书最大的提供商Let’s Encrypt,可以提供免费证书。小型的网站也可以使用免费证书升级为https啦。

当然Let’s Encrypt生成的证书,只能是单域名的,而且只有最低级的域名验证。

克隆letsencrypt客户端

$ git clone https://github.com/letsencrypt/letsencrypt ~/letsencrypt
如果遇到权限问题,记得先创建/opt/letsencrypt文件夹再,更改文件夹权限为可写入。

注册证书

注册一个域名证书非常简单,使用letsencrypt就能生成https所需的证书。当然,用letsencrypt生成的证书只支持域名验证,只需要用letsenctypt的自动注册证书命令,证明这个域名是自己的是用的即可。

1
2
3
$ cd ~/letsencrypt
$ ./letsencrypt-auto certonly -a webroot --webroot-path=/<your web site path> -d practi.tk
# 可以使用多个 -d 添加多个域名

letsencrypt可以帮我们自动注册证书,–webroot-path是静态资源所指的路径。-d是域名域名,也可以多个-d增加多个域名。最后确保需要使用https的域名都用letsencrypt注册。

后续将会让你继续输入邮箱信息

如果出现Congratulations!字样,则证明证书注册成功。

指向静态文件Nginx配置Sample:

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
server {
listen 80;
server_name practi.tk; # 这里写你的域名
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /usr/share/nginx/html; # 这里写你的静态文件目录
}
location = /.well-known/acme-challenge/ {
return 404;
}
return 301 https://$host$request_uri; # 跳转到https
}

server {
# SSL Configuration
listen 443 ssl;
server_name practi.tk; # 这里写你的域名
# specify cert files
ssl_certificate /etc/letsencrypt/live/practi.tk/fullchain.pem; # 中间写你的域名
ssl_certificate_key /etc/letsencrypt/live/practi.tk/privkey.pem; # 中间写你的域名
location / {
root /usr/share/nginx/html; # 这里写你的静态文件目录
index index.html index.htm; # 这里写你暴露的静态文件
}
}

Nginx配置各有各的配置方法,这里只要保证四点:

域名配置正确
静态文件目录路径、本地服务目录路径配置正确
.well-known/acme-challenge目录配置正确
要保证80默认端口和443ssl端口都有配置
如果配置好Nginx,那么访问网站就会有绿色的小钥匙啦,说明你的https站点搭建好。

自动更新证书

letsencrypt证书最多只有90天,90天之后我们需要重新注册证书,当然这个可以交给服务器自己做啦。

验证自己的证书是否可以更新

1
2
$ cd ~/letsencrypt
$ ./letsencrypt-auto renew --dry-run

此命令只是验证 不会更新证书
如果出现Congratulations!字样或者已经更新字样则证明可以自动更新。如果出现错误,或者说路径找不到的情况,大多数情况是.well-known/acme-challenge目录配置没有正确的配置成功

编写crontab脚本
$ crontab -e
脚本内容

1
8 0 11 * * /<你的路径>/letsencrypt-auto renew >> /var/log/le-renew.log

如果遇到权限问题,可先创建/var/log目录再设置其权限为可写入

参考链接

nginx内置变量

$host请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称(处理请求的server的server_name指令的值)。值为小写,不包含端口。
$request_uri这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。
$server_name服务器域名。