SSL客户为什么报告谷歌的证书“自签名”?

2021-04-12 23:37:26

在以前的帖子中,我实现了一个简单的HTTPS客户端,但程序有一个小缺陷,即连接到“www.google.com:443”时,它将在验证证书中报告以下错误:错误代码是18:自签名证书错误代码来自ssl_get_verify_result:long ssl_get_verify_result(const ssl * ssl){return ssl-> verify_result; 18映射到x509_v_err_depth_zero_self_signed_cert,这意味着“自签名证书”。但对于其他网站,例如,Facebook.com,没有输出错误。使用openssl的client-arg程序测试:#ld_library_path = / root / openssl / build gdb --args ./client-arg -connect“www.google.com:443”......线程2命中断点1, main(argc = 3,argv = 0xfffffcfc7fffdf4c38)在client-arg.c:99 99 Bio_puts(SBIO,“get / http / 1.0 \ n \ n”); (gdb)p ssl-> verical_result $ 1 = 18(gdb)相同的错误代码:18。但openssl-s_client可以保证证书不是“自签名”:#ld_library_path = / root / openssl / build openssl s_client -connect Google.com:443已连接(00000004)深度= 2 OU = Globalsign Root Ca - R2,O = GlobalSign,CN = GlobalSign验证返回:1深度= 1 C = US,O = Google Trust Services,CN = GTS CA 1O1验证返回:1深度= 0 C = US,ST =加利福尼亚州,L =山景,o = Google LLC,CN = * .Google.com验证返回:1 ---证书链0 S:C = US,ST =加利福尼亚州,L =山景,o = Google LLC,CN = * .Google.com I:C = US,O = Google Trust服务,CN = GTS CA 1O1 1 S:C = US,O = Google Trust Services,CN = GTS CA 1O1 I:OU = Globalsign Root Ca - R2,O = Globalsign,CN = Globalsign - ...... HMM,我需要找到根本原因。首先,我搜索了代码,看看x509_v_err_depth_zero_self_signed_cert and any spect:if(self_signed)respender verify_cb_cert(ctx,null,num - 1,sk_x509_num(ctx->链)== 1?x509_v_err_depth_zero_self_signed_cert:x509_v_err_self_signed_cert_in_chain );有趣的是链中的证书量只有1,但从openssl-s_client的输出中,链中有2个证书。好的,让我们看看这个“自签名”证书的内容。在一些调试之后,我终于找到了tls_process_server_certificate,它用于处理服务器的证书。在GDB的帮助下,我可以转储证书的内容:#gdb --args ./client www.google.com:443 .......(gdb)b tls_process_server_certificate ......线程2命中断点1,tls_process_server_certificate(s = 0xf09e90,pkt = 0xfffffc7fffdefe30)at ../ssl/statem/statem_clnt.c:1768 1768 x 509 * x = null; ...... 1806如果(certbytes!=(certstart + cert_len)){(gdb)1811 if(ssl_is_tls13){(gdb)转储二进制内存certstreart certstart + cert_len ......尝试检查证书文件:#cat cert ......�0�*�h��(没有提供SNI;请修复您的客户端.10uinvalid2.invalid0�“0��bo����.....原因是显而易见的:“没有提供SNI;请修复您的客户。”。啊,我需要明确设置SNI。调用SSL_SET_TLSEXT_HOST_NAME后,证书链可以在此处下载)。摘要:我不是SSL / TLS专家和OpenSSL项目很复杂,令人生畏。但是,对于一些基本的SSL / TLS知识和调试器的帮助,我可以独立找到问题的根本原因。不要放弃,摘要,逐个摘要代码最后你会赢!