2012-05-15 99 views
2

如果我使用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很好的發揮?這些例子雖然簡單但卻準確地符合我的需求。在現實世界中,我只有數據,簽名和公鑰...

回答

1

對於phpseclib,調用$ rsa-先試$ rsa-> setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1)>驗證()。

+0

目前的Crypt_RSA文檔似乎表明PKCS1是默認的。但是,我沒有嘗試在驗證之前顯式調用setSignatureMode,因此您可能很正確。由於我的代碼已經移動,並且現在測試起來很不方便,所以給了你懷疑的好處(以及複選標記)。感謝您的回覆... –

+0

默認爲CRYPT_RSA_SIGNATURE_PSS。它提供更好的安全性,但不兼容。 – neubert

2

我真的希望有人會在公鑰問題上給出明確的答案。似乎它應該工作。但是,在此期間,我已經從公鑰轉換爲自簽名證書。 PHP中的openssl庫似乎很滿意從中提取可接受的公鑰。這意味着真正的問題(驗證簽名數據)解決了我的問題。服務器客戶端現在將擁有數據,簽名和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);