《更快更安全,HTTPS优化之路(上)》中波波为大家分享了一部分https优化的方法,今天紧接上一篇文章分享《更快更安全,HTTPS优化之路(下)》。
5、开启HPKP。
HPKP也叫公钥固定,这是一种https网站防止攻击者使用CA错误颁发的证书进行中间人攻击的一种安全机制,用于预防诸如攻击者入侵CA偷发证书、浏览器信任CA签发伪造证书等情况,采用该机制后服务器会提供一个公钥哈希列表,客户端在后续的通信中只接受该列表上的一个或多个公钥。
我们可以通过增加HTTP响应头来完成相关的配置,格式如下:
- Public-Key-Pins: pin-sha256="base64=="; max-age=expireTime [; includeSubDomains][; report-uri="reportURI"]
备注:
- pin-sha256:Base64加密的证书指纹;一般情况至少指定两个,其中包含一个备用指纹。
- max-age:过期时间,秒
- includeSubDomains:是否包含子域
- report-uri:可选参数;验证失败时的上报地址
pin-sha256证书指纹这个配置很容器搞错,所以需要配置的童鞋也可以参考这篇文章:https://news.netcraft.com/archives/2016/03/30/http-public-key-pinning-youre-doing-it-wrong.html
生成pin-sha256证书指纹的方法:
①通过 RSA key 文件生成:
- openssl rsa -in my-rsa-key-file.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
②通过 ECC key 文件生成:
- openssl ec -in my-ecc-key-file.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
③通过 CSR 文件生成:
- openssl req -in my-signing-request.csr -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
④通过域名之间生成:
- openssl s_client -servername www.example.com -connect www.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
密码指纹生成之后,我们就可以在服务器中进行配置了,如Apache,我们需要在配置vhost_ssl.conf(每个人的定义不一样可能,我是一个网站一个单独的配置文件,http请求的配置文件和SSL的配置文件单独分开)文件中增加。
- Header always set Public-Key-Pins "pin-sha256=\"base64+primary==\"; pin-sha256=\"base64+backup==\"; max-age=5184000; includeSubDomains"
如果服务器是Nginx,则同样找到对应网站的配置文件,增加:
- add_header Public-Key-Pins 'pin-sha256="base64+primary=="; pin-sha256="base64+backup=="; max-age=5184000; includeSubDomains' always;
重启服务即可。(不是重启服务器哈~~~)
6、CAA配置。
CAA : DNS Certification Authority Authorization,使用DNS来指定该域名可以由哪些CA机构签发证书,这不是为TLS层的安全提供保证,而是作为CA签发证书程序中的一部分。使用CAA可以避免一些CA签发错误证书的情况。
关于CAA的配置比较简单主要是域名上增加一个关于证书颁发机构的解析即可,如下图所示。
如果你不知道CAA的解析记录值,可以借助CAA Record Helper这个工具查询。
7、设置X-Frame-Options 响应头。
X-Frame-Options HTTP 响应头是用来给浏览器指示是否允许一个页面在 <frame>,<iframe> 或者 <object> 中展现的标记。通过设置 X-Frame-Options HTTP 响应头,我们可以确保自己的网站内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。
X-Frame-Options 有三个值:
- DENY :表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
- SAMEORIGIN :表示该页面可以在相同域名页面的 frame 中展示。
- ALLOW-FROM uri :表示该页面可以在指定来源的 frame 中展示。
就是说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载;如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。
Nginx配置参考示例:
- add_header X-Frame-Options SAMEORIGIN;
8、设置X-Content-Type-Options 响应头。
Content-Type 是用来标识资源类型的。浏览器有个特性,就是当有些资源的 Content-Type 没定义或者定义错了,浏览器会启用 MIME sniffing 来检测该资源的类型然后解析内容并执行。所以攻击者可以利用浏览器这个特性让原本的请求中的资源类型解析为其它类型,所以一般情况下我们都禁止浏览器去检测类型:
- X-Content-Type-Options: nosniff
9、隐藏服务器类型和版本。
隐藏服务器类型和版本,比如Apache和Nginx以及他们的版本从而避免别人很容易利用服务器自身的漏洞进行攻击。比如菠菜园的服务器将Nginx以及版本修改成了"fuck you"。大家也可以尝试隐藏起来,同时可以隐藏的还有PHP版本。
- server_tokens off;
我隐藏的方法是直接修改了Nginx的C文件,然后编译的,想要省事儿的也可以直接在配置文件中加入上述一句话就OK了。
移除X-power-by:
- proxy_hide_header X-Powered-By;
移除PHP版本:(修改php.ini)
- expose_php = off
10、X-XSS-Protection 响应头。
XSS Protection 显然是用来防止 XSS 攻击的,这个不需要多解释了。
- add_header X-Xss-Protection "1; mode=block";
通过以上设置,对于一个一般的站点基本上就可以了,当然没有任何一种方案是100%的安全,关于HTTPS的安全优化就分享这么多,晚安。