概述

由于博客中可能会存在一些敏感内容,所以担心如果采用 HTTP 的访问方式可能会被 GFW 监听到然后导致被墙的后果,所以决定配置 HTTPS 的访问方式,使访问更加安全。HTTPS 通过 SSL/TLS 加密传输数据,不仅可以增强网站安全性,还能提高 SEO 排名和用户信任度。

SSL 证书选择与购买

选择合适的 SSL 证书是配置 HTTPS 的第一步。根据不同需求,可以选择以下类型的证书:

  • PositiveSSL
    • 价格实惠,首年只需要$3.88/年
    • 一次性买三年$4.99/年
    • 仅支持一个主域名
    • 适合个人博客或小型网站
  • PositiveSSL Wildcard
    • 价格约$90/年
    • 支持一个主域名和无限个二级域名
    • 适合有多个子域名的企业网站

生成 CSR 代码

CSR(Certificate Signing Request)是向证书颁发机构申请 SSL 证书时必需的代码。以下是生成 CSR 的步骤:

  1. 在服务器上执行以下命令,生成私钥和 CSR 文件:

    openssl req -new -newkey rsa:2048 -nodes -keyout blueboy.key -out blueboy.csr
    
  2. 根据提示输入以下信息:

    字段 说明 示例
    Country Name 两个字母的国家代码 CN
    State or Province Name 省或州名称 Guangdong
    Locality Name 城市名称 Guangzhou
    Organization Name 公司或组织名称 Tianchao
    Organization Unit Name 部门名称 United Nations
    Common Name 网站域名(主域名或泛域名) blueboy.me 或 *.blueboy.me
    Email Address 联系邮箱 [email protected]
    A Challenge Password 可留空 -
    An Optional Company Name 可留空 -
  3. 完成上述步骤后会生成两个文件:

    • blueboy.key:私钥文件,必须妥善保管,不要泄露
    • blueboy.csr:CSR 文件,包含向证书颁发机构申请证书的信息

激活 SSL 证书

  1. 登录 SSLS.com 账户,选择已购买的证书进入激活流程

  2. blueboy.csr 文件中的内容粘贴到指定位置(CSR Code 输入框)

  3. 输入网站的基本信息,如管理员联系方式等

  4. 选择域名验证方式,这里使用文件验证法:
    • 下载指定验证文件
    • 上传到网站根目录,确保可以通过 http://blueboy.me/xxxx.txt 访问
    # 将验证文件上传到服务器网站根目录
    scp xxxx.txt [email protected]:/blog/root_dir
    
  5. 等待域名验证(通常需要 30 分钟左右),证书颁发机构会检测根目录的验证文件

  6. 证书生成后,下载并上传到服务器:

    # 将证书文件上传到服务器
    scp -r blueboy.me [email protected]:/root
    

配置 Nginx 支持 HTTPS

创建 HTTPS 服务器配置

  1. 新建 Nginx 配置文件,例如 /etc/nginx/sites-available/blueboy_https

    server {
        listen 443 ssl;
        listen [::]:443 ssl ipv6only=on;
        root /home/blog/data;
        index index.html index.htm;
        server_name blueboy.me;
    
        ssl on;
        ssl_certificate /root/blueboy.me/blueboy.me.crt;
        ssl_certificate_key /root/blueboy.me/blueboy.key;
    
        # 增强安全性配置
        ssl_protocols TLSv1.2 TLSv1.3;  # 推荐使用的TLS版本
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:10m;
    
        # HSTS (HTTP Strict Transport Security)
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
    

配置 HTTP 重定向

  1. 修改原有的 HTTP 配置,将所有 HTTP 请求重定向到 HTTPS:

    server {
        listen 80;
        listen [::]:80;
        server_name blueboy.me;
           
        # 永久重定向到 HTTPS
        return 301 https://$host$request_uri;
    }
    

启用配置并重启 Nginx

  1. 创建符号链接并测试配置:

    sudo ln -s /etc/nginx/sites-available/blueboy_https /etc/nginx/sites-enabled/
    sudo nginx -t
    
  2. 如果测试通过,重启 Nginx 服务:

    sudo systemctl restart nginx
    

网站资源适配

为了避免混合内容警告(Mixed Content),需要确保网站中的所有资源都通过 HTTPS 加载:

  1. 将所有外部资源的 URL 从http://更改为https://,包括:
    • JavaScript 文件
    • CSS 样式表
    • 图片和媒体文件
    • 外部 API 和服务
  2. 对于第三方服务和 CDN:
    • 七牛云等 CDN 服务需要在管理面板中开启 HTTPS 访问
    • 使用相对路径引用资源(如 //example.com/script.js)可以自动匹配协议

验证 HTTPS 配置

完成上述步骤后,可以通过以下方式验证 HTTPS 配置:

  1. 通过浏览器访问 https://blueboy.me,确认能正常加载并显示安全锁图标
  2. 使用 SSL Labs 测试网站 SSL 配置安全性
  3. 检查控制台是否有混合内容警告

结语

至此,博客已成功从 HTTP 迁移到 HTTPS。HTTPS 不仅是网站发展的趋势,也是保护用户隐私和数据安全的重要措施。随着浏览器对非 HTTPS 网站的警告越来越严格,及时迁移到 HTTPS 对网站的可访问性和 SEO 排名都有积极影响。