2011-12-29 111 views
3

我正在尝试使用PHP-DKIM发送DKIM签名的电子邮件。它的一老一少所以我不得不改变一些事情,但这个树桩我:不能用PHP openssl_sign签署任何东西?

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继续失败?

+2

你有没有试过检查'openssl_error_string()'的错误信息?上面的代码或多或少适用于我。 – duskwuff 2011-12-29 19:58:42

+0

我能够得到它的工作,但我的SSL版本是从源生成的,是0.9.8分支(2011年2月0.9.8r)的最新版本。不知道它与你正在使用的版本有什么关系,但它可能是PHP或OpenSSL中的某种错误。如果给出伪造私钥,或者某些OpenSSL函数未能读取密钥,则会返回该错误消息。这可能是来自php源的对“BIO_new_mem_buf”或“PEM_read_bio_PrivateKey”的调用失败。我认为密钥不受密码保护,因为这可能会导致问题呢? – drew010 2011-12-29 20:22:37

+0

为什么它的价值也是 - 我得到相同的“提供的关键参数不能被强制...”错误,如果我通过'false'作为'$ pkeyid',这是你会得到'openssl_get_privatekey'失败。 – duskwuff 2011-12-29 21:23:04

回答

1

我有同样的错误出现使用PHP-DKIM

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

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

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

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

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

我希望这有助于。

+0

这可能是真正的问题。 IIRC我将它包含在函数中来限制范围。不幸的是,我无法证实这一点,因为它是一个我甚至无法访问的旧项目。 – TheLQ 2013-08-01 09:22:07

1

个人而言,我会推荐使用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 
1

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