1. 背景知识
之前chrome访问我的网站,总是提示网站不安全,然后确认问题出在没有启用https访问。
HTTPS 是加密的 HTTP 连接,它使用加密的传输层协议,以保护数据的安全性。具体到加密过程,HTTPS 可以分为两个阶段:
- 握手协商过程使用非对称加密算法,生成密钥
- 传输过程使用对称加密算法,加密数据
在握手协商使用非对称算法的过程中,服务端需要出具经权威CA签名后的公钥,也叫证书。与此对应的,服务端还有一个私钥。
因此要使用 HTTPS,服务端需要提供一个证书,一般后缀为.cer
或者.crt
,以及与之对应的一个私钥,一般后续为.key
。
2. 基本配置
nginx 配置 HTTPS 时,如果没有额外的要求,还是非常简单的,只需要配置:
- 以 SSL 协议监听 443 端口(注意防火墙开放端口)
- 使用
server_name
指定域名,域名需要与证书的域名一致 - 使用
ssl_certificate
指定证书路径 - 使用
ssl_certificate_key
指定私钥路径
在vps上加载nginx配置文件然后添加如下内容:
vim /etc/nginx/conf.d/default.conf
或者是
vim /etc/nginx/nginx.conf
server { listen 443 ssl; server_name www.xxx.com; ssl_certificate /etc/nginx/ssl/www.xxx.com.crt; ssl_certificate_key /etc/nginx/ssl/www.xxx.com.key; }
这样就可以了。
关于证书申请,我是通过acme.sh第三方申请免费证书,这种方式可可以自动发布和续订 Let’s Encrypt 中的免费证书。(个人信条:拒绝任何国内服务!)
3. HTTP 重定向
如果用户使用 HTTP 协议访问的话,上述配置是不起作用的。为了让 HTTP 协议也能访问到,还需要增加一个重定向配置。在具体配置上有两种思路:
第一种,单独设置一个server
,用于支持 HTTP 协议访问:
server { listen 80; server_name www.xxx.com; return 301 https://$host$request_uri; }
第二种,在同一个server
中,使用 rewrite
重定向:
server { listen 80; listen 443 ssl; server_name www.xxx.com; ssl_certificate /etc/nginx/ssl/www.xxx.com.crt; ssl_certificate_key /etc/nginx/ssl/www.xxx.com.key; if ($scheme != "https") { rewrite ^ https://$host$request_uri permanent; } }
最后不要忘记检查配置和重启nginx
nginx -t
systemctl restart nginx
访问网站检查是否完成。
0