我的 HTTPS 升级之旅

本文将介绍我是如何将一个 HTTP 网站升级到 HTTPS。系统环境:CentOS 7.0 + Nginx 1.12.0

前言

先贴一个福利,也作为没有启用 HTTPS 的反面教材:

福利.png

这是我参与开发过的一个外包网站,没有启用 HTTPS,网站页面被中间人劫持,并插入了一些奇怪的东西。下面是正文。

预备条件

本文假定你已经拥有一个正确解析到服务器IP的域名,服务器上已安装 Nginx。Nginx 可以通过源码编译安装,也可以使用系统提供的包管理器安装,比如 RH 系的 yum 或者 Debian 系的 apt-get,具体步骤自行Google。

获取证书

HTTPS 证书分三类:1. DV 域名验证证书 2. OV 组织机构验证证书 3. EV 增强的组织机构验证证书。每类证书的审核要求不同,在浏览器地址栏也会有区分,对于个人网站而言,使用免费的 DV 证书就足够了。

我使用了大名鼎鼎的 Let's Encrypt 来生成证书。

1. 安装 certbot

certbot 是 Let's Encrypt 提供的一套自动化工具。

yum install epel-release
yum install certbot
2. 生成证书

这里采用 webroot 作为 Let's Encrypt 的认证方式。

certbot certonly -a webroot --webroot-path=/your/project/path -d example.com -d www.example.com

webroot-path就是你的项目路径,使用 -d 可以添加多个域名。这时证书就已经生成成功了,默认保存在 /etc/letsencrypt/live/example.com/ 下。证书文件包括:

  • cert.pem: 服务端证书
  • chain.pem: 浏览器需要的所有证书但不包括服务端证书,比如根证书和中间证书
  • fullchain.pem: 包括了cert.pem和chain.pem的内容
  • privkey.pem: 证书私钥
3. 生成迪菲-赫尔曼密钥交换组( Strong Diffie-Hellman Group)

为了进一步提高安全性,你也可以生成一个 Strong Diffie-Hellman Group。

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

如果没有安装 openssl,这里要先安装一下。

yum install openssl

配置 Nginx

编辑 Nginx 配置文件,如果你不知道配置文件在哪,可以用 locate /nginx.conf 命令查找。添加以下内容,具体参数以你的实际情况为准。

server {
    listen 443 ssl;
    # 启用http2
    # 需要安装 Nginx Http2 Module
    # listen 443 http2 ssl;
    server_name example.com www.example.com;
    #证书文件
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    #私钥文件
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 优先采取服务器算法
    ssl_prefer_server_ciphers on;
    # 定义算法
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
   
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    # 使用DH文件
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location ~ /.well-known {
        allow all;
    }

    root /your/project/path;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

解释一下其中几项配置:

ssl_stapling on;

开启 OCSP Stapling,使服务端主动获取 OCSP 查询结果并随着证书一起发送给客户端,从而让客户端跳过自己去验证的过程,提高 TLS 握手效率。

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";

启用 HSTS 策略,强制浏览器使用 HTTPS 连接,max-age设置单位时间内強制使用 HTTPS 连接;includeSubDomains 可选,设置所有子域同时生效。浏览器在获取该响应头后,在 max-age 的时间内,如果遇到 HTTP 连接,就会通过 307 跳转強制使用 HTTPS 进行连接

    add_header X-Frame-Options DENY;

添加 X-Frame-Options 响应头,可以禁止网站被嵌入到 iframe 中,减少点击劫持 (clickjacking)攻击

    add_header X-Content-Type-Options nosniff;

添加 X-Content-Type-Options 响应头,防止 MIME 类型嗅探攻击

解释完毕。继续,来测试 nginx.conf 是否有语法错误

nginx -t

重启 Nginx

nginx -s reload

重定向 HTTP 到 HTTPS

修改原来 HTTP 网站的 Nginx 配置。

server {
    listen 80;
    server_name example.com www.example.com;
    access_log /var/log/example/access.log;
    error_log /var/log/example/error.log;
    # 301 永久重定向
    return 301 https://$host$request_uri;
    location / {
        root /your/project/path;
        index index.html index.htm;
    }
}

这时再访问网站,浏览器地址栏就会出现一把小锁。


https.png

一旦升级 HTTPS,网站内的所有资源文件和请求的协议也必须为 HTTPS,你需要在前端代码里修改一下。

最后可以使用 ssllabs 测试一下网站的安全性,我的网站得了 A+😁


参考链接:
Nginx 配置 HTTPS 服务器
How To Secure Nginx with Let's Encrypt on CentOS 7

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容