Как я могу проверить имена хостов с OpenSSL 1.1.0?

Я пытаюсь реализовать образец проверка имени хоста с OpenSSL.
Пример кода C / C ++, который я собрал:

// please note I'm connecting to https://openssl.org itself
// enable SNI
if(!SSL_set_tlsext_host_name(ssl, "www.openssl.org")) throw;
if(!SSL_connect(ssl)) throw;
// connection is fine, I can get the homepage via HTTP
X509 *cert = SSL_get_peer_certificate(ssl);
if(cert) {
if(!X509_VERIFY_PARAM_set1_host(SSL_get0_param(ssl), "google.com", 0)) throw;
SSL_set_verify(ssl, SSL_VERIFY_PEER, 0);
const long cert_res = SSL_get_verify_result(ssl);
if(cert_res == X509_V_OK) {
printf("Certificate verified!\n");
}
X509_free(cert);
}

Согласно приведенному выше коду, я успешно подключаюсь к openssl.org домен; тогда я устанавливаю имя, чтобы проверить как google.com тестировать сбои, но код все еще преуспевает.

Что я делаю неправильно?
Как я могу реализовать тщательный проверка имен хостов с использованием OpenSSL API-интерфейсы? Я не хотел бы повторно реализовать (скорее всего, с ошибками / неправильно) то, что уже реализовано в библиотеке …

Я использую Ubuntu 16.04 и это libssl версия: /lib/x86_64-linux-gnu/libssl.so.1.0.0,

1

Решение

По предложению jwwнужно просто установить (как минимум)

if(!X509_VERIFY_PARAM_set1_host(SSL_get0_param(ssl), "google.com", 0)) throw;

перед выполнением самого соединения:

if(!SSL_connect(ssl)) throw;

В этом случае в одном случае убедитесь, что OpenSSL выполняет проверку автоматически во время подключения, добавив следующий код:

SSL_set_verify(ssl, SSL_VERIFY_PEER, 0);

перед звонком SSL_connectили следуйте по тому же пути, что и раньше, и получите возврат X509_V_ERR_HOSTNAME_MISMATCH от SSL_get_verify_result если кто-то хочет разобраться с вещами более подробно:

// please note I'm connecting to https://openssl.org itself
// enable SNI
if(!SSL_set_tlsext_host_name(ssl, "www.openssl.org")) throw;
// enable name/domain verification
if(!X509_VERIFY_PARAM_set1_host(SSL_get0_param(ssl), "google.com", 0)) throw;
if(!SSL_connect(ssl)) throw;
// get certificate
X509 *cert = SSL_get_peer_certificate(ssl);
if(cert) {
const long cert_res = SSL_get_verify_result(ssl);
// in case of name/domain mismatch cert_res will
// be set as 62 --> X509_V_ERR_HOSTNAME_MISMATCH
if(cert_res != X509_V_OK) throw; // certificate has been tampered with
X509_free(cert);
} else throw; // we couldn't get certificate
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]