摘要訊息 : 為你的網站開啟 HTTPS.

0. 前言

如果想要网站实现 HTTPS 访问, 首先就要给网站系结的域名申请 SSL 证书. 对于一般站长来说, 没有必要使用付费的 SSL 证书, 所以这里演示免费的 SSL 证书的申请. 这里拿 jonny.website 这个域名在腾讯云域名服务中申请 SSL 证书. 中国大陆的几个伺服器提供商几乎都提供了免费的 SSL 证书托管, 而且可以免费申请. 免费的 SSL 证书每年都需要重新申请.

如果你在某个伺服器提供商那里购买了一个域名, 又在这个伺服器提供商这里申请 SSL 证书, 那么可能步骤没有那么麻烦. 例如阿里云, 它可以自动进行配置, 而不需要大家手动进行配置. 具体的请大家自行查阅伺服器提供商提供的帮助文档或者自行谘询伺服器提供商的客服.

本文在 2022 年 1 月 21 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.

1. 证书申请

首先登录腾讯云, 找到 SSL 证书管理. 进入 SSL 证书管理界面之后, 点击申请证书 :

Figure 1. 证书申请

这是 2017 年的申请画面, 现在可能有所不同. 点击确定后会让你填写你的个人信息和你的域名信息, 密码可以自行设置或者不设置. 填写好之后点下一步来到域名验证, 大家只要根据腾讯云提供的指引配置 DNS 验证或者档案验证即可. 申请成功之后会有手机短信提示 :

Figure 2. 申请通过

3. 开启 HTTPS

接下来需要回到域名控制台下载证书, 会得到一个以域名为名称的 .zip 压缩包, 里面有 Apache, Nginx, IIS 和 Tomcat 等的证书文件. 如果你是按照 Jonny'Blog 给出的教学安装的 Nginx, 那么这里只需要 Nginx 的证书档案. 我们首先建立一个档案夹专门用于存放证书档案 : mkdir /etc/nginx/certificate, 然后把档案上载并且移动到这里. 接下来修改 Nginx 相关配置文件, 在第一个 server {} 中增加

server {
    #... 添加下面一行
    rewrite ^(.*) https://$host$1 permanent;
    #...
}

在第二个 server {} 中增加

server {
    listen 443 ssl http2;
    server_name 域名;
    root 网站根目录;
    ssl_certificate 修改为 .crt/.pem 结尾的证书位置;
    ssl_certificate_key 修改为 .key 结尾的证书位置;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    #...
}

下面给出一段完整的配置实例 :

server {
    listen 80;
    server_name 域名;
    rewrite ^(.*) https://$host$1 permanent;
}
server {
    listen 443 ssl http2;
    server_name 域名;
    root 网站根目录;
    access_log 访问日志所存放的地方 main;
    error_log 错误日志所存放的地方 error;
    ssl_certificate 修改为 .crt/.pem 结尾的证书位置;
    ssl_certificate_key 修改为 .key 结尾的证书位置;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    client_max_body_size 0;
    proxy_connect_timeout 36000s;
    proxy_read_timeout 36000s;
    proxy_request_buffering off;
    send_timeout 600;
    location / {
        index index.php index.html;
    }
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_send_timeout 36000s;
        fastcgi_read_timeout 36000s;
        fastcgi_buffer_size 1024k;
        fastcgi_buffers 8 1024k;
        fastcgi_busy_buffers_size 2048k;
        fastcgi_temp_file_write_size 2048k;
        fastcgi_intercept_errors on;
        fastcgi_connect_timeout 36000s;
    }
}

完成之后重新载入 Nginx 配置档案 : systemctl reload nginx. 我们还可以使用指令 nginx -t 来检测我们的配置档案是否存在错误.

之后访问网站, 会看到域名旁边多了一个锁 :

Figure 3. HTTPS 开启