Nginx 部分 (四) -SSL设置及性能优化、CORS配置

在看过基础概念与性能管理后,SSL设置也随之到来,尽管可能准备的不尽人意,但是尽量使得内容足以解惑。

 

SSL 和 TLS

 

 

SSL(Socket Secure Layer 缩写)是一种通过 HTTP 提供安全连接的协议。

 

SSL 1.0 由 Netscape 开发,但由于严重的安全漏洞从未公开发布过。SSL 2.0 于 1995 年发布,它存在一些问题,导致了最终的 SSL 3.0 在 1996 年发布。

 

TLS(Transport Layer Security 缩写)的第一个版本是作为 SSL 3.0 的升级版而编写的。之后 TLS 1.1 和 1.2 出来了。现在,就在不久之后,TLS 1.3 即将推出(这确实值得期待),并且已经被一些浏览器所支持。

 

从技术上讲,SSL 和 TLS 是不同的(因为每个协议都描述了协议的不同版本),但其中使用的许多名称是可以互换的。

 

 

基本 SSL/TLS 配置

为了处理 HTTPS 流量,你需要具有 SSL/TLS 证书。你可以通过使用 Let’s encrypt 以生成免费的证书。

当你拥有证书之后,你可以通过以下的方式轻易切换至 HTTPS:

  • 开始监听端口 443(当你输入 https://sample.co 时浏览器将使用的默认端口)
  • 提供证书及其密钥

 

 

server {
  listen 443 ssl default_server;
  listen [::]:443 ssl default_server;
 
  ssl_certificate /etc/nginx/ssl/netguru.crt;
  ssl_certificate_key /etc/nginx/ssl/netguru.key;
}

 

 

 

我们也想通过调整配置实现:

  • 仅使用 TLS 协议。由于众所周知的漏洞,所有的 SSL 版本都将不再使用

  • 使用预定义的安全的服务器密码(类似于协议的情况 – 那些日子只有少数密码被认为是安全的)


 设置总在变化,时不时更新总是好的

 

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;
ssl_prefer_server_ciphers on;
 
server {
  listen 443 ssl default_server;
  listen [::]:443 ssl default_server;
 
  ssl_certificate /etc/nginx/ssl/netguru.crt;
  ssl_certificate_key /etc/nginx/ssl/netguru.key;
}

 

 

 

 

 

TLS 会话恢复

使用 HTTPS,在 TCP 之上需要增加 TLS 握手。这大大增加了此前实际数据传输的时间。假设你从华沙请求 /image.jpg,并接入到柏林最近的服务器:

 

为了在 TLS 握手期间节省一个 roundtrip 时间,以及生成新密钥的计算开销,我们可以重用在第一个请求期间生成的会话参数。客户端和服务器可以将会话参数存储在会话 ID 密钥的后面。在接下来的 TLS 握手过程中,客户端可以发送会话 ID,如果服务器在缓存中仍然有正确的条目,那么会重用前一个会话所生成的参数。

 

 

server {
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1h;#超时时间
}

 

OCSP Stapling

 

SSL 证书可以随时撤销。浏览器为了知道给定的证书是否不再有效,需要通过在线证书状态协议 (Online Certificate Status Protocol ,OCSP) 执行额外的查询。无需用户执行指定的 OCSP 查询,我们可以在服务器上执行此操作,缓存其结果,并在 TLS 握手期间为客户端提供 OCSP 响应。它被称为OCSP stapling

 

server {
  ssl_stapling on;
  ssl_stapling_verify on;                               # verify OCSP response
  ssl_trusted_certificate /etc/nginx/ssl/lemonfrog.pem; # tell nginx location of all intermediate certificates,自己证书的位置
 
  resolver 8.8.8.8 8.8.4.4 valid=86400s;                # resolution of the OCSP responder hostname
  resolver_timeout 5s;
}

检测ocsp Stapling是否开启

 

 

 

 

 

Security headers

有一些标头确实值得调整以提供更高的安全性。有关更多关于标头及其详细信息,你绝对应该查看OWASP 项目之安全标头。

HTTP Strict-Transport-Security(HSTS)

HSTS详解

简称 HSTS,强制用户代理在向源发送请求时使用 HTTPS。

 

语法如下:
Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]
Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]

 

示例: add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
  • max-age是必选参数,是一个以秒为单位的数值,它代表着HSTS Header的过期时间,通常设置为1年,即31536000秒。
  • includeSubDomains是可选参数,如果包含它,则意味着当前域名及其子域名均开启HSTS保护。
  • preload是可选参数,只有当你申请将自己的域名加入到浏览器内置列表的时候才需要使用到它。关于浏览器内置列表,点击上面超链接进入并配置。

 

X-Frame-Options

表示浏览器是否需要在一帧、一个 iframe 或一个对象标签中渲染页面

 

	add_header X-Frame-Options DENY;

 

(1)DENY --- 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。

(2)SAMEORIGIN --- 表示该页面可以在相同域名页面的 frame 中展示。

(3)ALLOW-FROM https://example.com/ --- 表示该页面可以在指定来源的 frame 中展示。


X-Content-Type-Options

 

此选项将阻止浏览器在判断文件类型时嗅探文件。文件将会按照 Content-Type 头中声明的格式转译。

 

 

add_header X-Content-Type-Options nosniff;

如果服务器发送响应头 “X-Content-Type-Options: nosniff”,则 script 和 styleSheet 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME

 

类型混淆的攻击。

 

Server tokens

另一个很好的做法是在 HTTP 响应头字段中隐藏有关 Web 服务器的信息:不然会出现:

 

Server : nginx/1.18.2

我们需要如下去隐藏版本号以防安全

 

 

server_tokens off;

 

 

CORS配置

 项目中额外需要配置跨站请求,先了解一下配置属性意义:

     

  • Access-Control-Allow-Origin(必含):允许的域名,只能填通配符或者单域名

 

  • Access-Control-Allow-Methods(必含):允许跨域请求的 http 方法

 

  • Access-Control-Allow-Headers返回支持的 http 请求头

 

  • Access-Control-Allow-Credentials(可选):标志着当前请求是否包含 cookies 信息,布尔值。只有一个可选值:true,如果不包含 cookies,请略去该项,而不是填 false。这一项与XmlHttpRequest2 对象当中的 withCredentials 属性应保持一致,即 withCredentials 为true时该项也为 true;withCredentials为false时,省略该项不写。反之则导致请求失败。

 

  • Access-Control-Max-Age(可选):以秒为单位的缓存时间,用于缓存预检请求。
如下填入nginx配置即可,个性化根据个人而已稍作修改
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
            add_header Access-Control-Allow-Credentials 'true';
            add_header Access-Control-Allow-Headers 'Accept, Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
            if ($request_method = 'OPTIONS') {
               add_header 'Access-Control-Allow-Origin' *;
               add_header 'Access-Control-Max-Age' 1728000;
               add_header 'Access-Control-Allow-Credentials' 'true';
               add_header 'Access-Control-Allow-Methods' 'GET, POST, DELETE, PUT, OPTIONS';
               add_header 'Access-Control-Allow-Headers' 'Accept, Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
               add_header 'Content-Type' 'text/plain charset=UTF-8';
               add_header 'Content-Length' 0;
               return 204;
           }

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值