Проверка сертификата SSL программно - PullRequest
0 голосов
/ 27 мая 2011

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

Справочная информация У меня есть приложение, котороезапускает Firefox для получения данных URL и представления времени загрузки отдельных компонентов всех компонентов на веб-странице (например, Firebug).Однако приложение не проверяет ssl-сертификаты автоматически (т.е. оно застревает, если имеется неверный сертификат, так как нет пользователя, который мог бы принять / отклонить сертификат вручную, и все это делается программно).Мне нужно решить эту проблему, пытаясь проверить сертификат сайта до запуска процесса firefox.

Мое решение

Я нашел этот бит кода C, который выполняет проверкуSSL-сертификаты программно в C. Я даю краткий обзор этого.это метод main ():

SSL_library_init();
ERR_load_BIO_strings();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();

/* Set up the SSL context */
ctx = SSL_CTX_new(SSLv23_client_method());

/* Load the trust store - in this case, it's just a single
 * certificate that has been created for testing purposes.
 */

if(! SSL_CTX_load_verify_locations(ctx,"certificate.pem",NULL))
{
    fprintf(stderr, "Error loading trust store\n");
    //ERR_print_errors_fp(stderr);
    SSL_CTX_free(ctx);
    return 0;
}

/* Setup the connection */
bio = BIO_new_ssl_connect(ctx);

/* Set the SSL_MODE_AUTO_RETRY flag */

BIO_get_ssl(bio, & ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

/* Create and setup the connection */

BIO_set_conn_hostname(bio, "mail.google.com:https");

fprintf(stderr, "Connecting to host ...\n");

if(BIO_do_connect(bio) <= 0)
{
    fprintf(stderr, "Error attempting to connect: %d\n",BIO_do_connect(bio));
    //ERR_print_errors_fp(stderr);
    BIO_free_all(bio);
    SSL_CTX_free(ctx);
    return 0;
}
/* Retrieve the peer certificate */

fprintf(stderr, "Retrieving peer certificate\n");
if(getPeerCert(ssl, & peerCert) != X509_V_OK)
{
    /* Can be changed to better handle a suspect certificate. However,
     * for the purposes of this demonstration, we're aborting.
     */
    fprintf(stderr, "Certificate verification error: %i\n",SSL_get_verify_result(ssl));
    BIO_free_all(bio);
    SSL_CTX_free(ctx);
    return 0;
}

Я опускаю определение метода getPeerCert (), так как он получает сертификат равноправного узла и проверяет его с помощью методов openssl.

Также и Certificate.pem.файл pem, полученный с помощью шагов для решения этого вопроса.

Однако, когда я пытаюсь запустить это, я получаю

Connecting to host ...
Retrieving peer certificate
Certificate verification error: 20

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

Обновление 1

Я попытался использовать команду open SSL и попытался вызвать команду из кода, т.е.

opensssl verify -CAfile ./ca-bundle.crt cert1...

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

Ответы [ 2 ]

2 голосов
/ 03 октября 2012
opensssl verify -CAfile ./ca-bundle.crt -untrusted cert1...

см. Эту статью, но я пока не знаю, как это сделать программно ..

http://www.herongyang.com/crypto/openssl_verify_2.html\

1 голос
/ 27 мая 2011

конкретная ошибка , которую вы получаете:

20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: unable to get local issuer certificate

the issuer certificate could not be found: this occurs if the issuer certificate of an untrusted certificate cannot be found.

Попробуйте добавить издатель gmail, а не сертификат gmail, в certificate.pem.

Также убедитесь, что вы понимаете первый комментарий Бруно по вашему вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...