Нельзя подписывать что-либо с PHP openssl_sign?

Я пытаюсь использовать 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 июля 2008» установлен и активен в PHP. Как ключ, который я сгенерировал, так и тот ключ, как известно, работают. Итак, почему openssl_sign не работает?

У меня была ошибка при использовании PHP-DKIM

Не видя остальной части вашего кода, трудно понять, по той же причине.

Однако моя проблема заключалась в том, что я включил скрипт PHP-DKIM внутри функции.

т.е.

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

включая файл вне функции, остановил ошибку.

т.е.

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

Надеюсь, это поможет.

Лично я бы рекомендовал использовать 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 

Сегодня у меня был этот вопрос, и проблема была несколько иной; У меня был privateKey как строка в PHP, а не хранился в файле и извлекался с помощью file_get_contents . Как только я переключился на файловое решение, все приступило к работе.