2012-11-27 39 views
5

İnternette araştırma yaptım ve TIdHTTP kullanarak HTTPS üzerinden bağlanırken sertifikanın nasıl doğrulanacağı konusunda bir çözüm veya yöntem bulamadım.Delphi Indy sunucu sertifikasını doğrulayın SSL

IOHandler olarak bir IdSSLIOHandlerSocketOpenSSL bileşenini bağladım, SSLMode'ları vb. Ayarlayın, ancak https://s3.amazonaws.com'a göz attığımda sertifikayı doğrulayamıyor.

OpenSSL kütüphaneleri başarıyla yüklendi (WhichFailedToLoad ile işaretli) adres:

OpenSSL (Indy)

"Sertifika doğrulama başarısız SSL SSL3_GET_SERVER_CERTIFICATE ile bağlantı hatası" veriyor.

SSL durumunu: OnStatusInfo olay şu yazıyor

SSL durumunu "/ önce başlatma bağlamak": "başlatma/önce bağlamak"

SSL durumunu: "SSLv2/v3 yazma istemci merhaba Bir"

SSL durumu:

SSL durumunu "SSLv3 merhaba bir sunucu okuma":

SSL s "SSLv3 sunucu sertifikası B oku" URUMU:

Ve OnVerifyPeer, AOK = False "SSLv3 sunucu sertifikası B okuma":

SSL durumu "SSLv3 sunucu sertifikası B oku".

Doğrulamak için nasıl edinebilirim? Neler oluyor? Okumak için

sayesinde Adrian

cevap

7

Sen TIdSSLIOHandlerSocketOpenSSL bileşeninin OnVerifyPeer olayı için bir olay işleyicisi uygulamak zorunda.

itibaren IdSSLOpenSSL.pas:

Not gerçekten her zaman OnVerifyPeer uygulamaları gerektiğini de eş aksi takdirde sertifika geçerliliğinden emin olmak için kontrol DEĞİLDİR bağlanırken bulunmaktadır. sertifika ve pas geçerliliği için Indy ilk çekler gibi

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

: Sadece Kütüphane de geçerli gördüğü aynı sertifikalarını geçerli düşünün isterseniz

, sadece bu şekilde uygulamak zorunda Tamam ise veya AOk parametresinde değilseniz. Son kelime minör doğrulama hatalarını geçmesine izin vermek isteyebileceğinizden, aksi takdirde sertifikanın kabul edilip edilmediğini veya herhangi bir hata durumunda kullanıcıya sorulmasını isteyebileceğinizden (küçük veya değil).

Neden bu şekilde çalıştığını anlamak için, IdSSLOpenSSL'nin en üstündeki tüm yorumları okumak isteyebilirsiniz.pas dosyası:

{

bilgilendirme görevi OnVerifyPeer : Şubat 2005 1.39 kasten OnVerifyPeer arayüzü, (? besbelli) sadece SSL parçası olarak o geri arama uygulanan programları etkiler kırdı Rev müzakere. Gerçekte her zaman OnVerifyPeer uygulamanız gerektiğini unutmayın, aksi takdirde eşinizin bağlandığınız sertifikanın geçerli olduğundan emin olunuz. SSL kütüphanesi bir sertifika bir sorun algıladı ya Derinlik yetersiz olsaydı

Bundan önce, (yani VerifyCallback "Ok" parametredir/YANLIŞ 0), sonra ne olursa olsun OnVerifyPeer iade edip Gerçek veya Yanlış, SSL bağlantısı kasıtlı olarak başarısız olurdu. Kullanıcı olabilir, (sertifika zincirindeki her sertifika için bir kez denir OnVerifyPeer) zincirindeki sertifikaların biriyle sadece çok küçük sorun vardı bile

Bu bunda bir problem yarattı Kabul etmekten mutluluk duyarız, SSL anlaşması başarısız olur. Ancak, bir kullanıcı geçersiz sertifikaların otomatik reddi bağlıydı mevcut kod sonra kabul edilemez bir güvenlik olurdu geçersiz sertifikaları kabul olacağını anlamına gelirdi OnVerifyPeer için Doğru döndü SSL bağlantısı sağlamak için kodu değiştirmeden değişiklik. Sonuç olarak, OnVerifyPeer, bir AOk parametresi ekleyerek mevcut kodu kasten kırmak üzere değiştirildi. Önceki işlevselliği korumak için, OnVerifyPeer olayınız "Sonuç: = AOk;" SSL kitaplığının geçersiz olduğunu kabul ettiği sertifikalarını kabul etmek isterseniz, OnVerifyPeer'inizde , sertifika sahibinin sertifikasının gerçekten geçerli olduğundan emin olun ve Sonucu Doğru olarak ayarlayın. Gerçekte, AOk kontrolüne ek olarak, her zaman geçerli olan (en azından sizin bakış açınızdan) geçerli olan kabul sertifikası sağlayan bir kod uygulamanız gerekir.

Ciaran Costelloe, ccostelloe [_a_t_] flogas.ie

}

{

RLebeau 1/12/2011: Kopma OnVerifyPeer etkinlik, yine bu kez (ek AERROR parametre eklemek için yama "jvlad" nezaket, [email protected]). Bu , kullanıcı kodunun Kendinden imzalı ve geçersiz sertifikaları arasındaki ayrımına yardımcı olur.

}

1

Eğer SSL3_GET_SERVER_CERTIFICATE:certificate verify failed gibi bir hata alırsanız, o zaman okumaya devam:

Size ayarlarsanız 0 bir VerifyDepth, 0 aslında all demektir ki, Indy 10'da görünüyor.Ne yazık ki, Indy yalnızca kök CA'lardan hakkında bilmek gibi görünüyor, bu yüzden sadece kökleri doğrulamak için, aşağıdaki OnVerify yöntemi deneyin: Bu eski bir yazı olduğunu biliyoruz

function TForm1.IdSSLIOHandlerSocketOpenSSL1VerifyPeer(Certificate: TIdX509; 
    AOk: Boolean; ADepth, AError: Integer): Boolean; 
begin 
    if ADepth = 0 then 
    begin 
    Result := AOk; 
    end 
    else 
    begin 
    Result := True; 
    end; 
end; 
+1

Bu yanlış. Indy, varsayılan olarak NO sertifikalarını bilir. Bu sizi MitM saldırılarına karşı savunmasız yapar. Güvenli bir bağlantı için en azından 'VerifyMode', 'VerifyDepth' ve 'RootCertFile' ayarlamalısınız. Bundan sonra, OpenSSL sizin için doğru olan şeyden bu yana herhangi bir derinlik için 'AOk' dönüşü yapabilirsiniz. – TobiX

1

, ama tek bulabildiğim bu problemi çöz. Bu yüzden, Marcus'un aynı sorunla başkalarının cevabını eklemek istiyorum: OpenSSL, kök sertifikaları PC'de bulamadığında, AError # 19 (X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) değerini döndürecek ve AOK Kök sertifikasına göre yanlış olacaktır. Kök sertifikayı el ile dosyadan yüklediğinizde, AOK her zaman doğru olarak dönmelidir (ve sertifika çeşitliliğine de sahip olmalısınız):

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

İlgili konular