/ 博客相关 / 20浏览

为网站配置https及http跳转

文章目录

1. 背景知识

之前chrome访问我的网站,总是提示网站不安全,然后确认问题出在没有启用https访问。

HTTPS 是加密的 HTTP 连接,它使用加密的传输层协议,以保护数据的安全性。具体到加密过程,HTTPS 可以分为两个阶段:

  1. 握手协商过程使用非对称加密算法,生成密钥
  2. 传输过程使用对称加密算法,加密数据

在握手协商使用非对称算法的过程中,服务端需要出具经权威CA签名后的公钥,也叫证书。与此对应的,服务端还有一个私钥。

因此要使用 HTTPS,服务端需要提供一个证书,一般后缀为.cer或者.crt,以及与之对应的一个私钥,一般后续为.key

2. 基本配置

nginx 配置 HTTPS 时,如果没有额外的要求,还是非常简单的,只需要配置:

  1. 以 SSL 协议监听 443 端口(注意防火墙开放端口)
  2. 使用 server_name 指定域名,域名需要与证书的域名一致
  3. 使用 ssl_certificate 指定证书路径
  4. 使用 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

  1. 感谢阅读

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注