2009-10-05 33 views
8

starałem się dowiedzieć, w jaki sposób można przejść o weryfikację certyfikatu z podpisem własnym przez serwer w Pythonie. Nie mogłem znaleźć wiele danych w google. Chcę również, aby upewnić się, że adres URL serweraWeryfikacja Peer w SSL przy użyciu Pythona

Dzięki z góry za wszelkie spostrzeżenia.

Odpowiedz

10

Z komentarzy do mojej pierwszej odpowiedzi wynika, że ​​istnieje ogólne nieporozumienie, co oznacza "weryfikacja certyfikatu". Spróbuję napisać krótkie wyjaśnienie, aby wyeliminować niektóre złudzeń.

Weryfikacja certyfikatu polega na sprawdzeniu podpisu na metadanych certyfikatu (tj. Przedmiocie, okresie ważności, rozszerzeniach itp.) Na niektórych podpisach kryptograficznych.

Jeśli wszystko, co musisz sprawdzić, to certyfikat z podpisem własnym, nie możesz go odróżnić od innego certyfikatu z podpisem własnym z dokładnie tymi samymi metadanymi, ale z innym kluczem, chyba że znasz klucz klucza certyfikatu z góry. I nie zapominaj, że ustanawiasz całą tę procedurę weryfikacji, aby usunąć wymóg posiadania tej wstępnej wiedzy. Dzięki regularnej weryfikacji certyfikatu nie można całkowicie usunąć wymóg jakieś pre-shared wiedza, która jest zbiorem świadectw osób trzecich, znany również jako „certyfikatów CA”. Ponieważ wiedza ta jest wstępnie udostępniona, certyfikaty te mogą być z podpisem własnym, ale pamiętaj, że otrzymałeś informacje o ważności tych certyfikatów nie z procesu weryfikacji, ale z pewnej wiedzy zewnętrznej.

Gdy masz zestaw zaufanych certyfikatów CA rozdzielonych między równorzędne, możesz ich używać do podpisywania innych certyfikatów i sprawdzania podpisów przed tą wstępnie udostępnioną wiedzą zaufanych urzędów certyfikacji.

Ale jeśli nie masz dodatkowej wiedzy na temat samopodpisanego certyfikatu, z wyjątkiem samego certyfikatu, nie możesz wysuwać żadnych założeń dotyczących zaufania do tego konkretnego certyfikatu, ponieważ może on zostać wydany przez jakiegoś złego hakera, a także przez zaufany serwer.

Przed zdobyciem certyfikatu należy uzyskać wiedzę na temat Man in the middle attack, Public key infrastructure i Public key cryptography.

Proszę zrozumieć, że ślepa weryfikacja samopodpisanego certyfikatu nie ochroni nawet sprytnego hakera we własnej sieci, nie biorąc pod uwagę ogólnego bezpieczeństwa w Internecie.

Edytuj: autor pytania wyjaśnił, że faktycznie szukał sposobu zweryfikowania podpisu verisign (lub innego urzędu certyfikacji) na certyfikacie za pomocą powiązań M2Crypto. Oto dwa przykłady:

from M2Crypto import X509, SSL 

# manual validation of a signature on a certificate using a given CA cert: 
ca = X509.load_cert('/path/to/ca_cert.pem') 
cert = X509.load_cert('certificate_to_validate.pem') 
print "Verification results:", cert.verify(ca.get_pubkey()) 

# adding a given CA cert to the SSL Context for verification 
ctx = SSL.Context() 
# load a certificate from file 
ctx.load_verify_locations(cafile='/path/to/ca_cert.pem') 
# or use all certificate in a CA directory 
ctx.load_verify_locations(capath='/path/to/ca/dir') 
# or you can specify both options at the same time. 

Jeśli masz zamiar użyć katalog z wielu certyfikatów CA (która często jest wygodniejsze) trzeba zmienić nazwę każdego certyfikat <hash>.0 gdzie <hash> jest hash podmiotu certyfikatu (otrzymany z openssl x509 -noout -hash -in cert.pem).

+0

Przepraszam, moje pytanie było błędne. – Bhargava

+0

Naprawdę szukałem weryfikacji podpisanej przez Verisign przy użyciu M2Crypto. – Bhargava

+0

Zaktualizowałem odpowiedź za pomocą przykładów M2Crypto. – abbot

0

Jest niemożliwe, aby zweryfikować certyfikat z podpisem własnym z powodu swej natury: jest podpisem własnym.

Musisz podpisać certyfikat innym zaufanym certyfikatem innej firmy, aby móc cokolwiek zweryfikować, a następnie możesz dodać certyfikat tej strony trzeciej do listy zaufanych urzędów certyfikacji, a następnie będziesz w stanie zweryfikować certyfikaty podpisane przez ten certyfikat/urząd certyfikacji.

Jeśli chcesz porady o tym, jak to zrobić w Pythonie, należy podać nazwę biblioteki SSL używanego, gdyż istnieje możliwość wyboru bibliotek SSL dla Pythona.

+0

Wszystkie certyfikaty urzędów certyfikacji najwyższego poziomu są z podpisem własnym i nie ma problemu, aby je zweryfikować (zaufać). –

+0

oczywiście możesz zweryfikować samopodpisany certyfikat, wystarczy, że masz certyfikat skopiowany lokalnie. Zasadniczo jest to uwierzytelnianie klucza publicznego/prywatnego w tym punkcie. Wiele lokalnych systemów uwierzytelniania działa w ten sposób, sprawdzając, czy host jest zgodny z prawem, używając certyfikatu x.509. Zobacz certmaster i func dla przykładów Pythona. – JimB

2

Zakładam użyć wiązania niektórych OpenSSL. Widzę 2 sposoby na rozwiązanie twojego problemu.

  1. Możesz dodać swój certyfikat do katalogu openssl (uruchom openssl version -d, aby zobaczyć go w swoim systemie). Będzie to miało wpływ na wszystkie programy korzystające z openssl na twoim komputerze.
  2. certyfikat obciążenia i dodać to run-time (szkic Kod poniżej jest dla PyOpenSSL, ale powinna być podobna do innych wiązań):

.

x509 = OpenSSL.crypto.load_certificate(...) 
ctx = OpenSSL.SSL.Context(...) 
store = ctx.get_cert_store() 
store.add_cert(x509) 
ctx.set_verify(VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT, ...) 
+0

Korzystając z tego kodu, nie weryfikujesz samopodpisanego certyfikatu, jawnie dodajesz go do zaufanego magazynu certyfikatów, dzięki czemu sam się "zweryfikuje". Dodanie certyfikatu do katalogu openssl robi dokładnie to samo. Ponownie, nie można zweryfikować certyfikatu z podpisem własnym: każdy samopodpisany certyfikat przejdzie test weryfikacyjny. – abbot

Powiązane problemy