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

回到顶部