2012-12-06 26 views

Odpowiedz

24
  • CURLOPT_SSL_VERIFYPEER sprawdza, czy zdalny certyfikat jest ważny, to znaczy, że można zaufać, że został on wydany przez urząd certyfikacji można zaufać i że jest prawdziwa.

  • CURLOPT_SSL_VERIFYHOST sprawdza, czy certyfikat został wydany podmiotowi, z którym chciałeś rozmawiać.

Aby porównać go do rzeczywistego scenariusza, VERIFYPEER jakby sprawdzając, czy forma ID jest taki, który można rozpoznać (tj paszport z kraju ufasz, karta pracownicy spółki wiesz .. .). VERIFYHOST jest jak sprawdzanie faktycznego nazwiska na karcie, z kim chciałeś rozmawiać.

Jeśli nie używasz VERIFYHOST (poprawna wartość to 2, a nie 1, btw), wyłącza weryfikację nazwy hosta i otwiera drzwi do ataków MITM: każda osoba posiadająca ufundowany przez Ciebie identyfikator może podszywać się pod kogokolwiek w obrębie zestaw zaufanych identyfikatorów, np każdy z ważnym paszportem może udawać, że jest kimkolwiek innym z ważnym paszportem.

+1

Dziękuję za wyczerpującą odpowiedź. To doprowadziło mnie do kolejnych szybkich pytań: mam stronę internetową z ważnym certyfikatem SSL https: //www.example.com (cn = www.example.com tak, jak powinno). Kiedy odwiedzam stronę internetową za pośrednictwem jej adresu IP, to pokaże mi błędy certyfikatu (ponieważ cn nie pasują), usunięcie SSL_VERIFYHOST rozwiąże ją, ale otworzy ją na ataki MiTM. Jakie jest prawidłowe rozwiązanie tego problemu? (zezwól na połączenie przez adres IP BEZ pokazania błędów). Zastąpienie całej metody weryfikacji za pomocą CURLOPT_SSL_CTX_FUNCTION tylko w celu sprawdzenia, czy określony adres IP pasuje do CN? – user1782427

+0

Dlaczego chcesz się połączyć z adresem IP? Czy jest to certyfikat z własnego urzędu certyfikacji (lub samopodpisany)? – Bruno

+0

Mam 2 serwery (1.1.1.1 i 2.2.2.2), DNS na przykład.com zawiera 2 rekordy A (z tych adresów IP). Klient losowo wybiera jeden z nich i łączy się z adresem IP, a nie nazwą hosta. Chciałbym, aby openSSL zadzwonił do mnie, gdy sprawdza pole nazwy wspólnej, aby móc porównać wspólną nazwę certyfikatu z example.com, jeśli jest to w porządku, zaakceptuję certyfikat. Nie widziałem, że libcurl obsługuje to, więc zakładam, że muszę napisać własną implementację. Certyfikat dla example.com jest zaufanym certyfikatem Verisign. – user1782427