gpt4 book ai didi

php - 如何在 PHP 5.6 中通过 php.ini 设置 'verify_peer_name=false' SSL 上下文选项

转载 作者:可可西里 更新时间:2023-11-01 12:31:50 24 4
gpt4 key购买 nike

案例:我想打开到 localhost 的 SSL 连接,而 SSL 证书是 FQDN 的问题。

问题:如果 (*) 行中没有特殊处理,下面的程序将失败并显示以下消息:

PHP 警告:stream_socket_enable_crypto():对等证书 CN='myhost.com' 与 test.php 中预期的 CN='localhost' 不匹配

测试PHP程序:

$fp = stream_socket_client("tcp://localhost:993", $errno, $errstr, 30);

// (*) if commented, the program fails
//stream_context_set_option($fp, 'ssl', 'verify_peer_name', false);

if (!$fp) {
die("Unable to connect: $errstr ($errno)");
}
if (!stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
die("Failed to start SSL");
}
fwrite($fp, "USER god\r\n");
fwrite($fp, "PASS secret\r\n");
while ($motd = fgets($fp)) {
echo $motd;
}
fclose($fp);

因为我有很多遗留代码,我希望通过仅对 php.ini(或 CLI)应用更改来获得解决方案,但不幸的是,以下均无效:

php -d verify_peer_name=false test.php

php -d ssl.verify_peer_name=false test.php

想法?

引用资料:

最佳答案

TL;博士

cafilecapath同时runtime configurationSSL context options , verify_peer_nameverify_peer只有SSL context options .

因此后面两个不能通过运行时配置指令进行修改。


我可以从下面复制的文档中理解混淆,但是这两段实际上指的是 PHP 中的两个不同概念。

The default CA bundle may be overridden on a global basis by setting either the openssl.cafile or openssl.capath configuration setting, or on a per request basis by using the cafile or capath context options.

While not recommended in general, it is possible to disable peer certificate verification for a request by setting the verify_peer context option to FALSE, and to disable peer name validation by setting the verify_peer_name context option to FALSE.

Link to PHP manual source

首先请注意,文档本身在 openssl.cafile 之间有明显的区别。和 openssl.capath 在全局范围内在每个请求的基础上与verify_peerverify_peer_name请求

所以这基本上意味着,当openssl.cafileopenssl.capath可以通过 php.ini 进行调整或通过 stream_context_set_option ,另一方面verify_peerverify_peer_name只能通过 stream_context_set_option 访问.

PHP 源代码本身也证实了这一点,这里有一些行显示 PHP垫层C语言正在从 php_stream_context_get_option 获取值仅。

must_verify_peer_name = GET_VER_OPT("verify_peer_name")
? zend_is_true(val)
: sslsock->is_client;

Link to PHP github source code

为清楚起见,这里是宏 GET_VER_OPT 的声明

#define GET_VER_OPT(name)               (PHP_STREAM_CONTEXT(stream) && (val = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream), "ssl", name)) != NULL)

Link to PHP github source code

cafilecapath实际上首先与 php_stream_context_get_option 匹配值,但是,如果这些是 NULL在上下文中,然后在 ini 配置中获取它们。

GET_VER_OPT_STRING("cafile", cafile);
GET_VER_OPT_STRING("capath", capath);

if (cafile == NULL) {
cafile = zend_ini_string("openssl.cafile", sizeof("openssl.cafile")-1, 0);
cafile = strlen(cafile) ? cafile : NULL;
}

Link to PHP github source code

然后在完全相同的函数中稍微降低一点:

if (capath == NULL) {
capath = zend_ini_string("openssl.capath", sizeof("openssl.capath")-1, 0);
capath = strlen(capath) ? capath : NULL;
}

Link to PHP github source code

为清楚起见,这里是宏 GET_VER_OPT_STRING 的声明

#define GET_VER_OPT_STRING(name, str)   if (GET_VER_OPT(name)) { convert_to_string_ex(val); str = Z_STRVAL_P(val); }

Link to PHP github source code

您还可以看到,当这两个值 openssl.capth openssl.cafile 被定义为现有 ini配置,后面 verify_peer verify_peer_name 无处可寻。

很遗憾,正如文档提示的那样,唯一的方法是通过 stream_context_set_option ( $stream_or_context , 'ssl' , 'verify_peer_name' , false ) 为请求配置它。


在早已过去的历史中:这是这两个 SSL 上下文选项的默认值。根据文档的提示,它们在 PHP 5.6.0 版中发生了变化:

5.6.0 Added peer_fingerprint and verify_peer_name. verify_peer default changed to TRUE.

Link to PHP documentation

这意味着从 PHP < 5.6.0 升级 PHP 后会出现此类问题因此,通过使用 PHP 可以将这两个选项的默认值保持为 false版本低于 5.6.0 ;但自从分支5.*.* PHP 现在是 totally out of support这不再是一个可行的选择。

关于php - 如何在 PHP 5.6 中通过 php.ini 设置 'verify_peer_name=false' SSL 上下文选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26810218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com