今天重新整合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 {}
绕了一圈才想到去看错误日志:
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证书的错误提示
以上:
日志要善用,有问题先看有没有错误日志,在平常的代码书写过程中也要有完善的日志输出,方便定位问题