ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

记一次nginx部署https访问出现证书链不全的问题

2021-08-22 20:03:21  阅读:215  来源: 互联网

标签:ssl 证书 链不全 nginx ----- proxy https cer


前情提要:

  现在这个环境下,公司的项目基本上都是要求用https访问的,不然后续安全检测过不去,以前项目一开始用的http,后面转成https,一改各种问题出现,web端app端还好说,重新发包,改下接口调用地址的事情,最麻烦的是那些自助终端,以及各种需要调我们服务的第三方也得改,七改八改的总会有遗漏的地方,这次项目正好从头开始(其实已经两个月了),干脆一开始就配置成https访问了。

  和别的项目一样,这边的后台还是我搭一个nginx来进行软负载,并且映射到外网提供接口服务,不同的是,其他项目客户那边都早已经申请过https的证书,我提出来要过来配置一下就行了,而这边项目,说是app之前已经运行几年了(原app公司不维护了,我们过来重新开发app去替代他们的),结果并没有申请过ssl证书,然后这边客户方的人员对应证书这块也是都不懂,我也不懂,大家都摸石头过河,临时采购证书,然后我找客户要证书时,给我甩了一坨。。。。以前项目基本上就给一个key和pfx啥的,搞得我也挺懵的,硬着头皮瞎配,各种报错各种百度,发现是key和cer、crt啥的反正就是对不上,不是一对,这里推荐一个网站  https://www.myssl.cn/tools/check-crtkey.html  可以直接进行匹配校验(虽然那会儿我是百度的什么命令去校验的)。

  总之,可算是成功配上去了,也测试过,能用https访问对应地址下的图片文件,接口请求了,本来到此基本上告一段落了,结果要和第三方对接嘛,我提供的地址肯定也是配好后的https地址,那边反馈说接口无法调用,经百度说是什么证书链不完整的问题,这我可没遇到过呀,虽然理论上说他们那边配个什么过滤好像就可以了,但是我感觉这个问题应该是可以解决的,而且问题应该在我这边,配置好后更省事,不然对个第三方就得处理一遍。

处理过程:

  1.首先,找出配对的key文件和cer或crt文件,配置进nginx配置,使对应地址可以https进行访问(这个比较简单,网上说明很多,反正最终配置的主体部分大概如下)

 1   #后台地址
 2     upstream serv{
 3       server xx.xxx.xxA:8080 max_fails=3 weight=1 fail_timeout=60s;
 4       server xx.xxx.xxB:8080 max_fails=3 weight=1 fail_timeout=60s;
 5       ip_hash;
 6     }
 7     
 8     #https访问
 9     server {
10         listen       10086;      #http访问端口
11         listen       443 ssl;     #https访问端口
12         server_name  xx.xxx.cn;
13         
14         ssl_certificate     /usr/local/nginx/cert/_.xxx.com.cer;  #ssl证书cer
15         ssl_certificate_key /usr/local/nginx/cert/_.xxx.com.key;  #ssl证书key
16         ssl_session_timeout 5m;
17         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
18         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
19         ssl_prefer_server_ciphers on;
20         
21         access_log  logs/xxx_access.log;
22         error_log logs/xxx_error.log;
23         
24         #后台接口
25         location /serv {28            proxy_read_timeout      300;
29            proxy_connect_timeout   300;
30            proxy_redirect          off;
31            proxy_set_header    Host                $http_host;
32            proxy_set_header    X-Real-IP           $remote_addr;
33            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
34            proxy_set_header    X-Forwarded-Proto   $scheme;
35            proxy_set_header    X-Frame-Options     SAMEORIGIN;
36            proxy_pass http://serv/;
37         }
38 
39         #ftp配置
40         location /ftp{
41             proxy_pass http://xxx.xx.xx:port/files;
42             proxy_set_header           Host $host;
43             proxy_set_header  X-Real-IP  $remote_addr;
44             proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
45             client_max_body_size  100m;
46             root   html;
47             index  index.html index.htm;
48         }
49 
50         error_page   500 502 503 504  /50x.html;
51         location = /50x.html {
52             root   html;
53         }
54     }

  2.然后,这时候,用代码调用对应域名地址时,会报错,经百度查询说明就是证书链不完整,这里推荐这个网址  https://myssl.com/  ,在这个网站中输入你配好的域名,它会进行检测,告知各项问题,包括证书不完整这一项,最重要的是,这个网站最后还会告知如何处理,并有超链接点击就可以直接跳转(这里我是想截图的,但是又不好临时又把域名搞成之前的状态,人家第三方都已经上生产发布了),比如我的证书链不完整,就是跳转后直接帮你补全,就是直接将原cer的内容输入以后,它能给你生成另外的中间证书,复制回原cer文件内即可,大致结果如下:

原本的cer文件内容:

-----BEGIN CERTIFICATE-----
原证书内容
-----END CERTIFICATE-----

补全后的cer文件内容:

-----BEGIN CERTIFICATE-----
原证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
中间证书内容
-----END CERTIFICATE-----

   3.将完成补全后的cer文件覆盖回去,放到服务器上就可以了


  虽然最后是把问题解决了,其实百度上关于这个证书链不完整的处理,帖子还是挺多的,比如也有说用  https://certificatechain.io/  这个网站进行补全证书的,我也不知道为什么我用起来不行,大概率原因在于我当时找的cer文件不对?或者是补全的方式不对,因为我记得当时尝试用这个补全的时候,提示我“This is not a valid certificate”,然后我换了别的证书丢进去(客户给了我一坨证书,都不知道该用哪个),最后补出来除了中间证书,还有根证书啥的,反正最后我是没用起来。

  这个问题当天处理了也有三五个小时,感觉处理这么久,最大的原因之一就是对于证书方面还是不懂,然后第二大原因就是客户给一坨证书,我都不知道哪个才是对的,单单找配对的证书和密钥都费劲

标签:ssl,证书,链不全,nginx,-----,proxy,https,cer
来源: https://www.cnblogs.com/lilh/p/15134221.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有