我有使用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)。
什么是您连接的服务器和端口的URL?否则,我们可能没有足够的信息来帮助你。 – jww