Nginx多SSL配置不生效问题

首先看下SSL的配置:
首先生成私钥文件

openssl genrsa -des3 -out ssl.key 1024

然后他会要求你输入这个key文件的密码。不推荐输入。因为以后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的。
由于生成时候必须输入密码。你可以输入后 再删掉。

mv ssl.key xxx.key
openssl rsa -in xxx.key -out ssl.key
rm xxx.key

然后根据这个key文件生成证书请求文件,CSR是一个证书签名请求,是客户的服务器软件所生成的一串文本字符。服务器在向CA注册的过程中首先要在WEB服务器上生成CSR,并把这串字符提供给证书认证中心。
openssl req -new -key ssl.key -out ssl.csr
最后根据这2个文件生成crt证书文件
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
最后使用到的文件是key和crt文件。

然后修改Nginx配置

    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      ssl.crt;
        ssl_certificate_key  ssl.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv3;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

首次配置需要重启nginx,reload不生效。
这里比较重要的配置是:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv3;
ssl_ciphers HIGH:!aNULL:!MD5;

今天运维同事反馈XP系统IE6不能正常访问Https站点的问题。
低版本的IE默认配置是SSLv2和SSLv3。

抓包先看了下,握手失败。

然后用nmap跑了下证书支持的加密套件:

[root@server120 ]# nmap --script ssl-enum-ciphers -p 443 chinaacc.com

Starting Nmap 6.47 ( http://nmap.org ) at 2017-09-01 10:34 CST
Nmap scan report for chinaacc.com (59.151.113.79)
Host is up (0.034s latency).
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   SSLv3: No supported ciphers found

发现站点不支持SSLv3。
然后看了下SSL配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
发现没有配置SSLv3
修改配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv3;
然后用nmap扫描了下发现还是不行,配置没有生效。
后来发现与之前遇到的问题差不多

SSL证书返回错误问题排查

如果一个反向代理Nginx上配置了多个https域名的话,默认会走第一个的SSL配置。
例如我的配置如下:

    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      xx.crt;
        ssl_certificate_key  xx.key;
        ssl_protocols TLSv1;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

    server {
        listen       443 ssl;
        server_name  192.168.192.120;

        ssl_certificate      xx.crt;
        ssl_certificate_key  xx.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

第一个server配置ssl_protocols TLSv1;
第二个server配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
然后用nmap测试一下

[root@server144 ~]# nmap --script ssl-enum-ciphers -p 443 192.168.192.120

Starting Nmap 5.51 ( http://nmap.org ) at 2017-09-01 16:35 CST
Nmap scan report for localhost (192.168.192.120)
Host is up (0.00066s latency).
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.0
|     Ciphers (13)
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA
|       TLS_RSA_WITH_AES_128_CBC_SHA
|       TLS_RSA_WITH_AES_256_CBC_SHA
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
|     Compressors (1)
|_      uncompressed
MAC Address: 52:54:00:26:BE:A2 (QEMU Virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 91.34 seconds

可以看到只支持TLSv1,走的是第一个ssl_protocols的配置。

解决方案:
修改第一个SSL配置中

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv3;