2011-12-29 20 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進行檢索。只要我切換到基於文件的解決方案,一切都開始奏效。