У меня была такая же проблема с использованием 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