18143453325 在线咨询 在线咨询
18143453325 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 如何让HTTPS站点更加安全? 这篇HTTPS安全加固配置最佳实践指南就够了

如何让HTTPS站点更加安全? 这篇HTTPS安全加固配置最佳实践指南就够了

时间:2023-04-19 01:14:01 | 来源:网站运营

时间:2023-04-19 01:14:01 来源:网站运营

如何让HTTPS站点更加安全? 这篇HTTPS安全加固配置最佳实践指南就够了:[TOC]




前置知识推荐了解
HTTPS原理介绍以及证书签名的申请配置 ( https://blog.weiyigeek.top/2019/10-21-10.html )




SSL与TLS协议原理和证书签名生成实践指南 ( https://blog.weiyigeek.top/2019/10-21-12.html )




原文链接
HTTPS安全优化配置最佳实践指南简述 ( https://blog.weiyigeek.top/2022/4-6-11.html )








0x02 HTTPS安全加固指南




描述: 当你的网站上了 HTTPS 以后,可否觉得网站已经安全了,其实不然前面说过想要部署TLS是非常容易,只需要证书与密钥文件然后根据中间件的配置ssl方法进行配置即可,默认的配置通常不满足https的安全需要,所以我们还需要进一步着重在于 HTTPS 网站的 Header 的相关配置。




1.连接安全性和加密选择




安全加固实践










# 语法演示:Strict-Transport-Security: max-age=<expire-time>Strict-Transport-Security: max-age=<expire-time>; includeSubDomainsStrict-Transport-Security: max-age=<expire-time>; preload# 配置示例: 浏览器防止指定站点以及将来的子域名都采用 HTTPS,最大年龄为1年(31536000),同时还允许预加载(加快速度):Strict-Transport-Security: max-age=31536000; includeSubDomains; preload# Nginx# HSTS (ngx_http_headers_module is required) (63072000 seconds == 两年)add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;








例如,浏览器连接到 https://weiyigeek.top,它存在这个头。header 告诉浏览器,如果证书 key 匹配,或者在发出证书链中有一个 key 匹配,那么在将来才会再次连接。其他的指令组合是可能的。它们都极大地减少了攻击者在客户端和合法主机之间模拟主机或拦截通信的可能性。



Public-Key-Pins: max-age=5184000; pin-sha256="+oZq/vo3Kcv0CQPjpdwyInqVXmLiobmUJ3FaDpD/U6c="; pin-sha256="47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="


温馨提示: 设置 HSTS header Strict-Transport-Security 长的生命周期,即 max-age 的时间不能小于15552000,最好是半年及以上。
温馨提示: 确定是否需要为您的站点使用 PKP, 如果要是使用它请注意在SSL/TLS密钥需要更新时建立备份计划, 优先创建备份密钥和离线存储。













2.站点内容安全(Content security)




安全加固实践













一个理想的CSP策略是基于白名单的方法,不允许任何东西,除了明确允许的内容,它还限制了 javascript 的来源和允许操作。



# 从限制性策略开始在必要时放松。Content-Security-Policy: default-src 'none';# 现在让我们允许自托管 scripts、images、CSS、fonts 和 AJAX,以及 jQuery CDN 托管脚本和 Google Analytics:Content-Security-Policy: default-src 'none'; script-src 'self' https://code.jquery.com https://www.google-analytics.com; img-src 'self' https://www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self';# 一个不那么严格的策略Content-Security-Policy: default-src 'self';# 更少的限制性策略,然后添加限制,非常不建议如此使用。Content-Security-Policy: default-src '*';








# HTTP header: 完全不允许使用 sameorigin 拒绝或允许同源框架的选项X-Frame-Options: deny# 该响应头可选值DENY:不能被嵌入到任何iframe或者frame中。SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中ALLOW-FROM uri:只能被嵌入到指定域名的框架中# Nginx, 允许 music.163.com 放置在站点之中add_header X-Frame-Options ALLOW-FROM music.163.com;








# HTTP header:X-Xss-Protection: 1; block# Nginx:add_header X-XSS-Protection "1; mode=block";








# HTTP header:Cache-Control: public*# 可选参数:其中的一个 public,private,no-cache 或 no-store。








# HTTP header:X-Content-Type-Options: nosniff# Nginxadd_header X-Content-Type-Options nosniff;








# 完整性校验,该文件的SHA384值<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js" integrity="sha384-6ePHh72Rl3hKio4HiJ841psfsRJveeS+aLoaEf3BWfS+gTF0XdAqku2ka8VddikM"></script># 或者本地相对调用<script>window.jQuery || document.write('<script src="/jquery.min.js"><//script>')</script>








# 设置 iframe 的 sandbox 属性,然后添加所需的权限。<iframe src="https://weiyigeek.top" sandbox="allow-same-origin allow-scripts"></script>











# 标记所有 cookie 安全为HttpOnlySet-Cookie: Key=Value; path=/; secure; HttpOnly, Key2=Value2; secure; HttpOnly# 例如, Tomcat7 中进行 HttpOnly 与 secure 配置# tomcat/conf/server.xml<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" secure="true" /># tomcat/conf/web.xml<session-config> <session-timeout>30</session-timeout> <cookie-config> <http-only>true</http-only> </cookie-config> </session-config>








# 防止搜索引擎显示使用PHP生成的文件.add_header X-Robots-Tag noindex;# 假如一个提供.doc文件的网站,但由于特定的原因,不希望搜索引擎为该文件类型建立索引.location ~* /.(doc|docx|pdf)$ { add_header X-Robots-Tag noindex, noarchive, nosnippet;}


温馨提示: 在Nginx中配置缓存策略非常简单, 我们只需要在指定的location规则下,加入类似于expires关键参数即可;













3.避免站点额外信息泄露




安全加固实践






















4.避免Web服务器中间件脆弱性




安全加固实践

















0x03 HTTPS安全与兼容性如何抉择




描述: 很多网站HTTPS检测评分都达到了A或者A+, 但在看检测结果的时候发现类似于百度和淘宝这类大用户群的网站居然没有评级到A或者在使用的加密套件上有橙色的加密套件, 这是由于不同的业务侧重点不同,针对于浏览业务不涉及重要敏感信息的系统往往会牺牲一点安全性获取极致的兼容性。













温馨提示: 如果要适配IE6这款浏览器,那么SSL协议就必须得支持SSL2和SSL3(会受到POODLE漏洞问题影响), 所以除去CBC加密套件那就只剩下RC4系列的加密套件,实际上RC4也是不安全只是为了兼容某些老版浏览器的妥协。
温馨提示: 如果要放弃IE6并适配兼容XP上的IE8这款浏览器,唯一比较安全的就是3DES系列的加密套件,这差不多少是一种较好的方式。




如果你的服务器需要支持像IE6这种古董级别的浏览器可以采用方式1, 而如果想在保证相对安全性的同时也具有一定的兼容性可以采用方式2, 如果业务比较敏感为保证其安全性,忽略掉其兼容性,建议采用方式3(随着openssl版本迭代进行最好的安全性进行配置).




ssl_ciphers && ssl_protocols 在Nginx上配置示例
方式1.更好的兼容性(支持IE6老古董)




ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH;ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;


方式2.具有相对安全性和一定的兼容性(支持IE8~11)




# Nginxssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;# old configurationssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA;ssl_prefer_server_ciphers on;


方式3.建议根据系统中openssl版本中加密套件进行安全性配置,牺牲一定的兼容性。




ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDH:AES:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!3DES:!MD5:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;


博主当前配置




# Nginxssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;# 以下密码需要明确禁止使用!aNULL,不包含身份验证的DH密码,可能被中间人攻击!eNULL,不采取密钥交换,也就是明文传输!EXPORT,美国当年限制加密产品出口遗留的弱密码!MD5,!RC4,!DES,这些密码已被证明攻破难度低


温馨提示: 我们可以访问mozilla公司提供的 SSL Configuration Generator 参考进行相应的配置参考(https://ssl-config.mozilla.org/),例如我们生成具有多种客户端的通用服务器Nginx SSL配置。




# generated 2022-04-10, Mozilla Guideline v5.6, nginx 1.26.1, OpenSSL 1.1.1n, intermediate configuration# https://ssl-config.mozilla.org/#server=nginx&version=1.26.1&config=intermediate&openssl=1.1.1n&guideline=5.6server { listen 80 default_server; listen [::]:80 default_server; location / { return 301 https://$host$request_uri; }}server { listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /path/to/signed_cert_plus_intermediates; ssl_certificate_key /path/to/private_key; ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; # about 40000 sessions ssl_session_tickets off; # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam ssl_dhparam /path/to/dhparam; # intermediate configuration ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # HSTS (ngx_http_headers_module is required) (63072000 seconds) add_header Strict-Transport-Security "max-age=63072000" always; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; # verify chain of trust of OCSP response using Root CA and Intermediate certs ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; # replace with the IP address of your resolver resolver 127.0.0.1;}











温馨提示: 我们可以采用openssl ciphers命令查看套件支持的协议。




openssl ciphers -V 'ECDHE-RSA-AES128-GCM-SHA256:ECDH:AES:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:CAMELLIA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!MD5:!RC4' | column -t






0x0n 入坑出坑




1.通过https证书安全合规检测发现缺少HTTP Strict-Transport-Security响应头




解决办法: 例如,此处在 Nginx 服务器配置 server 段中添加如下内容 add_header Strict-Transport-Security "max-age=15768000;includeSubDomains;preload"; 以便于让浏览器响应并支持HSTS。













2.利用 myssl 站点的HTTPS安全报告工具检测,出现证书链不完整降级为B提示




问题描述:













缺少证书链的问题和解决办法: 修复的办法很简单就是在部署证书的时候,把那张缺失的CA证书一并部署。目前一般的证书签发机构在签发证书的时候会把该CA证书一并打包,如果你没有也不同慌,我们可以使用MySSL提供的工具(https://myssl.com/chain_download.html)补全证书链。




# 下载证书链curl https://myssl.com/api/v1/get_chain/5FFAFB3E5757A13292C4E3C0A045257E915D27DA > full_chain_ecc.crt# 在 Nginx 中配置证书链ssl_certificate /app/ssl/weiyigeek.top_ecc/full_chain_ecc.crt;ssl_certificate_key /app/ssl/weiyigeek.top_ecc/weiyigeek.top.key;








> 本文章来源 [我的Blog站点](https://blog.weiyigeek.top) 或 [WeiyiGeek 公众账号](https://www.weiyigeek.top/img/wechat-search.png) 以及 [我的BiliBili专栏](https://space.bilibili.com/385802642) (`技术交流、友链交换请邮我哟`),
> 欢迎各位志同道合的朋友一起学习交流,如文章有误请留下您宝贵的知识建议,通过邮箱【[master#weiyigeek.top](mailto:master#weiyigeek.top)】联系我哟!

关键词:安全,配置,实践,指南,更加

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭