PHP 调用 openssl_pkey_get_private 之后 Redis (SSL连接) 出现错误
之前是一直没问题的,后来修改 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 就不出错了。