Я пытаюсь использовать 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
. Как только я переключился на файловое решение, все приступило к работе.