gSoap:通过 IP 连接导致 SSL/TLS 证书主机名不匹配

gSoap: connect via IP results in SSL/TLS certificate host name mismatch

我正在使用 gSoap 连接到已知其固定 IP 地址的服务器。

我希望它能工作,因为服务器证书包含此 IP 地址的 "subject alternative name" 个条目。但是,我得到一个 "SSL/TLS certificate host name mismatch in tcp_connect".

搜索这个问题,我找到了。查看此处显示的代码,我发现仅针对 URL 测试 DNS 名称,而非 IP 地址 (stdsoap2.cpp):

if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host))
{ ok = 1;
  break;
}

我通过像这样更改代码设法使连接正常工作:

if (nval && !strcmp(nval->name, "DNS") && !strcmp(nval->value, host))
{ ok = 1;
  break;
}

if (nval && !strcmp(nval->name, "IP Address") && !strcmp(nval->value, host))
{ ok = 1;
  break;
}

问题: 我应该认为这是 gSoap 中的错误并提交补丁,还是错误使用 SSL 的结果?我是否应该通过将 IP 添加到主题备用名称作为 DNS 名称而不是 IP 地址来解决此问题?

Should I consider this a bug in gSoap and file a patch

我会认为这是一个错误。这与 Microsoft 在 IE 等方面存在的错误相同,因为他们检查 dNSName 条目中的 IP 地址,而不是(像其他所有公司一样)检查 IPAddress 条目中的 IP 地址。

我会考虑使用以下补丁进行额外改进以支持域和 IP 地址中的通配符 (*):

if (nval &&
    (!strcmp(nval->name, "DNS") || !strcmp(nval->name,"IP Address")) &&
    !soap_tag_cmp(nval->value, host))
{ ok = 1;
  break;
}