标签 https 下的文章

Nginx启用新型HSTS安全协议

1440810884828.jpg

HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式。

当用户已经安全的登录开启过htst功能的网站 (支持hsts功能的站点会在响应头中插入:Strict-Transport-Security) 之后,支持htst的浏览器(比如chrome. firefox)会自动将这个域名加入到HSTS列表,下次即使用户使用http访问这个网站,支持htst功能的浏览器就会自动发送https请求(前提是用户没有清空缓存,如果清空了缓存第一次访问还是明文,后续浏览器接收到服务器响应头中的Strict-Transport-Security,就会把域名加入到hsts缓存中,然后才会在发送请求前将http内部转换成https),而不是先发送http,然后重定向到https,这样就能避免中途的302重定向URL被篡改。‍‍进一步提高通信的安全性。‍‍‍

HSTS preload list是什么?

HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表。

如何加入HSTS preload list?

加入HSTS preload list不但不麻烦,而且Chrome也鼓励HTTPS网站能够主动加入。申请的方法和需要满足的条件在https://hstspreload.appspot.com网站上都有具体说明。

我将加入HSTS preload list的条件摘录如下:

有效的证书(如果使用SHA-1证书,必须是2016年前就会过期的);

将所有HTTP流量重定向到HTTPS;

确保所有子域名启用HTTPS,特别是www子域名

同时输出的HSTS响应头部需要满足以下条件:

max-age至少需要18周,10886400秒

必须指定includeSubdomains参数

必须支持preload参数

Nginx配置:

HSTS preload list响应头:

在server模块中加入.

add_header Strict-Transport-Security “max-age=31536000; includeSubDomains;preload”;

新增一个server模块.

server
{
listen 80;
server_name suming.org www.suming.org;
rewrite ^/(.*) https://suming.org/$1 permanent;
}

达到以上条件之后前往:https://hstspreload.appspot.com 进行申请加入HSTS.(需反代访问)

Nginx SSL HTTPS相关配置

一、使用 OpenSSL 生成 SSL Key 和 CSR

输入以下命令:

openssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr

加密强度:2048 位,如果你的机器性能强劲,也可以选择 4096 位

国家(Country):CN

省份(State / Province):Beijing

城市(City):Beijing

部门(Department):可以不填写,这里我们写Web Security

组织或公司名字(Organization):Suming, Inc.

域名,也称为 Common Name:example.com (如同时添加WWW和不带WWW的,以逗号分开)

PS:如果是泛域名证书,则应该填写*.example.com

你可以在系统的任何地方运行这个命令,会自动在当前目录生成example.com.csr和example.com.key这两个文件

输入cat example.com.csr查看一下example.com.csr,得到一长串的加密文字,复制并提交SSL认证机构

这个 CSR 文件就是你需要提交给 SSL 认证机构的,当你的域名或组织通过验证后,认证机构就会颁发给你一个Suming.org.crt

二、Nginx 配置 HTTPS 网站以及增加安全的配置

前面已经提到,你需要提交 CSR 文件给第三方 SSL 认证机构,通过认证后,他们会颁发给你一个 CRT 文件,我们命名为example.com.crt

同时,为了统一,你可以把这三个文件都移动到/etc/ssl/certs/目录。(自行修改目录)

然后可以修改 Nginx 配置文件

server {  
    listen 80;
    listen [::]:80 ssl ipv6only=on; 
    listen 443 ssl;
    listen [::]:443 ssl ipv6only=on;
    server_name example.com;

    ssl on;
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/certs/example.com.key;
}

检测配置文件没问题后重新读取 Nginx 即可

nginx -s reload

生成完毕后,在 Nginx 的 SSL 配置后面加入

ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;  

同时,如果是全站 HTTPS 并且不考虑 HTTP 的话,可以加入 HSTS 告诉你的浏览器本网站全站加密,并且强制用 HTTPS 访问

add_header Strict-Transport-Security max-age=63072000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

同时也可以单独开一个 Nginx 配置,把 HTTP 的访问请求都用 301 跳转到 HTTPS

server {  
        listen 80;
        listen [::]:80 ssl ipv6only=on;
        server_name     example.com;
        return 301 https://example.com$request_uri;
}

PS:文章中涉及的域名、目录自行替换,此文章仅备用。