Nginx 将网站升级到https

添加证书使用https

Letsencrypt 生成

./letsencrypt-auto 之前使用该命令生成,现在不管用了

  1. 安装epel
1
yum install epel-release
  1. 安装snapd
1
yum install snapd
  1. 启用 snapd.socket
1
systemctl enable --now snapd.socket
  1. 创建软连接
1
ln -s /var/lib/snapd/snap /snap
  1. 升级snapd到最新版本
1
2
3
snap install core

snap refresh core

6.1 卸载之前存在的 certbot

1
yum remove certbot

6.2 删除相关文件

1
rm /usr/local/bin/certbot-auto

6.3 删除 certbot 附加软件包

1
rm -rf /opt/eff.org/certbot
  1. 安装 certbot
1
snap install --classic certbot
  1. 创建软连接
1
ln -s /snap/bin/certbot /usr/bin/certbot
  1. 生成证书

要保证Nginx正在运行 80端口

1
2
3
4
certbot certonly --preferred-challenges http \
--nginx \ # 指定服务器为Nginx
--nginx-ctl /apps/openresty/nginx/sbin/nginx \ # 指定Nginx命令的位置
--nginx-server-root=/apps/openresty/nginx/conf # 指定Nginx配置文件位置

/etc/letsencrypt/live 生成位置

这里会提示不支持 openresty,没事

  1. 配置Nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80;
server_name ifan.tutulis.com;
# http升级到https
return 301 https://$server_name$request_uri;

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

server {
listen 443 ssl; # 新版本是在这里加ssl,以前的是 ssl on;
server_name ifan.tutulis.com;
ssl_certificate /etc/letsencrypt/live/ifan.tutulis.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ifan.tutulis.com/privkey.pem;

index index.html index.htm;
location / {
root /docs/blog/_site/;
}
}
  1. 添加定时任务,自动更新证书
1
2
3
crontab -e 

0 0 * * * certbot renew >> /var/logs/update_https.log

自己生成

参数 意义
C 国家
ST
L 本地名称
O 组织名称
OU 组织单元名称
CN 命令名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
echo '创建私钥'
openssl genrsa -out ca-key.pem 2048
echo '创建csr证书请求'
openssl req -new -key ca-key.pem -out ca-req.csr -subj "/C=CN/ST=BJ/L=BJ/O=SJ/OU=shangjian/CN=CA"
echo '生成crt证书'
openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 3650
echo '服务器端证书'
echo '创建服务器端私钥'
openssl genrsa -out server-key.pem 2048
echo '创建csr证书'
openssl req -new -out server-req.csr -key server-key.pem -subj "/C=CN/ST=BJ/L=BJ/O=SJ/OU=shangjian/CN=*.ifan.tutulis.com"
echo '生成crt证书'
openssl x509 -req -in server-req.csr -out server-cert.pem -signkey server-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
echo '确认证书'
openssl verify -CAfile ca-cert.pem server-cert.pem
echo '创建客户端私钥'
openssl genrsa -out client-key.pem 2048
echo '创建csr证书'
openssl req -new -out client-req.csr -key client-key.pem -subj "/C=CN/ST=BJ/L=BJ/O=SJ/OU=shangjian/CN=Client"
echo '生成crt证书'
openssl x509 -req -in client-req.csr -out client-cert.pem -signkey client-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650
echo '确认证书'
openssl verify -CAfile ca-cert.pem client-cert.pem

单向认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 443 ssl;
server_name ifan.tutulis.com;

# 刚刚生成的服务器端公钥和私钥文件
ssl_certificate /etc/nginx/ssl/server-cert.pem;
ssl_certificate_key /etc/nginx/ssl/server-key.pem;

# 据官方文档所述,cache中的1m可以存放4000个session。
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

双向认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 443 ssl;
server_name ifan.tutulis.com;

ssl_certificate /etc/nginx/ssl/server-cert.pem;
ssl_certificate_key /etc/nginx/ssl/server-key.pem;

ssl_verify_client on;
#ssl_verify_depth 2;
ssl_client_certificate /etc/nginx/ssl/ca-cert.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
1
2
3
4
# 使用curl测试链接
curl -k --cert client-cert.pem --key client-key.pem https://ifan.tutulis.com
# 忽略证书
curl -k -v https://ifan.tutulis.com

HTTPS 加密过程

  • 客户端生成一个随机数 random-client,传到服务器端(Say Hello)
  • 服务器端生成一个随机数 random-server,和着公钥,一起回馈给客户端(I got it)
  • 客户端收到的东西原封不动,加上 premaster secret(通过 random-clientrandom-server 经过一定算法生成的东西),再一次送给服务器端,这次传过去的东西会使用公钥加密
  • 服务器端先使用私钥解密,拿到 premaster secret,此时客户端和服务器端都拥有了三个要素:random-clientrandom-serverpremaster secret
  • 此时安全通道已经建立,以后的交流都会校检上面的三个要素通过算法算出的 session key

参考

Nginx配置
Nginx配置