瓜皮翻身记之Https

之前装过腾讯云提供的免费ssl证书,但是没试成功。如果真就这样放弃Https,那就很瓜皮了,为了要做一个有灵性的后台,所以我最终还是找到了另外一个免费的SSL证书,哈哈,这就用起来很舒服了

证书提供

去年的时候,国内 WoSign (沃通)还有免费的SSL证书,但是现在它已经被打压了

不过,Let's Encrypt 也正式对外颁发免费的SSL证书

Let’s Encrypt 是一个免费、自动化、开放的证书签发服务,由 ISRG(Internet Security Research Group,译:互联网安全研究小组) 这个非盈利组织维护。现在是 Linux 基金会 (Linux Foundation) 合作的项目。

环境

服务器:Centos 7.0

服务器软件:Nginx

安装 Certbot

1
sudo yum install certbot

初始化验证目录

1
mkdir -p /usr/share/nginx/certbot

绑定 Let’s Encrypt 验证目录

进入Nginx配置目录

1
cd /usr/local/nginx/conf

配置nginx.conf

1
vi nginx.conf

只需要在 nginx 配置文件上的 server 层加上下面的代码

1
2
3
4
5
6
7
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /usr/share/nginx/certbot;
}
location = /.well-known/acme-challenge/ {
return 404;
}

重启服务器

1
2
3
4
# 进入sbin目录
cd /usr/local/nginx/sbin
# 重启服务器
./nginx -s reload

使用 certbot颁发证书

1
2
sudo certbot certonly --webroot -w /usr/share/nginx/certbot -d 你的域名
sudo certbot certonly --webroot -w /usr/share/nginx/certbot -d maijinta.cn #我的是这个

然后第一次使用的时候,Certbot 会让你填写一个邮箱,该邮箱作为证书的拥有者,用于后面证书更新

重点是我也第一次看到命令行里还有图形界面的输入框,真是大开眼界

还有就是同意 Let's Encrypt 的使用条款,没有异议的话选择 Agree就好了

完成颁发之后,就会看到 Congratulations之类的字样

引入SSL证书并绑定443端口

还是配置nginx.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
server {
listen 80;
listen 443 ssl;
server_name maijinta.cn www.maijinta.cn;

ssl_certificate /etc/letsencrypt/live/maijinta.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/maijinta.cn/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/maijinta.cn/chain.pem;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 20m;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:!RC4-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;

location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /usr/share/nginx/certbot;
}

location = /.well-known/acme-challenge/ {
return 404;
}
location / {
#root html; #before exit
#index index.html index.htm; #before exit
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_pass http://my_nodejs_upstream/;
}

我的配置文件最终是这样的,加了一些ssl必要的配置,可以和之前的博文对比——从头配置NodeJs和PM2

配置之后就可以重启服务器了,但是重启之后我遇到了一个问题

nginx提示缺少the "ssl" parameter requires ngx_http_ssl_module

估计是当初编译安装的时候没有加上--with-http_ssl_module

所以要重新编译

查看原来的配置参数

1
2
/usr/local/nginx/sbin/nginx -V
返回了configure arguments: --prefix=/usr/local/nginx --with-pcre=../pcre-8.40

configure arguments:就是我原来的配置信息

加入新参数,重新编译

进入nginx源码目录

1
cd nginx-1.10.3

停止nginx进程

1
killall -9 nginx

重新编译的代码和模块

1
./configure --prefix=/usr/local/nginx --with-pcre=../pcre-8.40 --with-http_ssl_module
1
make #编译,注意:千万别make install,否则就覆盖安装了

make完之后在./nginx-1.10.3/objs目录下就多了个nginx,这个就是新版本的程序了

替换nginx二进制文件

保持当前目录不变

1
2
3
4
# 先备份nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
# 再覆盖,覆盖的时候最好是关掉nginx,不然可能是文件正在使用中,无法覆盖
cp ./objs/nginx /usr/local/nginx/sbin/

开启服务器

1
2
3
4
# 进入sbin目录
cd /usr/local/nginx/sbin
# 开启服务器
./nginx

设置自动更新证书

因为 Let's Encrypt 的证书只有 3个月 有效期

所以我们需要依靠 certbot 自动更新证书

1
certbot renew --quiet

这样之后我们的HTTPS就完工了,快打开浏览器试一下吧!