проверка сертификата X.509 на Linux - PullRequest
5 голосов
/ 20 июля 2010

Я только начал работать с сертификатами X.509.Может кто-нибудь сказать мне, как идти о проверке сертификата на Linux?Случай использования заключается в том, что мое приложение загрузило сертификат в предыдущем сеансе, и я должен проверить, является ли он все еще действительным (то есть, не истек ли он или не был отозван с момента его сохранения) перед началом нового сеанса.Я понимаю, что полный образец здесь будет невозможен, но любые указатели будут полезны.

РЕДАКТИРОВАТЬ: Дальнейшее исследование выявило еще одну утилиту под названием Network Security Services (NSS).Как это сравнить с OpenSSL с точки зрения удобства использования?Кроме того, я ищу программные решения, так как я не смогу запускать утилиты командной строки.

Ответы [ 3 ]

18 голосов
/ 27 июля 2010

Как уже упоминалось, вы можете использовать openssl verify.Согласно документации , он также проверяет период действия.

Программно это может означать часы поиска довольно плохой (или отсутствующей) документации, чтения примеров кода по всей сети ивероятно, головная боль.

Чтобы правильно проверить сертификат, вам необходимо сообщить все промежуточные сертификаты.Обычно вы также сообщаете список отзыва (CRL), но это не обязательно.

Итак, вот что вам нужно сделать с точки зрения кода (OpenSSL):

  1. X509_STORE_new - создать хранилище сертификатов;
  2. X509_STORE_CTX_new - создать контекст хранилища;
  3. X509_STORE_add_cert - добавить сертификат (ы) CA (и всех промежуточных) в список доверенныххранилище сертификатов (примечание: есть функция для поиска / загрузки списка);
  4. X509_STORE_add_crl - добавление отозванных сертификатов в CRL хранилища сертификатов (примечание: то же, что и выше);
  5. X509_STORE_CTX_init - Инициализировать контекст вашего хранилища, информируя ваше хранилище сертификатов;
  6. X509_STORE_CTX_set_purpose - Определите цель, если вам это необходимо;
  7. X509_STORE_CTX_set_cert - Сообщите контексту, какой сертификат вы 'Вы собираетесь проверить;
  8. X509_verify_cert - Наконец, проверьте его;
  9. X509_STORE_CTX_cleanup - Если вы хотите повторно использовать контекст для проверки другого сертификата, вы очищаете его и переходите к(5);
  10. И последнее, но не менее важное: освободить (1) и (2);

Альтернативадостаточно быстрой проверки с помощью X509_verify.Однако следует помнить, что он сравнивает только сигнатуры.

Когда мне это было нужно, у меня ушел день на поиск, чтение и тестирование.Затем я понял, что все, что мне было нужно, прямо в исходном коде OpenSSL.Итак, если вам нужен пример, перейдите прямо к openssl-xxx / apps / verify.c .

ВАЖНО: НИКОГДА не используйте MD5.Чтобы понять причину, прочитайте Создание мошеннического сертификата CA .

3 голосов
/ 20 июля 2010

openssl verify будет делать то, что вы хотите, если вы хотите простой инструмент:

от бега:

cd /usr/share/ca-certificates
find . -type f -exec openssl -verify {} \;

Вот выборка вывода:

./telesec.de/deutsche-telekom-root-ca-2.crt: OK
./brasil.gov.br/brasil.gov.br.crt: OK
./cacert.org/cacert.org.crt: OK
./spi-inc.org/spi-ca-2003.crt: /C=US/ST=Indiana/L=Indianapolis/O=Software in the Public Interest/OU=hostmaster/CN=Certification Authority/emailAddress=hostmaster@spi-inc.org
error 10 at 0 depth lookup:certificate has expired
OK
./spi-inc.org/spi-cacert-2008.crt: OK
./signet.pl/signet_ocspklasa3_pem.crt: /C=PL/O=TP Internet Sp. z o.o./CN=CC Signet - CA Klasa 3/serialNumber=Numer wpisu: 4
error 2 at 1 depth lookup:unable to get issuer certificate
./signet.pl/signet_ca3_pem.crt: /C=PL/O=TP Internet Sp. z o.o./CN=CC Signet - CA Klasa 3/serialNumber=Numer wpisu: 4
error 20 at 0 depth lookup:unable to get local issuer certificate

Если вы предпочитаете получать результаты в более крупной программе, возможно, интерфейсы gnutls_x509_crt_verify(3), gnutls_x509_crt_get_key_usage(3), gnutls_x509_crt_check_revocation(3) проще в использовании, чем OpenSSL. (Я никогда не использовал gnutls, но я использовал использовал OpenSSL.)

0 голосов
/ 20 июля 2010

OCSP - это протокол для проверки отзыва сертификатов. Openssl предоставляет API для проверки цепочки сертификатов и проверки подписи. Это требует некоторого количества кодирования. Поэтому я бы посоветовал вам изучить документацию Openssl .

Вы должны пройти цепочку сертификатов и проверять ее, пока не получите корневой сертификат, который должен быть уже сохранен на вашем компьютере. Это самозаверяющий сертификат, выданный субъектами, называемыми корневыми центрами сертификации (центр сертификации)

Помимо OCSP, существует устаревший метод, в котором вам нужно получить список отзыва, а именно CRL, и проанализировать этот список для идентификатора сертификата.

EDIT: Я забыл упомянуть утилиту командной строки openssl, которая выполняет те же функции.

...