德尔福印验证服务器SSL证书(Delphi Indy verify server certifica

2019-08-03 05:48发布

我已经走遍了互联网,并没有发现有关如何使用TIdHTTP通过HTTPS连接时验证证书的解决方案或方法。

我已经迷上了一个IdSSLIOHandlerSocketOpenSSL成分为IOHandler,设置SSLModes等,但是当我浏览到https://s3.amazonaws.com它无法验证证书。

OpenSSL的(印)给出

“错误连接使用SSL SSL3_GET_SERVER_CERTIFICATE:证书验证失败”

OpenSSL库已成功加载(与WhichFailedToLoad选中)。 该OnStatusInfo事​​件写入以下内容:

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

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

SSL状态“的SSLv2 / v3的写客户端问候A”

SSL状态:“读SSLv3的服务器问候A”

SSL状态:“SSLv3的读取服务器证书B”

SSL状态:“SSLv3的读取服务器证书B”

SSL状态:“SSLv3的读取服务器证书B”

和OnVerifyPeer,AOK = FALSE。

我怎样才能得到它正确验证。 这是怎么回事?

感谢您的阅读,阿德里安

Answer 1:

你要实现你的TIdSSLIOHandlerSocketOpenSSL组件的OnVerifyPeer事件的事件处理程序。

从IdSSLOpenSSL.pas:

需要注意的是,你真的应该始终贯彻OnVerifyPeer,你要连接到不检查,以确保它是有效的对等的,否则证书。

如果你只是要考虑有效的图书馆也考虑有效同一证书,你就必须实现它是这样的:

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

至于证书的有效性印首先检查,并通过你,如果它是好还是不在AOK参数。 最后一个词是在你的代码,你可能想放过某些类型的轻微验证错误的,就像是过时的,甚至询问用户是否证书中的任何错误的情况下接受或不(轻微或没有) 。

要理解为什么是这样工作的,你可能也想读在IdSSLOpenSSL.pas文件的顶部所有评论:

{

重要信息有关OnVerifyPeer:2005年2月的版本1.39有意打破OnVerifyPeer接口,(明显?)只会影响实施了回调作为SSL协商的一部分计划。 需要注意的是,你真的应该始终贯彻OnVerifyPeer,你要连接到不检查,以确保它是有效的对等的,否则证书。

在此之前,如果SSL库检测到问题与证书或深度不足(即VerifyCallback“确定”参数为0 / FALSE),那么无论你OnVerifyPeer是否返回真或假,SSL连接将是故意失败。

这是创造了一个问题,即使是只有在链中的证书之一,其用户可能会很乐意接受(OnVerifyPeer是在证书链中的每个证书调用一次),SSL协商一个很小的问题将失败。 然而,改变代码以允许SSL连接,当用户返回真为OnVerifyPeer将意味着其依赖于自动拒绝无效证书的存在的代码将随后被接受无效的证书,这将是不可接受的安全性改变。

因此,OnVerifyPeer改变通过加入AOK参数故意破坏现有的代码。 要保留以前的功能,您OnVerifyPeer事件应该做的“结果:= AOK;”。 如果要考虑的是,SSL库已认为是无效的,那么在你的OnVerifyPeer接受证书,请确保您满足自己的证书确实是有效的,然后将结果为True。 在现实中,除了检查AOK,你应该始终贯彻执行,确保你只接受这是有效的(至少从您的角度来看)证书代码。

夏兰Costelloe,ccostelloe [_a_t_] flogas.ie

}

{

RLebeau 1/12/2011:打破OnVerifyPeer事件,这一次增加一个额外的AERROR参数(的“jvlad”,dmda@yandex.ru补丁提供)。 这有助于自签署和无效的证书之间的用户代码distinquish。

}



Answer 2:

我知道这是一个古老的职位,但它是所有我能找到解决这个问题。 所以,我想补充马库斯的回答为其他有同样的问题:当OpenSSL的无法找到PC上的根证书,AERROR将返回#19(X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN)和AOK将根证书假。 当您手动从文件加载根证书,AOK应该总是返回真值(和你已经取得某种证书钉扎过):

FSSLIOHandlerSocketOpenSSL.SSLOptions.RootCertFile = 'MyRoot.cer';



Answer 3:

如果你得到一个错误SSL3_GET_SERVER_CERTIFICATE:certificate verify failed ,那么请继续阅读:

它似乎在印第安纳波利斯10,如果你设置了VerifyDepth0时, 0实际上意味着all



文章来源: Delphi Indy verify server certificate SSL
标签: delphi ssl indy