【问题标题】:CN_match deprecated in favor of peer_name不推荐使用 CN_match 以支持 peer_name
【发布时间】:2017-11-28 22:23:36
【问题描述】:

我正在尝试通过 SSL 将 POST 请求从一台服务器发送到 PHP 中的另一台服务器。当我在上下文选项中使用 CN_match 时,它可以正常工作。但是,我在错误日志中收到一条弃用消息:

PHP 已弃用:“CN_match”SSL 上下文选项已弃用,取而代之的是“peer_name”

问题是,如果我按照建议将CN_match 更改为peer_name,则请求将完全失败并显示以下消息:

打开流失败:HTTP 请求失败! HTTP/1.1 400 错误请求。

peer_name 使用无效值会导致预期错误:

对等证书 CN='localhost' 与预期的 CN='test' 不匹配

当我指定“localhost”时,显然它匹配正确。我是否缺少使用peer_name 而不是CN_match 时所需的其他一些配置?

使用 MAMP,PHP 5.6.27

$userdata = array(
    'action'            => 'add-user',
    'name'              => $name,
    'email'             => $email,
    'username'          => $username,
    'password'          => $password);

// use key 'http' even if you send the request to https://...
$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => http_build_query($userdata)
    ),
    'ssl' => array(
        'verify_peer'       => true,
        'cafile'            => /path/to/file.pem,
        'verify_depth'      => 5,
        'allow_self_signed' => true,
        'peer_name'         => 'localhost'
    )
);

$context  = stream_context_create($options);
$data = file_get_contents('https://localhost/add-user.php', false, $context);

【问题讨论】:

    标签: php ssl sslcontext


    【解决方案1】:

    使用 curl 是我能找到的唯一解决方案:

    $url = 'https://some.domain.com/file.php';
    $pem_file = '/absolute/path/to/certificate.pem';
    
    $userdata = array(
        'action'            => 'add-user',
        'name'              => $name,
        'email'             => $email,
        'username'          => $username,
        'password'          => $password);
    
    $curl_req = curl_init();
    curl_setopt($curl_req, CURLOPT_URL, $url);
    curl_setopt($curl_req, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl_req, CURLOPT_POST, true);
    curl_setopt($curl_req, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded'));
    curl_setopt($curl_req, CURLOPT_POSTFIELDS, http_build_query($userdata));
    curl_setopt($curl_req, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl_req, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($curl_req, CURLOPT_CAINFO, $pem_file);
    
    $response = curl_exec($curl_req);
    curl_close($curl_req);
    

    此外,我花了一段时间才弄清楚如何构建 certificate.pem 文件。您需要堆叠证书,从您的特定证书开始,通过任何中间证书并以 CA 证书结束:

    -----BEGIN CERTIFICATE-----
    <your site certificate>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    <intermediate certificate>
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    <CA certificate>
    -----END CERTIFICATE-----
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多