当前位置: 首页 > 知识库问答 >
问题:

Delphi Indy验证服务器证书SSL

侯池暝
2023-03-14

我浏览了互联网,还没有找到一个解决方案或方法来验证证书时,通过HTTPS连接使用TIDWTTP。

我已经连接了一个idsslohandlersocketopenssl组件作为IOHandler,设置SSLModes,等等html" target="_blank">https://s3.amazonaws.com它无法验证证书。

OpenSSL(Indy)提供

“连接SSL时出错。SSL3\u获取\u服务器\u证书:证书验证失败”

OpenSSL库已成功加载(已使用WhichFailedToLoad进行检查)。OnStatusInfo事件写入以下内容:

SSL状态:“在/连接初始化之前”

SSL状态:“在/连接初始化之前”

SSL状态:“SSLv2/v3写入客户端hello A”

SSL状态:“SSLv3读取服务器hello A”

SSL状态:"SSLv3读取服务器证书B"

SSL状态:"SSLv3读取服务器证书B"

SSL状态:"SSLv3读取服务器证书B"

而OnVerifyPeer,AOk=False。

如何使其正确验证。发生什么事?

谢谢你的阅读,阿德里安

共有3个答案

钱远
2023-03-14

如果您遇到类似SSL3_GET_SERVER_CERTIFICATE:证书验证失败这样的错误,请继续阅读:

在Indy 10中,如果设置0VerifyDepth,则0实际上意味着all

封弘伟
2023-03-14

我知道这是一个古老的帖子,但这是我所能找到的解决问题的方法。因此,我想为其他有同样问题的人补充Marcus的答案:当OpenSSL在PC上找不到根证书时,Aeror将返回#19(X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN),根证书的AOK将为false。当您从文件手动加载根证书时,AOK应始终返回true(并且您也实现了某种类型的证书固定):

FSSLIOHandlerSocketOpenSSL。发展。RootCertFile:='我的根。cer';

邵博远
2023-03-14

您必须为TIdSSLIOHandlerSocketOpenSSL组件的OnVerifyPeer事件实现事件处理程序。

来自IdSSLOpenSSL。考绩制度:

请注意,您真的应该始终实现OnVerifyPeer,否则不会检查您连接到的对等体的证书以确保其有效。

如果您只想考虑与库所认为的同样有效的证书,则只需以这种方式实现:

function TForm1.IdSSLIOHandlerSocketOpenSSL1VerifyPeer(Certificate: TIdX509;
  AOk: Boolean; ADepth, AError: Integer): Boolean;
begin
  Result := AOk;
end;

As Indy首先检查证书的有效性,如果AOk参数中的证书正确与否,则传递给您。最后一个字是在代码中,因为您可能希望传递一些小的验证错误,例如过期,或者甚至在出现任何错误(小错误或不错误)时询问用户证书是否被接受。

要理解为什么它是这样工作的,您可能还需要阅读IdSSLOpenSSL. pas文件顶部的所有注释:

{

关于OnVerifyPeer的重要信息:2005年2月的1.39版故意破坏了OnVerifyPeer接口,这(显然是?)仅影响作为SSL协商的一部分实现该回调的程序。请注意,您确实应该始终实现OnVerifyPeer,否则不会检查您所连接的对等方的证书以确保其有效。

在此之前,如果SSL库检测到证书存在问题或深度不足(即VerifyCallback中的“Ok”参数为0/FALSE),则无论OnVerifyPeer返回的是True还是FALSE,SSL连接都将故意失败。

这造成了一个问题,即即使链中的一个证书只有一个非常小的问题(对于证书链中的每个证书,OnVerifyPeer只调用一次),用户可能很乐意接受,SSL协商也会失败。但是,当用户为OnVerifyPeer返回True时,更改代码以允许SSL连接意味着依赖于自动拒绝无效证书的现有代码将接受无效证书,这将是不可接受的安全更改。

因此,OnVerifyPeer被更改为通过添加AOk参数故意中断现有代码。为了保留以前的功能,OnVerifyPeer事件应该执行“Result:=AOk;”。如果您希望考虑接受SSL库已被认为无效的证书,那么在OnValuePeer-Poor中,确保您确信证书确实是有效的,然后将结果设置为true。实际上,除了检查AOk之外,您还应该始终实现代码,确保您只接受有效的证书(至少从您的角度来看)。

西亚兰·科斯特洛伊,科斯特洛尔,弗洛加斯。即

}

{

2011年12月1日:再次破坏VerifyPeer事件,这次是为了添加一个额外的AError参数(补丁由“jvlad”提供),dmda@yandex.ru)。这有助于用户代码区分自签名证书和无效证书。

}

 类似资料:
  • 验证 SSH 服务器证书(客户端) 和 SSH 用户证书 类似,使用客户端机构认证来验证主机。需要一个 SSH 服务器数字证书认证机构签发服务器证书,客户端只需要保存 CA 的公钥。 使用一台处于气隙系统下的计算机来生成服务器数字证书认证机构的根证书: ❯ ssh-keygen -C "SSH Server Certificate Authority" -f sshserver.root.ca 使

  • 我们的应用程序可以使用Active Directory用户和组。我们在端口389上使用LDAP进行Active Directory操作。现在,我们的一个客户机希望我们添加一个使用LDAP+SSL进行Active Directory通信的选项。 他们告诉我们,他们在域上安装了一个本地CA,并对LDAP使用自签名证书。他们还告诉我们,他们会提供证书,不需要相互信任,我们应该使用Windows证书存储。

  • 附加内容 How I’ve set up SSH keys on my Yubikey 4 (so far) How to Harden SSH with Identities and Certificates Scalable and secure access with SSH

  • 使用用户证书验证 SSH (服务端) 在以安全为前提下要保障可靠性、可控性和一致性是非常复杂的。我们可以利用 SSH 又或者说 OpenSSH 来替代所依赖的中央身份验证(比如 LDAP 或者 Kerberos) 除了 通过 PIV 和 PKCS#11 验证 SSH 之外,还可以增加远程 SSH 验证的安全性。Facebook 和 Yahoo 已经更换使用 SSH 用户证书来避免中心认证系统宕机。

  • 我正在尝试使用SoundCloud SDK进行用户身份验证。用户单击“登录”后我的第一条路线: 然后我有下一条路线,它们被重定向: 我可以成功点击重定向url并返回代码,但我从Sinatra收到以下错误: OpenSSL::SSL::SSL中/signed_处的SSLError\u connect返回=1 errno=0 state=SSLv3读取服务器证书B:证书验证失败 我读过以下流行文章:h