转换为语音并朗读全文 00:00 / 00:00

使用 Nginx + Let's encrypt 配置 A+ 级 HTTPS

前言

现在已经到了遍地都是 HTTPS 网站的年代,浏览器的一些功能和接口也限制了 HTTPS 才能使用,如果你的网站还没有 HTTPS,是时候看下这篇文章,动手配置一个了。

本文讲述如何在 CentOS 7 上,为使用 Nginx 的网站配置 HTTPS。

操作

配置 HTTPS 前,需要有对应的证书。恰好,Let's encrypt 提供了免费的 SSL/TLS 证书。

1. 安装 Certbot 获取证书

下面获取证书的命令中,--email 表示域名所有者的邮箱,多个域名用 -d 连接。

这里不多做介绍,可前往 https://certbot.eff.org/docs/ 查看对应文档信息。

Certbot 会通过 80 端口检查域名的解析 IP 是否和请求的服务器 IP 一致,获取证书前,请确认你的域名解析正常。

# Certbot 在 EPEL 源里,需要先安装 EPEL。
yum install epel-release

# 安装 Certbot
yum install certbot-nginx

# 查看 80 端口是否被占用
lsof -i:80

# 如果是 Nginx 占用,停止 Nginx,释放 80 端口
nginx -s stop

# 获取证书
certbot certonly --standalone --email admin@example.com -d example.com -d www.example.com

# 更新证书
certbot renew

2. 为 Nginx 配置 A+ 级 HTTPS

打开需要配置 HTTPS 的站点配置文件,将以下代码粘贴在 server 里,并根据注释修改其对应的内容。

listen 443 ssl;

# 开启 SSL 功能
ssl on;

# 修改这里,SSL 证书文件路径,由证书签发机构提供
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

# 修改这里,SSL 密钥文件路径,由证书签发机构提供
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

# 修改这里,CA 根证书文件路径,由证书签发机构提供
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

# 修改这里,Diffie-Hellman 密钥文件路径,建议定期更改
# 生成方法: openssl dhparam -out dhparam.pem 4096
ssl_dhparam /etc/nginx/ssl/dhparam.pem;

# 修改这里,加密或解密 session_ticket 密钥文件路径,建议定期更改
# 生成方法: openssl rand 48 > session_ticket.key
ssl_session_ticket_key /etc/nginx/ssl/session_ticket.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
ssl_buffer_size 1400;
ssl_stapling on;
ssl_stapling_verify on;

# 修改这里,国内填 223.5.5.5 223.6.6.6,国外填 8.8.4.4 8.8.8.8
resolver 8.8.4.4 8.8.8.8 valid=300s;

resolver_timeout 5s;

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
add_header X-Content-Type-Options "nosniff";
add_header X-Frame-Options "DENY";
add_header X-XSS-Protection "1; mode=block";

如果你要使用 HTTP2,就需要更新 Nginx 到 1.9+,然后在 listen 后面加上 http2,如下

listen 443 ssl http2;

如果你要 SSL 支持 TLSv1.3,需要使用 OpenSSL draft-18+ 的分支,然后使用下面的配置:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers "TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

配置数据改好后,确认无误,重启下 Nginx 就行,到 https://www.ssllabs.com/ssltest/index.html 测下分数吧。

其他写法可以去这里看下:https://mozilla.github.io/server-side-tls/ssl-config-generator/

参考

带符号 * 的表示必填项
  1. 我来蹭wifi的
    我来蹭wifi的

    咋不通过评论呢,蹭wifi容易吗

    回复
    1. MaiCong
      MaiCong博主

      初次评论需要审核的

      回复
  2. 我来蹭wifi的
    我来蹭wifi的

    留个名,我是用面板,不开https不行,现在劫持比原来还多(电脑上不劫了,手机上看100%劫)

    回复
    1. MaiCong
      MaiCong博主

      https 是必上的

      回复
  3. 老杨
    老杨

    新版本 Chrome 已经不支持 draft 18 了,最低22。

    回复
    1. MaiCong
      MaiCong博主

      是的,所有我写的是18+

      回复
  4. noxxxx
    noxxxx

    为什么要说A+级呢?有什么特别之处?

    回复
    1. MaiCong
      MaiCong博主

      好看吧。。。

      回复
  5. 姬长信
    姬长信

    半年不能回退

    回复
    1. MaiCong
      MaiCong博主

      可以弄个兼容性写法

      回复
  6. Echo
    Echo

    你猪鸡用的谁家的啊

    回复
    1. MaiCong
      MaiCong博主

      留言板那里的那个链接就是

      回复
  7. 郑永
    郑永

    我直接用宝塔后台的。

    回复
    1. MaiCong
      MaiCong博主

      不习惯使用面板操作,还是命令行来的安逸。

      回复