Несоответствие имени узла сертификата gSoap SSL/TLS в tcp_connect

Мой клиент мыла не принимает сертификат службы, к которой я должен подключиться. Выдает ошибку: SSL/TLS certificate host name mismatch in tcp_connect. Однако хром принимает сертификат. Я проверил сертификат в Chrome и заметил, что это подстановочный сертификат в форме * .domain.nl. Требуются ли дополнительные шаги по настройке, чтобы заставить gSoap/openssl принять это?

SSL-инициализация:

soap_ssl_client_context(&proxy,
    SOAP_SSL_DEFAULT,   /* use SOAP_SSL_DEFAULT in production code */
    NULL,       /* keyfile (cert+key) */
    NULL,       /* password to read the keyfile */
    "c:\\test\\cacert.pem", 
    NULL,       /* optional capath to directory with trusted certificates */
    NULL    
)

cacert.pem, который я тестирую, это http://curl.haxx.se/ca/cacert.pem

Когда я добавляю SOAP_SSL_SKIP_HOST_CHECK к параметрам, все работает нормально.


person Eelke    schedule 22.06.2015    source источник
comment
Какой URL-адрес сервера и порт, к которому вы подключаетесь? В противном случае, возможно, нам недостаточно информации, чтобы помочь вам.   -  person jww    schedule 23.06.2015


Ответы (1)


У меня была такая же проблема с использованием gSOAP 2.8.22. В поисках решения я нашел ваш вопрос ... но нет ответа. Итак, я скачал, собрал и отладил «OpenSSL 1.0.2d 9 июля 2015 года» (текущая последняя версия).

Я попытался получить доступ к https://outlook.office365.com/ews/exchange.asmx . Сертификат содержит имена подстановочных знаков «Альтернативное имя субъекта сертификата», например «*.office365.com». Я нашел код, обрабатывающий это поле в stdsoap2.cpp, но он не проверяет имена с подстановочными знаками:

names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL);
if (names)
{ val = i2v_GENERAL_NAMES(NULL, names, val);
    sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
}
if (val)
{ int j;
    for (j = 0; j < sk_CONF_VALUE_num(val); j++)
    { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j);
    if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host))
    { ok = 1;
        break;
    }
    }
    sk_CONF_VALUE_pop_free(val, X509V3_conf_free);
}

Затем я изменил код на

names = (GENERAL_NAMES*)X509_get_ext_d2i(peer, NID_subject_alt_name, NULL, NULL);
if (names)
{ val = i2v_GENERAL_NAMES(NULL, names, val);
    sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
}
if (val)
{ int j;
    for (j = 0; j < sk_CONF_VALUE_num(val); j++)
    { CONF_VALUE *nval = sk_CONF_VALUE_value(val, j);
    if (nval && !strcmp(nval->name, "DNS"))
    {
        if ( !strcmp( nval->value, host))
        { 
            ok = 1;
            break;
        }
        else if ( *nval->value == '*')
        {
            const char* const t = nval->value + 1;
            if ( *t == '.')
            {
                const char* const h = strchr( host, '.');
                if ( h && !strcmp( t, h))
                {
                    ok = 1;
                    break;
                }
            }
        }
    }
    }
    sk_CONF_VALUE_pop_free(val, X509V3_conf_free);
}

Это исправление не касается имен UTF-8. Для этого вы можете посмотреть код обработки общего имени (ищите NID_commonName).

person Flaviu    schedule 05.10.2015