资讯专栏INFORMATION COLUMN

【nginx运维基础(7)】配置SSL支持https访问

mingzhong / 2692人阅读

摘要:证书主要有两个功能加密和身份证明,通常需要购买,也有免费的,本文使用阿里云的一年免费期的证书。申请免费证书阿里云控制台产品与服务安全云盾证书,点击购买证书,选择免费型补全申请签发证书,然后下载证书。

关于 SSL 证书

有关 SSL 的介绍可以参阅阮一峰老师的《SSL/TLS协议运行机制的概述》。

SSL 证书主要有两个功能:加密身份证明,通常需要购买,也有免费的,本文使用阿里云的一年免费期的ssl证书。

申请免费证书

阿里云控制台-产品与服务-安全(云盾)-SSL证书,点击购买证书,选择免费型DV SSL->补全申请签发证书,然后下载证书。

配置证书

进入nginx配置目录,增加certs/文件夹,把刚刚下载的两个文件上传到certs/文件夹中。

对443端口和80端口进行监听,443端口要启用ssl

server {
    listen 443;
    server_name bjubi.com; // 你的域名
    ssl on;
    root /var/www/bjubi.com; // 前台文件存放文件夹,可改成别的
    index index.html index.htm;// 上面配置的文件夹里面的index.html
    ssl_certificate /etc/nginx/conf.d/certs/site2/www.site1.com.crt;
    ssl_certificate_key /etc/nginx/conf.d/certs/site2/www.site1.com.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        index index.html index.htm;
    }
}
server {
    listen 80;
    server_name www.site1.com;// 你的域名
    rewrite ^(.*)$ https://$host$1 permanent;// 把http的域名请求转成https
}
HTTPS服务器优化 减少 CPU 运算量

SSL 的运行计算需要消耗额外的 CPU 资源,一般多核处理器系统会运行多个工作进程(worker processes),进程的数量不会少于可用的 CPU 核数。SSL 通讯过程中『握手』阶段的运算最占用 CPU 资源,有两个方法可以减少每台客户端的运算量:

激活keepalive长连接,一个连接发送更多个请求

复用 SSL 会话参数,在并行并发的连接数中避免进行多次 SSL『握手』

这些会话会存储在一个 SSL 会话缓存里面,通过命令ssl_session_cache配置,可以使缓存在机器间共享,然后利用客戶端在『握手』阶段使用的seesion id去查询服务端的 session cathe(如果服务端设置有的话),简化『握手』阶段。

1M 的会话缓存大概包含 4000 個会话,默认的缓存超时时间为 5 分钟,可以通过使用ssl_session_timeout命令设置缓存超时时间。下面是一個拥有 10M 共享会话缓存的多核系统优化配置例子:

http {
    #配置共享会话缓存大小
    ssl_session_cache   shared:SSL:10m;
    #配置会话超时时间
    ssl_session_timeout 10m;

    server {
        #...
        #设置长连接
        keepalive_timeout   70;
        #...
使用 HSTS 策略强制浏览器使用 HTTPS 连接

HSTS – HTTP Strict Transport Security,HTTP严格传输安全。它允许一个 HTTPS 网站要求浏览器总是通过 HTTPS 来访问,这使得攻击者在用戶与服务器通讯过程中拦截、篡改信息以及冒充身份变得更为困难。

只要在 Nginx 配置文件加上以下头信息就可以了:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;preload" always;

max-age:设置单位时间内強制使用 HTTPS 连接

includeSubDomains:可选,所有子域同时生效

preload:可选,非规范值,用于定义使用『HSTS 预加载列表』

always:可选,保证所有响应都发送此响应头,包括各种內置错误响应

当用户进行 HTTPS 连接的时候,服务器会发送一个Strict-Transport-Security响应头:

浏览器在获取该响应头后,在max-age的时间内,如果遇到 HTTP 连接,就会通过 307 跳转強制使用 HTTPS 进行连接,并忽略其它的跳转设置(如 301 重定向跳转):

307 跳转Non-Authoritative-Reason响应头

加强 HTTPS 安全性

HTTPS 基础配置采取的默认加密算法是 SHA-1,这个算法非常脆弱,安全性在逐年降低,在 2014 年的时候,Google 官方博客就宣布在 Chrome 浏览器中逐渐降低 SHA-1 证书的安全指示,会从 2015 年起使用 SHA-2 签名的证书,可参阅Rabbit_Run在 2014 年发表的文章:《为什么Google急着杀死加密算法SHA-1》

为此,主流的 HTTPS 配置方案应该避免 SHA-1,可以使用迪菲-赫尔曼密钥交换(D-H,Diffie–Hellman key exchange)方案。

首先在目录/etc/ssl/certs运行以下代码生成dhparam.pem文件:

openssl dhparam -out dhparam.pem 2048

然后加入 Nginx 配置:

#优先采取服务器算法
ssl_prefer_server_ciphers on;
#使用DH文件
ssl_dhparam /etc/ssl/certs/dhparam.pem;
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";
#减少点击劫持
add_header X-Frame-Options DENY;
#禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;
#防XSS攻击
add_header X-Xss-Protection 1;

优化后的综合配置

worker_processes auto;

http {

    #配置共享会话缓存大小,视站点访问情况设定
    ssl_session_cache   shared:SSL:10m;
    #配置会话超时时间
    ssl_session_timeout 10m;

    server {
        listen              443 ssl;
        server_name         www.example.com;
        
        #设置长连接
        keepalive_timeout   70;
        
        #HSTS策略
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        
        #证书文件
        ssl_certificate     www.example.com.crt;
        #私钥文件
        ssl_certificate_key www.example.com.key; 
        
        #优先采取服务器算法
        ssl_prefer_server_ciphers on;
        #使用DH文件
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        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";
        #减少点击劫持
        add_header X-Frame-Options DENY;
        #禁止服务器自动解析资源类型
        add_header X-Content-Type-Options nosniff;
        #防XSS攻擊
        add_header X-Xss-Protection 1;
        #...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40465.html

相关文章

  • nginx运维基础(8)】配置支持http2协议

    摘要:了解协议的主要目标是改进传输性能,实现低延迟和高吞吐量。从另一方面看,的高层协议语义并不会因为这次版本升级而受影响。所有首部值,以及它们的使用场景都不会变。不用为了利用的好处而修改标记。服务器必须运行协议,但大部分用户都不会因此而受到影响。 了解http2协议 HTTP 2.0 的主要目标是改进传输性能,实现低延迟和高吞吐量。从另一方面看,HTTP 的高层协议语义并不会因为这次版本升...

    IamDLY 评论0 收藏0
  • nginx运维基础(4)】Nginx的日志管理(日志格式与定时分割日志)

    摘要:日志主要分为两种访问日志和错误日志。请求过程中,的响应时间。正确的关闭错误日志记录功能的方法如下上面表示将存储日志的路径设置为垃圾桶。日志分割新版本支持自动切割并压缩日志,日志文件名如下默认是每天都会产生一个文件。 Nginx日志主要分为两种:访问日志和错误日志。日志开关在Nginx配置文件(一般在server段来配置)中设置,两种日志都可以选择性关闭,默认都是打开的。 访问日志acc...

    qiangdada 评论0 收藏0

发表评论

0条评论

mingzhong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<