簡體   English   中英

Delphi Indy驗證服務器證書SSL

[英]Delphi Indy verify server certificate SSL

我已經瀏覽了互聯網,但在使用TIdHTTP通過HTTPS連接時,沒有找到關於如何驗證證書的解決方案或方法。

我已經將IdSSLIOHandlerSocketOpenSSL組件連接為IOHandler,設置SSLModes等,但是當我瀏覽到https://s3.amazonaws.com時,它無法驗證證書。

OpenSSL(Indy)給出

“使用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。

我怎樣才能讓它正確驗證。 這是怎么回事?

感謝閱讀,阿德里安

您必須為TIdSSLIOHandlerSocketOpenSSL組件的OnVerifyPeer事件實現事件處理程序。

來自IdSSLOpenSSL.pas:

請注意,您確實應該始終實現OnVerifyPeer,否則不會檢查您要連接的對等方的證書以確保它是有效的。

如果您只想考慮庫認為有效的相同證書,您只需要以這種方式實現它:

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

因為Indy首先檢查證書的有效性,如果在AOk參數中是否正常則通過。 最后一個詞是在你的代碼中,因為你可能想要傳遞某些類型的小驗證錯誤 ,比如過時,或者甚至詢問用戶是否接受證書是否有任何錯誤(次要或不是) 。

要了解它為何如此工作,您可能還想閱讀IdSSLOpenSSL.pas文件頂部的所有注釋:

{

有關OnVerifyPeer的重要信息:2005年2月的Rev 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庫認為無效的證書,那么在您的OnVerifyPeer中,確保您確信證書確實有效,然后將Result設置為True。 實際上,除了檢查AOk之外,您應該始終實現代碼,以確保您只接受有效的證書(至少從您的角度來看)。

Ciatel Costelloe,ccostelloe [_a_t_] flogas.ie

}

{

RLebeau 2011年1月12日:再次打破OnVerifyPeer事件,這次添加一個額外的AError參數(補丁由“jvlad”提供,dmda @ yandex.ru)。 這有助於用戶代碼區分自簽名證書和無效證書。

}

我知道這是一個古老的帖子,但我能找到解決問題的全部內容。 所以我想在其他人遇到同樣問題時添加Marcus的答案:當OpenSSL在PC上找不到根證書時,AError將返回#19(X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN),並且根證書的AOK將為false。 當您從文件手動加載根證書時,AOK應該始終返回true(並且您已經實現了某種類型的證書固定):

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

如果您收到類似SSL3_GET_SERVER_CERTIFICATE:certificate verify failed的錯誤SSL3_GET_SERVER_CERTIFICATE:certificate verify failed ,請繼續閱讀:

在Indy 10中,如果將VerifyDepth設置為0 ,則0實際上意味着all

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM