Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Win32中验证SSL证书的正确方法是什么? 我想用C++验证Win32中的SSL证书。我想我想使用Cert*API,这样我就可以从Windows证书库中获益。这就是我想到的 对吗 有更好的方法吗 我做错什么了吗 bool-isvalidslcertificate(PCCERT\u上下文证书,LPWSTR-serverName) { LPTSTR用法[]={szOID\u PKIX\u KP\u SERVER\u AUTH}; CERT_CHAIN_PARA params={sizeof(params)}; params.RequestedUsage.dwType=用法匹配类型和; params.RequestedUsage.Usage.cUsageIdentifier=\u countof(usages); params.RequestedUsage.Usage.rgpszUsageIdentifier=usages; PCCERT_CHAIN_CONTEXT chainContext=0; 如果(!CertGetCertificateChain(NULL, 证明书 无效的 无效的 ¶ms, 证书链、撤销、检查链、, 无效的 &链接(上下文) { 返回false; } SSL_额外_证书_链_策略_PARA sslPolicy={sizeof(sslPolicy)}; sslPolicy.dwAuthType=AUTHTYPE\u服务器; sslPolicy.pwszServerName=serverName; CERT_CHAIN_POLICY_PARA POLICY={sizeof(POLICY)}; policy.pvextralpolicypara=&sslPolicy; 证书链策略状态={sizeof(STATUS)}; BOOL verified=CertVerifyCertificateChainPolicy(证书链策略), 联系上下文, &政策,, &地位); CertFreeCertificateChain(链接上下文); 返回已验证的&status.dwError==0; }_C++_Windows_Winapi_Ssl_Ssl Certificate - Fatal编程技术网

什么';在Win32中验证SSL证书的正确方法是什么? 我想用C++验证Win32中的SSL证书。我想我想使用Cert*API,这样我就可以从Windows证书库中获益。这就是我想到的 对吗 有更好的方法吗 我做错什么了吗 bool-isvalidslcertificate(PCCERT\u上下文证书,LPWSTR-serverName) { LPTSTR用法[]={szOID\u PKIX\u KP\u SERVER\u AUTH}; CERT_CHAIN_PARA params={sizeof(params)}; params.RequestedUsage.dwType=用法匹配类型和; params.RequestedUsage.Usage.cUsageIdentifier=\u countof(usages); params.RequestedUsage.Usage.rgpszUsageIdentifier=usages; PCCERT_CHAIN_CONTEXT chainContext=0; 如果(!CertGetCertificateChain(NULL, 证明书 无效的 无效的 ¶ms, 证书链、撤销、检查链、, 无效的 &链接(上下文) { 返回false; } SSL_额外_证书_链_策略_PARA sslPolicy={sizeof(sslPolicy)}; sslPolicy.dwAuthType=AUTHTYPE\u服务器; sslPolicy.pwszServerName=serverName; CERT_CHAIN_POLICY_PARA POLICY={sizeof(POLICY)}; policy.pvextralpolicypara=&sslPolicy; 证书链策略状态={sizeof(STATUS)}; BOOL verified=CertVerifyCertificateChainPolicy(证书链策略), 联系上下文, &政策,, &地位); CertFreeCertificateChain(链接上下文); 返回已验证的&status.dwError==0; }

什么';在Win32中验证SSL证书的正确方法是什么? 我想用C++验证Win32中的SSL证书。我想我想使用Cert*API,这样我就可以从Windows证书库中获益。这就是我想到的 对吗 有更好的方法吗 我做错什么了吗 bool-isvalidslcertificate(PCCERT\u上下文证书,LPWSTR-serverName) { LPTSTR用法[]={szOID\u PKIX\u KP\u SERVER\u AUTH}; CERT_CHAIN_PARA params={sizeof(params)}; params.RequestedUsage.dwType=用法匹配类型和; params.RequestedUsage.Usage.cUsageIdentifier=\u countof(usages); params.RequestedUsage.Usage.rgpszUsageIdentifier=usages; PCCERT_CHAIN_CONTEXT chainContext=0; 如果(!CertGetCertificateChain(NULL, 证明书 无效的 无效的 ¶ms, 证书链、撤销、检查链、, 无效的 &链接(上下文) { 返回false; } SSL_额外_证书_链_策略_PARA sslPolicy={sizeof(sslPolicy)}; sslPolicy.dwAuthType=AUTHTYPE\u服务器; sslPolicy.pwszServerName=serverName; CERT_CHAIN_POLICY_PARA POLICY={sizeof(POLICY)}; policy.pvextralpolicypara=&sslPolicy; 证书链策略状态={sizeof(STATUS)}; BOOL verified=CertVerifyCertificateChainPolicy(证书链策略), 联系上下文, &政策,, &地位); CertFreeCertificateChain(链接上下文); 返回已验证的&status.dwError==0; },c++,windows,winapi,ssl,ssl-certificate,C++,Windows,Winapi,Ssl,Ssl Certificate,我认为最好的答案取决于你到底想做什么 我要提醒您,SSL基于两个端点都需要安全连接的假设。如果任一端点对维护安全性不感兴趣,那么就没有安全性 在分布式代码中放入字节码是一项很简单的工作,它只会为这个函数返回true。这就是windows将大量验证移到内核中的原因。但是他们没有预料到有人会在虚拟硬件上运行windows,这使得绕过操作系统也变得微不足道 现在考虑你希望从某个来源提供证书,但是假装那个来源不能从可靠的来源提供相同的信息。然后把它交给你。因此,你不能依靠证书来“证明”任何人是某个特定的

我认为最好的答案取决于你到底想做什么

我要提醒您,SSL基于两个端点都需要安全连接的假设。如果任一端点对维护安全性不感兴趣,那么就没有安全性

在分布式代码中放入字节码是一项很简单的工作,它只会为这个函数返回true。这就是windows将大量验证移到内核中的原因。但是他们没有预料到有人会在虚拟硬件上运行windows,这使得绕过操作系统也变得微不足道

现在考虑你希望从某个来源提供证书,但是假装那个来源不能从可靠的来源提供相同的信息。然后把它交给你。因此,你不能依靠证书来“证明”任何人是某个特定的人

从证书中获得的唯一保护是防止外部人员(而不是端点)破坏正在传输的消息的机密性

任何其他用途都注定要失败,最终也会失败,并带来潜在的灾难性后果

很抱歉发了这么大的邮件。注释部分有字数限制

你应该意识到和。两者都描述了验证证书路径的算法。尽管Win32 API为您解决了一些问题,但了解整个流程仍然很有价值

另外,这里有一个(在我看来)非常值得信赖的参考:

总的来说,我认为你的代码没有错。但如果我是你,我会调查/改变以下几件事:

1.单独的通用名称验证 Chromium独立于链验证证书公共名称。显然他们已经注意到了一些问题。有关其理由,请参见评论:

cert_verify_proc.win.cc:731 // Certificate name validation happens separately, later, using an internal
cert_verify_proc.win.cc:732 // routine that has better support for RFC 6125 name matching.
2.使用证书\u链\u撤销\u检查\u链\u排除\u根 Chromium还使用证书链撤销检查排除根标志代替证书链撤销检查根标志。事实上,在我找到他们的代码之前,我就开始研究这个问题,这强化了我的信念,即应该使用CERT\u CHAIN\u REVOCATION\u CHECK\u CHAIN\u EXCLUDE\u ROOT

尽管前面提到的两个RFC都指定自签名信任锚点不被视为链的一部分,但CertGetCertificateChain()的文档表示,它构建了一个链,如果可能的话,该链将指向一个受信任的根证书。受信任的根证书(在同一页上)定义为受信任的自签名证书

这消除了*EXCLUDE_ROOT可能跳过对非根信任锚的撤销检查的可能性(Win32实际上要求信任锚是自签名的,即使任何RFC都不需要它。尽管这没有正式的文档记录)

现在,由于根CA证书不能自行撤销(CRL不能被签名/验证),在我看来这两个标志是相同的

我在谷歌上搜索了一下,偶然发现了这个论坛帖子:。NET产品组的一名成员(据推测)声称,如果根是自签名的,那么实际上标志的作用是相同的(理论上,如果根证书包含CDP扩展,则整个_链标志将检查根证书的吊销情况,但这不可能发生)

他还建议使用*EXCLUDE_ROOT标志,因为如果自签名根CA包含CDP扩展,则另一个标志可能会导致不必要的网络请求

不幸的是:

  • 我找不到任何官方文件对这两个标志之间的差异进行解释
  • 尽管链接的讨论很可能适用于.NET下的相同Win32 API标志,但不能保证
为了完全确定可以使用CERT\u CHAIN\u REVOCATION\u CHECK\u CHAIN\u EXCLUDE\u ROOT,我在谷歌上搜索了更多信息,并在回复顶部找到了链接到的Chromium SSL证书验证代码

作为额外的好处,Chromium cert\u verify\u proc\u win.cc文件包含以下提示
618: // IE passes a non-NULL pTime argument that specifies the current system
619: // time.  IE passes CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT as the
620: // chain_flags argument.
szOID_PKIX_KP_SERVER_AUTH,
szOID_SERVER_GATED_CRYPTO,
szOID_SGC_NETSCAPE