nginx ssl配置

1. 全站ssl

全站作ssl是最多见的一个使用场景,默认端口443,并且通常是单向认证。html

server {
        listen 443;
        server_name example.com;

        root /apps/www;
        index index.html index.htm;

        ssl on;
        ssl_certificate ../SSL/ittest.pem;
        ssl_certificate_key ../SSL/ittest.key;

# ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;

}

若是想把http的请求强制转到https的话:nginx

server {
  listen      80;
  server_name example.me;
  rewrite     ^   https://$server_name$request_uri? permanent;

### 使用return的效率会更高 
# return 301 https://$server_name$request_uri;
}

ssl_certificate证书实际上是个公钥,它会被发送到链接服务器的每一个客户端,ssl_certificate_key私钥是用来解密的,因此它的权限要获得保护但nginx的主进程可以读取。固然私钥和证书能够放在一个证书文件中,这种方式也只有公钥证书才发送到client。算法

ssl_protocols指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 如今还有不少地方在用但有很多被攻击的漏洞。浏览器

ssl_ciphers选择加密套件,不一样的浏览器所支持的套件(和顺序)可能会不一样。这里指定的是OpenSSL库可以识别的写法,你能够经过 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(后面是你所指定的套件加密算法) 来看所支持算法。缓存

ssl_prefer_server_ciphers on设置协商加密算法时,优先使用咱们服务端的加密套件,而不是客户端浏览器的加密套件。服务器

https优化参数

  • ssl_session_cache shared:SSL:10m; : 设置ssl/tls会话缓存的类型和大小。若是设置了这个参数通常是sharedbuildin可能会参数内存碎片,默认是none,和off差很少,停用缓存。如shared:SSL:10m表示我全部的nginx工做进程共享ssl会话缓存,官网介绍说1M能够存放约4000个sessions。 详细参考serverfault上的问答ssl_session_cache
  • ssl_session_timeout : 客户端能够重用会话缓存中ssl参数的过时时间,内网系统默认5分钟过短了,能够设成30m即30分钟甚至4h

设置较长的keepalive_timeout也能够减小请求ssl会话协商的开销,但同时得考虑线程的并发数了。session

提示:在生成证书请求csr文件时,若是输入了密码,nginx每次启动时都会提示输入这个密码,可使用私钥来生成解密后的key来代替,效果是同样的,达到免密码重启的效果:并发


HTTPS服务器优化

SSL操做须要消耗CPU资源,因此在多处理器的系统,须要启动多个工做进程,并且数量须要很多于可用CPU的个数。最消耗CPU资源的SSL操做是SSL握手,有两种方法能够将每一个客户端的握手操做数量降到最低:第一种是保持客户端长链接,在一个SSL链接发送多个请求,第二种是在并发的链接或者后续的链接中重用SSL会话参数,这样能够避免SSL握手的操做。会话缓存用于保存SSL会话,这些缓存在工做进程间共享,可使用ssl_session_cache指令进行配置。1M缓存能够存放大约4000个会话。默认的缓存超时是5分钟,可使用ssl_session_timeout加大它。下面是一个针对4核系统的配置优化的例子,使用10M的共享会话缓存:app

worker_processes  4;

http {
    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;

    server {
        listen              443;
        server_name         www.example.com;
        keepalive_timeout   70;

        ssl                 on;
        ssl_certificate     www.example.com.crt;
        ssl_certificate_key www.example.com.key;
        ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;
        ...