不为有趣之事,何遣有涯之生
不失其所者久,死而不亡者寿

Nginx安装及SSL相关配置

Nginx安装及SSL相关配置

环境准备

  • GCC编译器安装(编译源码需要使用)
    执行命令gcc -v 查看编译器是否已经安装,如果没有的话安装 执行yum install gcc
    在 linux 编译,需要 gcc,make,cmake,autoconf,libtool 等工具,建议把常用工具都一起安装了
yum -y install gcc make cmake autoconf libtool
  • PCRE库安装(正则表达式库,配置文件需要使用)
    查看是否有pcre包: rpm -qa |grep pcre 一般是系统都有的,
    安装命令 yum -y install pcre pcre-devel 或者:yum install pcre

nginx源码编译安装

  • 下载源码
    前往nginx的官网下载
    获得下载路径后,执行命令 wget http://nginx.org/download/nginx-1.10.3.tar.gz

  • 解压安装包
    执行命令: tar zxvf nginx-1.4.2.tar.gz

  • 编译安装
    进入解压路径cd nginx-1.6.0
    执行命令 ./configure --prefix=/usr/local/nginx 指定安装目录,可以自己决定
    最后执行make && make install

  • 启动或配置
    安装好后,可以在nginx的sbin目录下启动服务,可能出现的错误是默认的80端口被其他程序占用
    使用命令netstat -antp 命令查看
    需要更改nginx配置的话进入conf文件夹下的nginx.conf文件进行配置,详细配置信息请查看nginx配置章节

HTTPS支持

  • 安装OPENSSL(生成证书或秘钥时需要)
    yum -y install openssl-devel

  • 配置编译环境
    执行 ./configure --prefix=/home/java/nginx --with-http_ssl_module
    如要用到其他的模块功能也类似这样安装,下面是比较常用的一些模块
    --with-http_stub_status_module 监控运行状态
    --with-http_ssl_module HTTPS支持
    --with-http_gzip_static_module 静态文件压缩
    --with-http_realip_module 获取真实IP

  • 执行编译安装命令
    make && make install

HTTPS安全配置简单介绍

尽量不要用默认配置,因为版本不同默认配置就会改变
- ssl on 开启SSL
- ssl_certificate 证书,发送给客户端验证服务器身份用,比如www.example.com.crt;nginx只支持一个证书,有中间证书的话要自己合并成一个文件,保证服务器证书在最前面
- ssl_certificate_key 私钥 解密消息,密钥使用 日入:www.example.com.key;
- ssl_protocols 协议 加密握手协议,常见:TLSv1 TLSv1.1 TLSv1.2; 不要配置SSL协议
- ssl_ciphers 加密套件,请选择有前向安全性的加密套件 可以特别指定 如:AES128+EECDH:AES128+EDH ,一般也会指定高安全的并表明禁用的加密套件 HIGH:!aNULL:!MD5(使用高级别的安全套件,禁用MD5);

推荐的加密套件:ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-SHA ECDHE-ECDSA-

AES256-SHAECDHE-ECDSA-AES128-SHA256 ECDHE-ECDSA-AES256-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ...

!aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !MEDIUM

  • ssl_prefer_server_ciphers on; 开启服务器算法优先原则,由服务器来决定适配算法
  • ssl_password_file 将私钥的密码加入到配置文件中(1.7.3版本之后才有,之前都是没有密码的)

    当你有多个站点,使用通配符证书的时候,把证书和私钥放在nginx的http段配置比较好

ssl_certificate     common.crt;
ssl_certificate_key common.key;

server {
    listen          443 ssl;
    server_name     www.example.com;
    ...
}

server {
    listen          443 ssl;
    server_name     www.example.org;
    ...
}

HTTPS配置加强版

DH秘钥交换加强

  • nginx默认提供的DH秘钥交换算法是1024位的,安全性还不够强,可以配置临时的DH秘钥交换
    > 一定要保证客户端也支持哦,比如java8以前是不支持1024位以上的DH参数的
  • 用OpenSSL生成2048位参数文件 openssl dhparam -out dh-2048.pem 2048
  • 配置 ssl_dhparam dh-2048.pem

不推荐更强的DH参数了,因为再高会显著影响SSL的握手效率了

ECDH秘钥交换加强

  • 套件的ECDHE密钥默认是256EC位,使用secp256r1作为曲线模型,加密强度相当于3072位RSA秘钥,应该足够安全了
  • 当然你也可以自己调整 ssl_ecdh_curve secp384r1 相当于7680位RSA密钥
  • 如果是在OpenSSL中使用还是建议用默认的,secp256r1曲线模型在OpenSSL中是做过优化的,运行的更快

HTTPS中TLS会话管理

独立会话缓存配置

  • ssl_session_cache shared:ssl_session_cache:1M 独立会话缓存 例如:shared:SSL:10M;

    分配1M的共享内存缓存,1M大概可以存放4000个会话

  • ssl_session_timeout 会话超时时间 例如:1140m,默认的只有5分钟,建议配置成24小时,能够减少TSL握手时间,提升效率

独立会话票证

  • 默认情况会话票证是由OpenSSL处理的
  • 会话票证使用的是128位的AES加密,web服务器启动初始化时会自动生成一个一次性的,根据服务器配置不同,可能会有多个票证密钥同时使用的情况
  • 服务器重启会生成新的票证密钥,这会导致所有已经接入的客户端需要重新进行TLS会话
  • 出于安全性考虑,每一站点分配一个独立的会话票证是最安全的
    配置 ssl_session_ticket_key ticket.key
  • 当你使用服务器集群且不希望部署共享票证密钥时,可以禁用 ssl_session_tickets off

客户端身份认证

  • 想配置启用客户端身份验证,Nginx需要提供一个完整证书链的所有CA证书,以及一份相关的证书吊销列表
  • 开启客户端验证身份验证配置 ssl_verify_client on;
  • 指定客户端证书到根证书的最大证书路径长度 ssl_verify_depth 2;
  • 指定允许签发客户端证书的CA证书 ssl_client_certificate sub-ca.crt 将发送给用户用于客户端证书选取
  • 完整证书链中需要包含的其他CA证书 ssl_trusted_certificate root-ca.crt
  • 证书吊销列表,文件有更新时Nginx需要重新加载 ssl_revoked-certificates.crl

在Nginx中SSL/TSL协议问题

这个话题其实对Nginx用户来说是个好消息,为什么呢?因为SSL/TSL协议上的问题发现后,在Nginx上都得到了快速的解决,甚至在问题公开之前就修复了

  • 不安全的重新协商

    Nginx直接不支持客户端,也不支持服务器发起重新协商

  • BEAST

    这种攻击需要攻击者控制受害者发送的数据,只有浏览器会受到攻击

  • CRIME

    利用TLS协议启动压缩时信息泄露,Nginx已经对所有OpenSLL版本都支持禁用压缩了

未经允许不得转载:菡萏如佳人 » Nginx安装及SSL相关配置

欢迎加入极客江湖

进入江湖关于作者