2011-12-29 33 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") ; 

は本当に悪い何かがここで起こっています。しかし、私は自分の秘密鍵と公開鍵が有効であることを知っています。私も何をすべきかの損失で

$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; 

私は動作しませんでしたcomments for openssl_signで提供される例のキーを試してみました。 OpenSSL "0.9.8e-fips-rhel5 2008年7月1日"がPHPにインストールされ、アクティブになっています。私が生成したキーとそのキーの両方が正常に動作しています。だからopenssl_signはなぜ失敗しますか?

+2

エラーメッセージのために 'openssl_error_string()'を試してみましたか?上記のコードは多かれ少なかれ私のために働きます。 – duskwuff

+0

私もそれを動作させることができましたが、私のSSLバージョンはソースから構築され、0.9.8ブランチ(0.9.8r 2011年2月)の最新バージョンです。あなたが使っているバージョンとは何の関係もないことは確かですが、これはPHPやOpenSSLのバグです。このエラーメッセージは、偽の秘密鍵が与えられている場合、または特定のOpenSSL関数が鍵の読み取りに失敗した場合に返されます。 PHPソースからの 'BIO_new_mem_buf'や' PEM_read_bio_PrivateKey'への呼び出しに失敗している可能性があります。私はキーを取るそれは同様に問題を引き起こすかもしれないので、パスワードで保護されていないですか? – drew010

+0

これは価値があります。また、 ''提供されたキーパラメータは強制できません... ''$ pkeyid'として' false'を渡すとエラーが発生します。これは 'openssl_get_privatekey'が失敗した場合に得られるものです。 – duskwuff

答えて

1

私は同じエラーがあなたのコードの残りの部分を見ずにPHP-DKIM

を使用して発生していた、それはすることは困難ですそれが同じ理由であるかどうかを確認してください。

しかし、私の問題は、PHP-DKIMスクリプトを関数内に組み込んでいることでした。機能外のファイルを含む、すなわち

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

は、エラーを停止しました。私はこれが役に立てば幸い

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

すなわち

+0

それは実際に問題の可能性があります。 IIRC私はそれをスコープを制限する関数の中に入れました。残念ながら私はもうこれ以上アクセスできない古いプロジェクトからこれを確認することはできません。 – TheLQ

1

個人的には、純粋なPHP RSA実装のphpseclibを使用することをお勧めします。例えば。以下が示すようにOpenSSLと完全に相互運用可能である

<?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 dgst -sha1 -prverify privatekey.txt -signature signature plaintext.txt 
1

私は今日この問題を抱えていましたが、問題は多少異なりました。私はprivateKeyをファイルに格納するのではなく、PHPで文字列として返し、file_get_contentsを使用して取得しました。ファイルベースのソリューションに切り替えるとすぐに、すべてが機能し始めました。

関連する問題