【问题标题】:haxe (php) https call: stream_socket_client() Peer certificate CN did not match expected CNhaxe (php) https 调用:stream_socket_client() 对等证书 CN 与预期 CN 不匹配
【发布时间】:2016-01-07 17:14:15
【问题描述】:

我正在使用 haxe 的 Http 类(编译为 php)通过 https 向 AWS 发送 request()。这是使用 haxe-aws 库 (https://github.com/Blank101/haxe-aws) 的最小示例:

var iamconf = new IAMConfig('newbucket.s3-eu-central-1.amazonaws.com', accessKey, secretKey, 'eu-central-1', 's3');
var sig4 = new Sig4Http('https://newbucket.s3-eu-central-1.amazonaws.com/', iamconf);
sig4.applySigning(true);
sig4.setPostData('<CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><LocationConstraint>eu-central-1</LocationConstraint></CreateBucketConfiguration>');
sig4.request(true);

无论我使用哪个服务/端点,响应总是:

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

通过 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;
    }
  }
}

【问题讨论】:

  • 无论端点如何,您是否绝对确定消息是逐字节 相同 的?错误消息表明您尝试连接到 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)
  • 嗯,您正在使用的代码中的 something 从根本上破坏了某些东西。 SSL (TLS) 连接根据服务器提供的证书中的公用名 (CN) 或主题备用名称 (SAN) 验证您尝试连接的 主机名...而不是 IP地址。从来没有IP地址......所以错误消息的内容似乎背叛了代码中的一些废话。我无法开始猜测在哪里,但这就是解释。
  • 我完全同意,Michael,我不明白为什么底层类使用 IP 地址。我刚刚修改了 Http 类以在连接时使用主机名,而不是 IP 地址,它现在正在工作。但这不是改变标准 haxe 类的解决方案。也不应该是一个错误,因为我肯定不是第一个尝试在 haxe 中发送 https 请求的人。我的环境/代码一定有什么问题。

标签: php amazon-web-services https haxe


【解决方案1】:

正如此处https://groups.google.com/forum/#!msg/haxelang/JMSBpF2sOi0/QpoNEjk9EQAJ 和此处http://php.net/manual/en/migration56.openssl.php 所指出的,PHP 5.6 中的 openssl 扩展默认使用对等验证。因此,切换回 PHP 5.5 是一种解决方法,因为此处禁用了对等验证。但是它仍然使用 IP 地址而不是主机名,因此不能解决问题的根源。

【讨论】:

  • 从外观上看,php.net.SslSocket 应该覆盖 connect() 以使用主机名,而不是主机 IP。其他人还没有发现这一点的原因很可能是在 PHP 5.6 之前默认情况下缺乏对等验证。您应该在 official repository... 上创建一个问题
猜你喜欢
  • 1970-01-01
  • 2017-05-24
  • 2018-01-05
  • 2019-12-17
  • 2019-05-27
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多