Невозможность проверки подписи openssl в PHP

Если я использую openssl для создания новой пары ключей, использую закрытый ключ для подписи некоторых данных и использую открытый ключ для проверки подписи... это работает.

$ openssl genrsa -out mykey.pem 1024
$ openssl rsa -in mykey.pem -pubout > mypubkey.pem
$ echo 'It could be bunnies' > file.txt
$ openssl rsautl -sign -in file.txt -inkey mykey.pem -out sig.txt
$ openssl rsautl -verify -in sig.txt -inkey mypubkey.pem -pubin
It could be bunnies

Однако, если я попытаюсь проверить подпись с помощью библиотеки openssl в php, это не удастся.

$pubkey = openssl_pkey_get_public(file_get_contents('/var/key/mypubkey.pem')); 
$sig = file_get_contents('/var/key/sig.txt');
$data = file_get_contents('/var/key/file.txt');
$verifyResult = (openssl_verify($data, $sig, $pubkey) == 1);

Похожая история с Crypt_RSA

$pubkey = file_get_contents('/var/test/mypubkey.pem');
$sig = file_get_contents('/var/test/sig.txt');
$data = file_get_contents('/var/test/file.txt');
$rsa = new Crypt_RSA();
$rsa->loadKey($pubkey);
$rsa->verify($data, $sig);
$verifyResult = $rsa->verify($data, $sig);

Как заставить php нормально играть? Эти примеры упрощены, но точно соответствуют моим потребностям. В реальном мире у меня будут только данные, подпись и открытый ключ...


person John Turner    schedule 15.05.2012    source источник


Ответы (2)


Для phpseclib попробуйте $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1) перед вызовом $rsa->verify().

person user1350492    schedule 15.05.2012
comment
Текущая документация Crypt_RSA, похоже, предполагает, что по умолчанию используется PKCS1. Однако я не пытался явно вызывать setSignatureMode перед проверкой, так что вы вполне можете быть правы. Даю вам преимущество сомнения (и галочки), так как мой код продвинулся вперед, и теперь его неудобно тестировать. Спасибо за ответ... - person John Turner; 17.05.2012
comment
По умолчанию используется CRYPT_RSA_SIGNATURE_PSS. Он предлагает лучшую безопасность, но не так совместим. - person neubert; 17.05.2012

Я действительно надеялся, что кто-нибудь ответит на вопрос об открытом ключе. Вроде должно работать. Однако тем временем я перешел с открытого ключа на самозаверяющий сертификат. Библиотека openssl в PHP, кажется, довольна извлечением из этого приемлемого открытого ключа. Это означает, что настоящая проблема (проверка подписанных данных) для меня решена. Клиенты сервера теперь будут иметь данные, подпись и сертификат x.509.

Вот фрагмент кода.

$ openssl genrsa -out server.key 4096
$ openssl req -new -key server.key -out server.csr
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
$ openssl dgst -sha1 -sign server.key -out file.sha1 file.txt

...

$pubkey = openssl_pkey_get_public(file_get_contents('/var/key/server.crt')); 
$sig = file_get_contents('/var/key/file.sha1');
$data = file_get_contents('/var/key/file.txt');
$verifyResult = (openssl_verify($data, $sig, $pubkey) == 1);
person John Turner    schedule 15.05.2012