Nginx 单IP下 配置多个server https 启示录

来源:互联网 发布:淘宝联盟怎么设置佣金 编辑:程序博客网 时间:2024/06/07 21:44

今天重新整合https时,出现在浏览器用  htttp能访问  https访问不了的情况

nginx的配置如下:

    #其他服务匹配

    server {
        listen       4080;
listen       443 ssl;
        server_name  a.szy.net;
        charset utf-8;


#ssl_certificate      E:/https/113152522630995.pem;
  #ssl_certificate_key  E:/https/113152522630995.key;
ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

...

   }

      #授权服务匹配

      server {
   listen   80;
   server_name login.dev.51110.com;
   
     listen 443 ssl;
     ssl_certificate      ca/uc_oauth.crt;
   ssl_certificate_key  ca/uc_oauth.key.unsecure;

...   

}


绕了一圈才想到去看错误日志:

2017/05/25 14:24:49 [error] 5992#11288: *13 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 172.16.52.100, server: 0.0.0.0:443
2017/05/25 14:24:49 [error] 5992#11288: *14 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 172.16.52.100, server: 0.0.0.0:443

果然,一堆的没有找到证书的错误,但是在上述的配置明明已经设定了ca证书,

那是ca证书被删除了吗?ca证书路径错误?都不是...

没辙了,那就开始找度娘,刚好找到   Nginx 单IP下 配置多个server https 的问题


找到了我想要的答案:ssl的匹配   先于   server的匹配


原文:

事实上,SSL运行在TCP之上(SSL/TLS协议),ssl通过四次握手 和服务器(这里是Nginx,LVS纯转发,可忽略)的IP + PORT(443)建立ssl连接,建立连接之后浏览器才会发送HTTP请求。所以在Nginx收到HTTP请求之后才知道Host,才知道转到哪个server 去处理,所以在SSL连接建立的时候Nginx是不知道用哪个 Server 的SSL配置的,在这种情况下,Nginx会使用它加载到的第一个SSL配置(需验证)。当然如果你在listen 443的后面加上 default_server,Nginx就会使用此SSL配置,即:

listen 443 default_server ssl;

那么对于单域名的https,我更喜欢把SSL配置写在http配置里,在server只需要加上 listen 443 ssl;


虽然里面碰到的问题和我的不大一样,但是里面阐述的  nginx  的 ssl协议请求过程  却让我意识到问题所在

因为我本地的nginx配置文件是从连调环境拷贝过来的,配置中本身有多个开启了  ssl的server,   

出于偷懒没有拷贝对应的ca证书,只保留了我想要的那份,结果在使用http访问时一切正常,但是当用https访问时,

需要先建立ssl链接,需要要到ca证书,而在没有 配置   “listen 443 default_server ssl;” 时,默认去找了第一个

server的 ca证书,很不巧又被我给注释了,于是就一直出现找不到ca证书的错误提示


以上:

日志要善用,有问题先看有没有错误日志,在平常的代码书写过程中也要有完善的日志输出,方便定位问题