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

时间:2011-12-29 19:00:37

标签: php openssl dkim

我正在尝试使用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") ;

所以很明显这里真的很糟糕。但是我知道我的私钥和公钥是有效的。我甚至尝试了comments for 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 2008年7月1日”已在PHP中安装并处于活动状态。我生成的密钥和密钥都已知工作。那么为什么openssl_sign会一直失败呢?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

<?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

答案 2 :(得分:1)

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

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

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

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

包括函数外的文件停止了错误。

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

我希望这会有所帮助。