haxe(php)https调用:流\u套接字\u客户端()对等证书CN与预期CN不匹配

haxe(php)https调用:流\u套接字\u客户端()对等证书CN与预期CN不匹配,php,amazon-web-services,https,haxe,Php,Amazon Web Services,Https,Haxe,我正在使用haxe的Http类(编译为php)通过https向AWS发送request()。下面是使用haxe aws库()的一个简单示例: 通过http的请求可以工作。有什么想法吗 编辑: 代码的责任部分是为什么使用IP地址而不是名称进行连接: if(!php_Boot::$skip_constructor) { if(_hx_deref(new EReg("^(\\d{1,3}\\.){3}\\d{1,3}\$", ""))->match($name)) { $this-&

我正在使用haxe的Http类(编译为php)通过https向AWS发送
request()
。下面是使用haxe aws库()的一个简单示例:

通过http的请求可以工作。有什么想法吗

编辑: 代码的责任部分是为什么使用IP地址而不是名称进行连接:

if(!php_Boot::$skip_constructor) {
  if(_hx_deref(new EReg("^(\\d{1,3}\\.){3}\\d{1,3}\$", ""))->match($name)) {
    $this->_ip = $name;
  } else {
    $this->_ip = gethostbyname($name);
    if($this->_ip === $name) {
      $this->ip = 0;
      return;
    }
  }
}

正如这里和这里指出的,PHP5.6中的openssl扩展在默认情况下使用对等验证。因此,切换回PHP5.5是一种解决方法,因为这里禁用了对等验证。但是,它仍然使用IP地址而不是主机名,因此无法解决问题的根源。

您是否绝对确定无论端点如何,消息都是逐字节相同的?错误消息表明您试图连接到
https://54.231.192.50/...
预计会失败。但是,如果这不是您正在做的,那么其中一个底层组件肯定有问题。请确认,
bucket.s3.eu-central-1.amazonaws.com
的失败与
bucket.s3-eu-central-1.amazonaws.com
的失败完全相同(点对点在s3后破折号选项是这个地区的一个怪癖,在大多数其他地区没有,但两者都应该有效)。好的一点,但是相同的响应,只是一个不同的ip地址(54.231.193.38),您正在使用的代码中的某些内容从根本上被破坏了。SSL(TLS)连接根据服务器提供的证书中的公用名(CN)或使用者替代名(SAN)验证您尝试连接到的主机名。。。不是IP地址。从来没有IP地址。。。因此,错误消息的内容似乎泄露了代码中的一些废话。我猜不出在哪里,但这就是解释。我完全同意,Michael,我不理解底层类为什么使用IP地址。我刚刚修改了Http类,使其在连接时使用主机名,而不是IP地址,它现在可以工作了。但这不是改变标准haxe类的解决方案。也不应该是一个bug,因为我肯定不是第一个尝试在haxe中发送https请求的人。我的环境/代码一定出了什么问题。从外观上看,
php.net.SslSocket
应该覆盖
connect()
以使用主机名,而不是主机ip。其他人还没有发现这一点的原因很可能是PHP5.6之前默认情况下缺乏对等验证。你应该在…上创建一个问题。。。
stream_socket_client(): Peer certificate CN=`*.s3.eu-central-1.amazonaws.com' did not match expected CN=`54.231.192.50' (errno: 2) in [...]lib\sys\net\Socket.class.php at line #34
if(!php_Boot::$skip_constructor) {
  if(_hx_deref(new EReg("^(\\d{1,3}\\.){3}\\d{1,3}\$", ""))->match($name)) {
    $this->_ip = $name;
  } else {
    $this->_ip = gethostbyname($name);
    if($this->_ip === $name) {
      $this->ip = 0;
      return;
    }
  }
}