无法使用 PHP openssl_sign 签署任何内容?

发布于 2024-12-23 04:21:42 字数 1598 浏览 5 评论 0原文

我正在尝试使用 PHP-DKIM 发送 DKIM 签名的电子邮件。它有点旧,所以我不得不改变一些东西,但这让我很困惑:

Warning: openssl_sign() [function.openssl-sign]: supplied key param cannot be coerced into a private key in /.../pages/user/dkim.php on line 66
Cannot sign

相关的代码部分(注意我添加了 $pkeyid,最初私钥只是直接传递到 open_ssl 功能也不起作用)

$pkeyid = openssl_get_privatekey($open_SSL_priv);
if (openssl_sign($s, $signature, $pkeyid))
    return base64_encode($signature) ;
else
    die("Cannot sign") ;

所以显然这里发生了非常糟糕的事情。但是我知道我的私钥和公钥是有效的。我什至尝试了 针对 openssl_sign 的注释中提供的示例密钥 这不起作用

$open_SSL_pub=<<<EOD
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6
zxqlVzz0wy2j4kQVUC4ZRZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQ==
-----END PUBLIC KEY-----
EOD;

$open_SSL_priv=<<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6zxqlVzz0wy2j4kQVUC4Z
RZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQJAL151ZeMKHEU2c1qdRKS9
sTxCcc2pVwoAGVzRccNX16tfmCf8FjxuM3WmLdsPxYoHrwb1LFNxiNk1MXrxjH3R
6QIhAPB7edmcjH4bhMaJBztcbNE1VRCEi/bisAwiPPMq9/2nAiEA3lyc5+f6DEIJ
h1y6BWkdVULDSM+jpi1XiV/DevxuijMCIQCAEPGqHsF+4v7Jj+3HAgh9PU6otj2n
Y79nJtCYmvhoHwIgNDePaS4inApN7omp7WdXyhPZhBmulnGDYvEoGJN66d0CIHra
I2SvDkQ5CmrzkW5qPaE2oO7BSqAhRZxiYpZFb5CI
-----END RSA PRIVATE KEY-----
EOD;

我不知道该怎么做。 OpenSSL“0.9.8e-fips-rhel5 01 Jul 2008”已在 PHP 中安装并处于活动状态。我生成的密钥和该密钥都已知有效。那么为什么 openssl_sign 总是失败呢?

I am attempting to use PHP-DKIM to send DKIM signed emails. Its a little old so I've had to change some things, but this stumps me:

Warning: openssl_sign() [function.openssl-sign]: supplied key param cannot be coerced into a private key in /.../pages/user/dkim.php on line 66
Cannot sign

Relevant section of code (note I've added the $pkeyid, originally the private key was just passed straight to the open_ssl function which also didn't work)

$pkeyid = openssl_get_privatekey($open_SSL_priv);
if (openssl_sign($s, $signature, $pkeyid))
    return base64_encode($signature) ;
else
    die("Cannot sign") ;

So obviously something really bad is going on here. However I know my private key and public key are valid. I even tried the example key provided in the comments for openssl_sign which didn't work

$open_SSL_pub=<<<EOD
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6
zxqlVzz0wy2j4kQVUC4ZRZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQ==
-----END PUBLIC KEY-----
EOD;

$open_SSL_priv=<<<EOD
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBANDiE2+Xi/WnO+s120NiiJhNyIButVu6zxqlVzz0wy2j4kQVUC4Z
RZD80IY+4wIiX2YxKBZKGnd2TtPkcJ/ljkUCAwEAAQJAL151ZeMKHEU2c1qdRKS9
sTxCcc2pVwoAGVzRccNX16tfmCf8FjxuM3WmLdsPxYoHrwb1LFNxiNk1MXrxjH3R
6QIhAPB7edmcjH4bhMaJBztcbNE1VRCEi/bisAwiPPMq9/2nAiEA3lyc5+f6DEIJ
h1y6BWkdVULDSM+jpi1XiV/DevxuijMCIQCAEPGqHsF+4v7Jj+3HAgh9PU6otj2n
Y79nJtCYmvhoHwIgNDePaS4inApN7omp7WdXyhPZhBmulnGDYvEoGJN66d0CIHra
I2SvDkQ5CmrzkW5qPaE2oO7BSqAhRZxiYpZFb5CI
-----END RSA PRIVATE KEY-----
EOD;

I'm at a loss of what to do. OpenSSL "0.9.8e-fips-rhel5 01 Jul 2008" is installed and active in PHP. Both the key I generated and that key are known working. So why does openssl_sign keep failing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

屋檐 2024-12-30 04:21:42

我今天遇到了这个问题,问题略有不同;我将 privateKey 作为 PHP 中的字符串,而不是存储在文件中并使用 file_get_contents 检索。一旦我切换到基于文件的解决方案,一切就开始工作了。

I had this issue today, and the problem was slightly different; I had my privateKey as string in PHP, rather than stored in a file and retrieved using file_get_contents. As soon as I switched to a file-based solution, everything started to work.

静谧幽蓝 2024-12-30 04:21:42

就我个人而言,我建议使用 phpseclib,一个纯 PHP RSA 实现。例如。

<?php
$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
file_put_contents('signature.txt', $rsa->sign(file_get_contents('plaintext.txt')));
?>

这与 OpenSSL 完全可互操作,如下所示:

openssl dgst -sha1 -prverify privatekey.txt -signature signature plaintext.txt

Personally, I would recommend phpseclib, a pure PHP RSA implementation, be used. eg.

<?php
$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('privatekey.txt'));
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
file_put_contents('signature.txt', $rsa->sign(file_get_contents('plaintext.txt')));
?>

That is fully interoperable with OpenSSL as the following demonstrates:

openssl dgst -sha1 -prverify privatekey.txt -signature signature plaintext.txt
岁月流歌 2024-12-30 04:21:42

我使用 PHP-DKIM 发生了同样的错误,

没有看到你的代码的其余部分,很难看出它是否是出于同样的原因。

但是,我的问题是我将 PHP-DKIM 脚本包含在函数中。

function sendEmail(){
require 'dkim.php';
//DO STUFF HERE
}

在函数之外包含文件可以停止错误。

require 'dkim.php';
function sendEmail(){
//DO STUFF HERE
}

我希望这有帮助。

I had the same error occur using PHP-DKIM

Without seeing the rest of your code, It's difficult to see if it is for the same reason.

However, my issue was that I was including the PHP-DKIM script inside a function.

ie

function sendEmail(){
require 'dkim.php';
//DO STUFF HERE
}

including the file outside the function stopped the error.

ie

require 'dkim.php';
function sendEmail(){
//DO STUFF HERE
}

I hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文