Не можете ничего подписать с помощью PHP openssl_sign? - PullRequest
3 голосов
/ 29 декабря 2011

Я пытаюсь использовать 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 продолжает падать?

Ответы [ 3 ]

2 голосов
/ 16 июля 2014

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

1 голос
/ 01 августа 2013

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

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

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

т.е.

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

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

т.е.

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

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

1 голос
/ 31 декабря 2011

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