关于SSL证书关于SSL的介绍可以参考阮一峰老师的《SSL/TLS协议运行机制的概述》。SSL证书主要有两个作用:加密和身份证明,通常需要购买,也有免费的。本文使用阿里云一年免费SSL证书。申请免费证书,进入阿里云控制台-产品与服务-安全(云盾)-SSL证书,点击购买证书,选择免费DVSSL->完成证书颁发申请,然后下载证书。配置证书进入nginx配置目录,添加certs/文件夹,将刚刚下载的两个文件上传到certs/文件夹。监听443和80端口,并在443端口开启sslserver{listen443;服务器名称bjubi.com;//你的域名sslon;根/var/www/bjubi.com;//前面的文件存放文件夹,可以换成另外一个indexindex.htmlindex.htm;//上面配置的文件夹里的index.htmlssl_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_timeout5m;ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocolsTLSv1TLSv1.1TLSv1.2;ssl_prefer_server_ciphers开启;location/{indexindex.htmlindex.htm;}}服务器{听80;server_namewww.site1.com;//你的域名重写^(.*)$https://$host$1permanent;//将http域名请求转换为https}HTTPS服务器优化减少CPU计算。工作进程(workerprocesses),进程数不会少于可用的CPU核数。在SSL通信过程中,“握手”阶段的操作消耗的CPU资源最多。减少每个client的计算量有两种方法:激活keepalive长连接,发送更多的请求,在一个连接中复用SSL会话参数。避免连接数中的多次SSL“握手”。这些会话将存储在SSL会话缓存中。通过配置命令ssl_session_cache,可以实现机器间共享缓存,然后使用client在“握手”阶段使用的sessionid来查询server的sessioncache(如果server设置了),简化了“handshake”“阶段。一个1M的session缓存大约包含4000个session,默认缓存超时时间为5分钟。您可以使用ssl_session_timeout命令设置缓存超时。下面是一个多核系统优化配置的例子,共享会话缓存为10M:http{#配置共享会话缓存的大小ssl_session_cacheshared:SSL:10m;#配置会话超时ssl_session_timeout10m;server{#...#建立长连接keepalive_timeout70;#...使用HSTS策略强制浏览器使用HTTPS连接HSTS–HTTPStrictTransportSecurity,HTTPStrictTransportSecurity。它允许HTTPS网站要求浏览器始终通过HTTPS访问它,使攻击者更难拦截、篡改和冒充用户与服务器的通信。在Nginx的配置文件中添加如下头信息即可:add_headerStrict-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重定向重定向):307redirectNon-Authoritative-Reason响应头加强HTTPS安全HTTPS基础配置默认采用的加密算法是SHA-1,它非常脆弱,安全性逐年下降。2014年,谷歌官方博客宣布,Chrome浏览器将逐步减少SHA-1证书的安全说明,从2015年开始使用SHA-2签名证书。请参考2014年发表文章中的Rabbit_Run:《为什么Google急着杀死加密算法SHA-1》为此,主流的HTTPS配置方案应该避免SHA-1,可以使用Diffie-Hellman密钥交换(D-H,Diffie–Hellmankeyexchange)方案。首先在/etc/ssl/certs目录下运行如下代码生成dhparam.pem文件:openssldhparam-outdhparam.pem2048然后添加Nginx配置:#Priorityserveralgorithmssl_prefer_server_cipherson;#UseDHfilessl_dhparam/etc/ssl/certs/dhparam.pem;ssl_protocolsTLSv1TLSv1.1TLSv1.2;#Definealgorithmssl_ciphers"EECDH+ECDSA+AESGCMEECDH+aRSA+AESGCMEECDH+ECDSA+SHA384EECDH+ECDSA+SHA256EECDH+aRSA+SHA384EECDH+aRSA+SHA256EECDH+aRSA+RC4EECDHEDH+aRSA!aNULL!eNULL!LOW!3DES!MD5!EXP!PSK!SRP!DSS!RC4";#减少点击劫持add_headerX-Frame-OptionsDENY;#禁止服务器来自自动解析资源类型add_headerX-Content-Type-Optionsnosniff;#Anti-XSSattackadd_headerX-Xss-Protection1;优化综合配置worker_processesauto;http{#配置共享会话缓存大小,根据站点访问设置ssl_session_cache共享:SSL:10m;#配置会话超时ssl_session_timeout10m;服务器{听443ssl;服务器名称www.example.com;#设置长连接keepalive_timeout70;#HSTS策略add_headerStrict-Transport-Security"max-age=31536000;includeSubDomains;preload"总是;#证书文件ssl_certificatewww.example.com.crt;#私钥文件ssl_certificate_keywww.example.com.key;#优先服务器算法ssl_prefer_server_cipherson;#使用DH文件ssl_dhparam/etc/ssl/certs/dhparam.pem;ssl_protocolsTLSv1TLSv1.1TLSv1.2;#定义算法ssl_ciphers"EECDH+ECDSA+AESGCMEECDH+aRSA+AESGCMEECDH+ECDSA+SHA384EECDH+ECDSA+SHA256EECDH+aRSA+SHA384EECDH+aRSA+SHA256EECDRCH4+aRSA+EECDHEDH+aRSA!aNULL!eNULL!LOW!3DES!MD5!EXP!PSK!SRP!DSS!RC4";#减少点击劫持add_headerX-Frame-OptionsDENY;#禁止服务器自动解析资源类型add_headerX-Content-Type-Optionsnosniff;#防XSS攻击add_headerX-Xss-Protection1;#...
