2015-06-22 3 views
2

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

SSL INIT:

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 к опциям все отлично работает.

+0

Каков URL-адрес сервера и порта, который вы подключаете? В противном случае нам, вероятно, не хватает информации, чтобы помочь вам. – jww

ответ

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).

 Смежные вопросы

  • Нет связанных вопросов^_^