2015-06-22 212 views
2

我的soap客户端不接受我必须连接的服务上的证书。它给出了错误:SSL/TLS certificate host name mismatch in tcp_connect。但是chrome确实接受证书。我使用chrome检查了证书,发现它是* .domain.nl格式的通配符证书。是否需要额外的配置步骤才能让gSoap/openssl接受这个步骤?gSoap SSL/TLS证书主机名在tcp_connect中不匹配

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一切工作正常的选项。

+0

什么是您连接的服务器和端口的URL?否则,我们可能没有足够的信息来帮助你。 – jww

回答

1

我有使用gSOAP 2.8.22相同的问题。寻找解决方案我发现你的问题......但没有答案。所以我下载,构建和调试“OpenSSL 1.0.2d 2015年7月9日”(当前的最新版本)。我试过访问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)。

相关问题