Я пишу небольшую программу с библиотекой OpenSSL, которая является, предполагают для установления соединения с сервером SSLv3. Этот сервер распределяет самоподписанный сертификат, который заставляет квитирование перестать работать с этим сообщением: "sslv3 предупреждают отказ квитирования, сам подписанный сертификат в цепочке сертификата".
Существует ли способ, которым я могу вынудить соединение продолжиться? Я попытался назвать SSL_CTX_set_verify как так:
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
Но это, кажется, ничего не изменяет.
Какие-либо предложения?
Вы пытались предоставить своему приложению сертификат CA сервера, чтобы ваше приложение могло проверить цепочку сертификатов?
Вы пробовали установить SSL_set_verify?
SSL_set_verify(s, SSL_VERIFY_NONE, NULL);
Вы можете попробовать передать собственный обратный вызов в SSL_set_verify ()
, а затем выполнить собственную проверку. Это далеко не идеально, поскольку я думаю, вам нужно будет выполнить всю проверку, а затем разрешить игнорировать самоподписанную ошибку, но вы должны иметь возможность выяснить, что делает стандартный код проверки из источника OpenSSL, а затем просто вытащить его. в свой обратный вызов проверки и разрешите конкретный код ошибки ...
Проверьте эти примеры OpenSSL: http://www.rtfm.com/openssl-examples/
wclient.c подключается к любой странице https, например:
wclient -h www.yahoo.com -p 443
Если вы запустите это с установкой по умолчанию, вы получите ошибку сертификата (вы можете использовать флаг -i, чтобы обойти проверку сертификата).
Чтобы проверить сертификат, вам нужно загрузить сертификаты CA (Verisign, Thawte, Equifax и т.д.), поэтому найдите в Google этот файл cacert.pem, загрузите и переименуйте его в root.pem, и вы сможете подключиться к веб-серверу и проверить его сертификат.
Мой пример кода клиента ( ссылка ) отлично работает с самозаверяющим сертификатом сервера. У меня есть приведенный ниже код после SSL_connect, и я полностью контролирую приемлемость самоподписанных сертификатов в моем клиенте
SSL_CTX* ctx = SSL_CTX_new(SSLv3_method());
// TCP connection and SSL handshake ...
/* Check the certificate */
rc = SSL_get_verify_result(ssl);
if(rc != X509_V_OK) {
if (rc == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT || rc == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) {
fprintf(stderr, "self signed certificate\n");
}
else {
fprintf(stderr, "Certificate verification error: %ld\n", SSL_get_verify_result(ssl));
SSL_CTX_free(ctx);
return 0;
}
}