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版本都支持禁用压缩了