Nginx 为网站加上https

众所周知,http协议是一种不安全的协议,采用wireshark可以轻易抓包获取并修改http报文的内容,chrome中更是把没有经过正规https证书的网站都给标记成为不安全的网站,而https抓包也看不出里面是个什么内容,一旦被修改了就会被发现,因此给网站加上https就显得尤为重要

具体步骤很简单,申请ssl证书-> 部署到nginx中->配置强制跳转(可选)->再cloudflare中应用(可选)

为域名申请证书

https是采用ssl证书来进行验证的,https和ssl协同进行加密通信的具体原理网上一抓一大把。不求甚解的同学只需要知道ssl证书就相当于加密的钥匙就可以了,这里仅简述一下如何操作

let’s encrypt是个免费的证书申请机构,申请ssl证书的本质是验证是你对这个域名的所有权

首先运行sudo apt-get install certbot安装证书机器人,这个机器人还会自动给证书续期,非常的人性化。

然后运行sudo certbot --manual --preferred-challenges dns certonly选择同意记录本机IP之后弹出如下提示

1
2
3
4
5
6
7
8
9
10
-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(你的token)

Once this is deployed,
-------------------------------------------------------------------------------
Press Enter to Continue

然后程序会暂停,接着就打开你的域名的DNS管理界面,为你的域名_acme-challenge.yourdomain.xxxx添加一个TXT记录,内容就是上面的密钥。

然后等一会儿再随便一台机子上(似乎linux才有这个命令,我Windows 10 无这个dig命令)使用dig -t txt _acme-challenge.yourdomain.xxxx查看是否获取到了相应的token

然后回到你的服务器上面,回车继续,然后成功了之后,你的证书就会保存在/etc/letsencrypt/live/yourdomain.xxxx/下面,里面的cert.pem文件是证书文件,privkey.pem文件是私钥文件,一般我们只会用到这两个文件

但是这个是一个链接,类似于windows里面的快捷方式,如果不做证书迁移的话直接用就行了,如果要迁移证书的话这个文件是保存在/etc/letsencrypt/archive/yourdomain.xxxx/下面的,而且名字也有些许不同

部署到nginx

其实也很简单,只需要按照下方的配置文件进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server{
listen 443 ssl; # https默认监听443端口
listen [::]:443 ssl;
ssl_certificate /home/damaoooo/damaoooo.cf/cert1.pem; # 这里是你的证书的位置
ssl_certificate_key /home/damaoooo/damaoooo.cf/privkey1.pem; # 这里是你密钥的位置
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
server_name blog.damaoooo.cf; # 这里是你nginx要转发的域名


location / {
proxy_pass http://127.0.0.1:4400; # 这里是网站的原始位置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

保存在/etc/nginx/conf.d下面,文件名xxxx.conf即可,然后重启nginx

1
2
nginx -t //用于检查是否有语法错误
nginx -s reload

然后通过https://abc.yourdomain.xxxx这种方式来访问你的网站就可以啦

强制跳转https

由于默认我们浏览器访问的是80端口,这不是https的默认端口,每次在地址栏里面输入https://又太麻烦,因此我们可以搞一个强制转换,把http://abc.yourdomain.xxx强制转换成https://abc.yourdomain.xxx这种方式。我们只需要在nginx里面添加这样一个配置文件即可

1
2
3
4
5
6
7
8

server {
listen 80;
listen [::]: 80;
server_name abc.yourdomain.xxxx;# 你要转换的网址

rewrite ^(.*)$ https://$host$1 permanent; # 这个不要动
}

然后nginx -t-> nginx -s reload重启nginx即可

在cloudflare里面配置

给你的网站套一个cdn是一个不错的选择,然而默认的ssl设置是你到cdn是走https,cdn到网站走的是http,如果要全程https的话就得在cloudflare里面设置,cloudflare里面也很简单,只需要把小云朵点开,然后ssl设置里面把mode改为full(strict)即可,官方文档

设置端到端的https

如果你的网站出现重定向次数过多的问题,多半是你开启了强制跳转却没有在cdn里面配置端到端的https的问题。

这样一来,给网站升级到https就大功告成了