php的openssl扩展版本兼容问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php的openssl扩展版本兼容问题相关的知识,希望对你有一定的参考价值。

因为服务器里在跑一些老项目兼容问题很多,一直运行php7.0版本没有升级。在对接微信分时需要使用到AES-256-GCM加密需要调整PHP环境,决定先升级到PHP7.2,升级后发现openssl_sign()报错,排查后做下简单兼容调整说明。

做三方对接时时常会出现问题,尤其是运行环境发生变化时。对于PHP环境主要分为:php版本、扩展库版本。如果出现兼容性问题则首先需要确认环境问题,避免走弯路。

openssl在对接支付等功能时基本上都会使用到,一般三方有对应写好的SDK,通常按指定的环境要求下运行问题不大。但有时SDK并没有太细说明,难免会出现兼容问题。

扩展库版本兼容

openssl版本在1.0.1及以下时要求证书内容分段换行,否则openssl_sign、openssl_verify使用证书的函数会报错,比如:
openssl_sign(): supplied key param cannot be coerced into a private key in

查看php安装的openssl库版本直接通过openssl扩展提供的常量OPENSSL_VERSION_TEXT获取:
var_dump(OPENSSL_VERSION_TEXT);

排查时首先确认证书是否有错、参数是否配置错误,环境是否匹配。
如果扩展库是openssl-1.0.1及以内则证书内容需要分段换行否则无法识别。

或者使用代码处理:

function getPem($filename){
    $pem = file_get_contents($filename);
        if (preg_match(‘/^([^
]{10,64}s+)+$/‘, $pem)){
            return $pem;
        }
    $array = array_map(function($item){
        return chunk_split($item, 64, "
");
    }, explode("
", $pem));
    return implode("", $array);
}

如果发现openssl库版本过低,快速处理办法就是通过函数去整理证书和使用docker,最原始的办法是升级openssl再重新编译PHP。

PHP版本兼容

openssl扩展函数很多,迭代时会有些变化,比如openssl_encrypt()、openssl_decrypt(),两个函数在PHP7.1时增加了新参数支持AEAD(模式GCM和CCM)一种对称加密码算法,官方文档中说作了说明:
https://www.php.net/manual/zh/function.openssl-encrypt.php
https://www.php.net/manual/zh/function.openssl-decrypt.php

AEAD加密在PHP中有个sodium扩展(依赖libsodium库),不过php在openssl中做了一点延升,升级PHP7.1及以上后就不需要再多安装扩展。如果不升级PHP可安装sodium扩展。

以上是关于php的openssl扩展版本兼容问题的主要内容,如果未能解决你的问题,请参考以下文章

Laravel基本使用

php升级openssl扩展,swoole升级openssl扩展,linux安装openssl版本

OpenSSL升级和php加扩展模板openssl

LNMP,PHP开启openssl,功能扩展,K哥

PHP版DES算法加密数据(3DES)另附openssl_encrypt版本

php怎么开启openssl模块