PHP与openSSL - 提供的密钥参数不能被强制为私钥
我试图使用openssl_sign()
函数签署文件。我有以下私钥: -----BEGIN EC PRIVATE KEY----- MHQCAQEEIDzQVg9bJ1kZFsZDoLeqadA4OTgKc40ukSmQ3MVzcV0soAcGBSuBBAAK oUQDQgAEvzUNKCE3UVimCLUePomOUH/kfy0ujHdN5Kmn7ez3TtokJDy5ksVnOgf6 WzpmzY46zvKAnQ44Cgx5Kdqx5dVDiw== -----END EC PRIVATE KEY-----
PHP与openSSL - 提供的密钥参数不能被强制为私钥
我正在使用以下函数:openssl_sign("test", $signature, $private_key, OPENSSL_ALGO_SHA256);
。
我有一台服务器可以使用给定的密钥进行签名,而另一台则不能。一个是PHP 5.6,另一个没有PHP 7.1。一台服务器怎么能够使用这个密钥而另一台却不能?
回答:
也许你需要使用openssl_get_privatekey
创建私钥资源,而不是简单地使用字符串
$str_priv_key='-----BEGIN EC PRIVATE KEY----- MHQCAQEEIDzQVg9bJ1kZFsZDoLeqadA4OTgKc40ukSmQ3MVzcV0soAcGBSuBBAAK
oUQDQgAEvzUNKCE3UVimCLUePomOUH/kfy0ujHdN5Kmn7ez3TtokJDy5ksVnOgf6
WzpmzY46zvKAnQ44Cgx5Kdqx5dVDiw==
-----END EC PRIVATE KEY-----';
$pkey=openssl_get_privatekey($str_priv_key);
openssl_sign("test", $signature, $pkey);
openssl_free_key($pkey);
按照PHP manual私钥参数必须是一个资源
> priv_key_id > resource - a key, returned by openssl_get_privatekey()
回答:
第一你应该检查是否启用了OpenSSL。您可以通过输出
phpinfo();
并检查:“启用了OpenSSL支持”。在这种情况下,它是。
为了进一步解决有两个功能,帮助很大:
error_get_last() Usage: print_r(error_get_last());
和
openssl_error_string() Usage: echo openssl_error_string();
在这种情况下, “error_get_last()” 返回:
openssl_sign(): supplied key param cannot be coerced into a private key
和返回的“openssl_error_string()”:
error:100AE081:elliptic curve routines:EC_GROUP_new_by_curve_name:unknown group
此消息表示使用的OpenSSL版本没有代码来处理使用的EC曲线。 “EC_GROUP_new_by_curve_name”搜索“静态常量ec_list_element curve_list []”并且没有找到。结果它返回“未知”。
现在你有3种选择:
- 升级你的OpenSSL支持这种曲线。
- 选择两台服务器都支持的另一条曲线。
- 使用非EC加密。
由于PHP 7.1.0的你可以使用:
openssl_get_curve_names()
获得支持的曲线列表。我不了解PHP 5.6的类似功能,因此您可能需要尝试一些才能获得两台主机上都可用的功能。
作为便笺: 某些Linux发行版(如RedHat和CentOS)使用比其他版本更严格的OpenSSL版本。错误表明在这种情况下,OpenSSL是在旧的(5.8)CentOS版本上手动更新的。网上有一些手册(如https://syslint.com/blog/tutorial/how-to-upgrade-openssl-on-centos-7-or-rhel-7/),它只升级OpenSSL可执行文件。如果使用了这种技术或类似的技术,PHP仍然会使用'旧'OpenSSL,因此,从命令行运行OpenSSL会产生与PHP调用不同的结果。
以上是 PHP与openSSL - 提供的密钥参数不能被强制为私钥 的全部内容, 来源链接: utcz.com/qa/264414.html