2012-05-28 15 views
5

Potrzebuję zweryfikować domenę certyfikatu X509 przy użyciu C-land OpenSSL.Weryfikowanie domeny certyfikatu w OpenSSL

Moje zrozumienie jest, że biblioteka nie robi tego dla mnie, i że muszę wdrożyć w przybliżeniu następujący algorytm:

  1. Jeśli pole dNSName rozszerzenia SubjectAlternativeName jest obecny, że do ustawienia name wartość.
  2. W przeciwnym razie ustaw name na pole CN obiektu.
  3. Porównaj name z żądaną nazwą hosta, umożliwiając każdemu gwiazdce dopasowanie [A-Za-z0-9 _] +, ale nie "kropka" (.).

Wydaje mi się, że powinno być mnóstwo kodu, aby to zrobić, ale nie znalazłem żadnego.

Czy ktoś może znaleźć przykład tego? Lub alternatywnie - sprawdź mój algorytm psychologiczny?

EDYCJA: Oto, co wymyśliłem: https://gist.github.com/2821083. Wydaje się naprawdę dziwne, że OpenSSL zostawiłby to dzwoniącemu.

+1

Zamiast "ustawiania" wartości opartej na tym, co znajduje się w certyfikacie, powinieneś zrobić to na odwrót: sprawdź, czy to, co się spodziewasz, ma zgodny wpis DNS SAN. Wynika to z faktu, że w rozszerzeniu SAN może znajdować się wiele wpisów DNS. (W RFC 6125 są teraz bardziej precyzyjne reguły dotyczące dopasowywania symboli wieloznacznych) – Bruno

Odpowiedz

5

Jesteś prawie na miejscu - ale uwaga na temat Alternatywne nazwy i surowe adresy IP i FQDN. Może chcesz ukraść

BOOL SSL_X509_getIDs(apr_pool_t *p, X509 *x509, apr_array_header_t **ids) 

i związanych z przyjaciół z http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_util_ssl.c i wywoływany w ssl_engine_init.c (który nawiasem mówiąc po stronie serwera) dla wszystkich opcji.

Podczas działania na callback w openssl - rozważ także datę i czas, jeśli nie podałeś już tego w CTX.

Dw.

2

Wydaje się naprawdę dziwne, że OpenSSL zostawiłby to dzwoniącemu.

Tak, bardzo problematyczne pominięcie w praktyce, ponieważ tak wiele aplikacji nie zdaje sobie sprawy, że musi ręcznie wykonać czek.

OpenSSL 1.1.0 będzie zawierać weryfikację nazwy hosta (teraz w HEAD (stan na wrzesień 2013)). Zgodnie z dziennikami zmian dostępna jest opcja -verify_name, a apps.c odpowiada przełącznikowi -verify_hostname. Ale s_client nie odpowiada na żaden z przełączników, więc nie jest jasne, w jaki sposób sprawdzanie nazwy hosta zostanie zaimplementowane lub wywołane dla klienta.


Jeśli pole rozszerzenia subjectAlternativeNamednsName jest obecny, nazwa zestawu do tej wartości.

Może istnieć wiele alternatywnych nazw tematycznych (SAN), więc przygotuj się na więcej niż jeden.

W przeciwnym razie ustaw nazwę pola CN tematu.

Uważam, że trzeba to sprawdzić również w meczu.

porównania nazwy przed żądanego hosta, dzięki czemu każdy gwiazdka dopasować [A-Z 0-9 _] +, ale nie 'dot' (.).

To znacznie bardziej bolesne. Musisz także upewnić się, że nie pasujesz do gTLD lub ccTLD. Na przykład nie chcesz dopasowywać się do certyfikatu wystawionego przeciwko gTLD *.com. Ten certyfikat został prawdopodobnie wydany przez złego faceta;)

ccTLD są jak * .eu, * .us lub இலங்கை (nic.lk). Jest ich około 5000, a Mozilla oferuje listę pod numerem http://publicsuffix.org/. Lista surowa to https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1.


Wydaje mi się, że nie powinno być dużo kodu kopanie wokół zrobić to, ale nie znalazłem żadnego.

Oprócz sugestii van Gulika, możesz także spróbować Curl. Jestem całkiem pewien, że Curl zawiera kod pasujący do nazwy hosta.


Można nawet sprawdzić certyfikaty są dobrze uformowane. Grupą odpowiedzialną w kontekście sieci są fora CA/Browser. Mają wymogi podstawowe i rozszerzone do tworzenia certyfikatów:

W docs bazowych, można znaleźć, na przykład, IP wymienione jako nazwa zwyczajowa (CN) muszą być również wymienione w alternatywnych nazwach podmiotów (SAN).

W rozszerzonych dokumentach okaże się, że zarezerwowane adresy IP (RFC 1918) nie mogą być obecne w rozszerzonym certyfikacie walidacji (EV); i certyfikaty EV nie mogą zawierać symboli wieloznacznych.

Powiązane problemy