为你的网站升级 HTTPS

2020年3月24日 22:48

申请证书

个人博客可以申请一个免费的域名型(DV)SSL 证书,有效期一年,这里各个云服务厂商大同小异,需要注意根据自己使用的服务器选择对应的证书,审核通过后就可以下载证书压缩文件了。

解压后可以得到 3 个文件:证书文件 .crt(或 .pem),私钥文件 .key,CSR 文件。其中 CSR 文件是用户申请证书时自动生成的,提供给 CA 机构的,安装时可忽略。接下来我们需要将证书及私钥文件拷贝到 nginx 的配置目录下,这需要用到 scp 加密拷贝命令。

复制证书到服务器

Linux 及 Mac 平台可以直接使用 scp 命令将证书文件远程拷贝到 nginx 配置目录下,Windows 平台可以使用 WinSCP 工具。

scp -P port xxx.crt user@host:/usr/local/nginx/conf/xxx.crt

这里可能会遇到 Permission Denied 的错误提示,如果密码或登录秘钥没有错误,那么需要在本地修改证书文件的访问权限,并在远程服务器修改目标目录的访问权限:

sudo chmod 777 xxx.crt
sudo chmod 777 /usr/local/nginx/conf

文件拷贝到 nginx 配置目录下,就可以进行 nginx 配置了。这里主要讲一下证书配置,以及如何做域名重定向。

修改 nginx 配置

登录远程服务器,修改 nginx 配置文件,证书和配置文件位于同一目录 /usr/local/nginx/conf。
需要修改 servier 部分的配置,修改前:

server {
    listen 80 backlog=10000 default;
    server_name default;
    client_body_in_single_buffer on;
    client_max_body_size 2m;
    client_body_buffer_size  50m;
    proxy_buffering off;

    access_log /tmp/access_log.log main;

    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_connect_timeout 30;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $http_x_forwarded_for;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Host $http_host;
    }
}

修改后

server {
    # 监听 SSL 访问端口号 443
    listen 443 ssl;    
    server_name whlpsi.com; 
    # 设置证书文件 
    ssl_certificate xxx.crt;   
    # 设置私钥文件 
    ssl_certificate_key xxx.key;     
    ssl_session_timeout 5m;
    # 协议配置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   
    # 配置加密套件,遵循 openssl 标准 
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;    
    ssl_prefer_server_ciphers on;

    access_log /tmp/access_log.log main;

    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_connect_timeout 30;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $http_x_forwarded_for;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Host $http_host;
    }

    # 如果域名不是 whlpsi.com,则重定向到 whpsi.com
    if ($host != 'whlpsi.com' ) {
        rewrite ^/(.*)$ https://whlpsi.com/$1 permanent;
    }
}

# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name whlpsi.com; 
    return 301 https://$host$request_uri;     
}

除了基本的 SSL 配置,还增加了两处修改:

  1. 将 www.whlpsi.com 跳转到 whlpsi.com
  2. 普通的 HTTP 请求重定向到 HTTPS

配置完成后,使用 openresty -tnginx -t 命令检查配置文件是否书写正确。如果书写无误,可以通过命令 service nginx restart 重启 nginx 服务器。重启后就可以使用 https://whlpsi.com 直接访问了。