添加证书使用https
Letsencrypt 生成
./letsencrypt-auto
之前使用该命令生成,现在不管用了
- 安装epel
1
| yum install epel-release
|
- 安装snapd
- 启用
snapd.socket
1
| systemctl enable --now snapd.socket
|
- 创建软连接
1
| ln -s /var/lib/snapd/snap /snap
|
- 升级snapd到最新版本
1 2 3
| snap install core
snap refresh core
|
6.1 卸载之前存在的 certbot
6.2 删除相关文件
1
| rm /usr/local/bin/certbot-auto
|
6.3 删除 certbot
附加软件包
1
| rm -rf /opt/eff.org/certbot
|
- 安装
certbot
1
| snap install --classic certbot
|
- 创建软连接
1
| ln -s /snap/bin/certbot /usr/bin/certbot
|
- 生成证书
要保证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
,没事
- 配置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; return 301 https://$server_name$request_uri;
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
server { listen 443 ssl; 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 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;
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_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-client
、random-server
经过一定算法生成的东西),再一次送给服务器端,这次传过去的东西会使用公钥加密
- 服务器端先使用私钥解密,拿到
premaster secret
,此时客户端和服务器端都拥有了三个要素:random-client
、random-server
和 premaster secret
- 此时安全通道已经建立,以后的交流都会校检上面的三个要素通过算法算出的
session key
参考
Nginx配置
Nginx配置