当前位置:首页 > 技术 > 正文内容

PHP 调用 openssl_pkey_get_private 之后 Redis (SSL连接) 出现错误

代码老兵 技术 32

之前是一直没问题的,后来修改 Redis 为 SSL 连接,就出现如下错误:

error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error
error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error
error:04093004:rsa routines:OLD_RSA_PRIV_DECODE:RSA lib

但 Redis 也不是总发生这个错误,而是某些页面出现这个错误,应该是某些地方影响到了,后来一步步debug,发现是在执行 openssl_pkey_get_private 函数之后,再 Redis get数据就会出现上述错误。


openssl_pkey_get_private 貌似也是没问题的,因为能加密解密,但的确是它影响到 Redis。但如果将 openssl_pkey_get_private 移到 Redis get 之前,也是没问题。才发现不是 Redis 的问题,而是 openssl_pkey_get_private() 解析私钥失败导致的 OpenSSL ASN1 错误。Redis 只是代码后面调用,真正报错来源是 OpenSSL 在解析 RSA 私钥时失败。


在 openssl_pkey_get_private 之后,打印 ssh 错误

while ($msg = openssl_error_string()) {
    echo $msg . "\n";
}


输出和上述错误一样,所以报错来源是 OpenSSL 在解析 RSA 私钥。一开始以为是那个key的问题,但用那个key加密解密都没问题,但在本地试了 PHP5, PHP7和PHP8 都没问题。所以也不是PHP 版本的问题。感觉是 openssl 的版本问题,本地版本是 3.6.1 而服务器上是 1.01.


临时的解决办法是在 openssl_pkey_get_private 清空所有 ssl 错误

openssl_pkey_get_private($key);
while ($msg = openssl_error_string());


这样 Redis 就不出错了。


标签: Redis

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。