Из комментариев к моему первому ответу я вижу, что существует общее недопонимание того, что означает «проверка сертификата». Я постараюсь написать краткое объяснение здесь, чтобы устранить некоторые из иллюзий.
Проверка сертификата заключается в проверке подписи на метаданных сертификата (т. Е. Субъекте, сроке действия, расширениях и т. Д.) В отношении некоторой криптографической подписи.
Если для проверки у вас есть только самозаверяющий сертификат, вы не сможете отличить его от другого самозаверяющего сертификата с точно такими же метаданными, но с другим ключом, если вы заранее не знаете ключ сертификата ключа. И не забывайте, что вы устанавливаете всю эту процедуру проверки, чтобы убрать требование иметь эти предварительные знания. При регулярной проверке сертификатов вы не можете полностью отменить требование наличия некоторого предварительного общего знания, которое представляет собой набор сторонних сертификатов, также известных как «сертификаты ЦС». Поскольку эти знания предварительно распространяются, эти сертификаты могут быть самозаверяющими, но помните, что вы получили информацию о действительности этих сертификатов не из процесса проверки, а из некоторого внешнего знания.
Когда у вас есть набор доверенных «сертификатов ЦС», распределенных между одноранговыми узлами, вы можете использовать их для подписи других сертификатов и проверки подписей на основе этих предварительных знаний доверенных ЦС.
Но если у вас нет дополнительных знаний о самозаверяющем сертификате, кроме самого сертификата, вы не можете делать предположения о доверии этому конкретному сертификату, поскольку он может быть выдан неким злым хакером, а также вашим заслуживающим доверия сервером.
Пожалуйста, приобретите некоторые знания о Человек в середине атаки , Инфраструктура открытого ключа и Криптография с открытым ключом в целом, прежде чем внедрять какие-либо процессы проверки сертификатов .
Пожалуйста, поймите, что слепая проверка самозаверяющего сертификата не защитит вас даже от умного хакера в вашей собственной сети, даже не принимая во внимание интернет-безопасность в целом.
Редактировать : автор вопроса уточнил, что он на самом деле искал, как проверить подпись verisign (или другого CA) на сертификате, используя привязки M2Crypto. Вот два примера:
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.
Если вы собираетесь использовать каталог со многими сертификатами CA (что часто более удобно), вы должны переименовать каждый сертификат в <hash>.0
, где <hash>
- хэш субъекта сертификата (полученный с помощью openssl x509 -noout -hash -in cert.pem
).