2012-05-27 37 views
4

我試圖用PHP加載openssl cli工具生成的私鑰。 我用下面的命令和PHP代碼:Openssl和PHP

的OpenSSL genrsa -des3 4096退房手續private.key

if (!($key = openssl_pkey_get_private("file://private.key", "password"))); 
{ 
     return false; 
} 

我敢肯定的密碼是正確的,該文件也是PEM格式化,但它不斷返回false。我究竟做錯了什麼?

在此先感謝, Jori。

+2

使用openssl_error_string()函數找出錯誤信息是什麼:http://www.php.net/manual/en/function.openssl-error-string.php – Jeroen

+0

啊哈,會試試看!如果我沒有成功,我會再次在這裏發帖。非常感謝。 – Jori

+0

非常奇怪......我現在通過省略錯誤檢查來工作。看起來像openssl_pkey_get_private()不會在所有錯誤上返回false。這是一個已知的錯誤,還是我錯了? – Jori

回答

4

這是一個容易得多,只是把鑰匙在VAR:

$public = "-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfmlc2EgrdhvakQApmLCDOgP0n 
NERInBheMh7J/r5aU8PUAIpGXET/8+kOGI1dSYjoux80AuHvkWp1EeHfMwC/SZ9t 
6rF4sYqV5Lj9t32ELbh2VNbE/7QEVZnXRi5GdhozBZtS1gJHM2/Q+iToyh5dfTaA 
U8bTnLEPMNC1h3qcUQIDAQAB 
-----END PUBLIC KEY-----"; 

$private = "-----BEGIN RSA PRIVATE KEY----- 
MIICXAIBAAKBgQDfmlc2EgrdhvakQApmLCDOgP0nNERInBheMh7J/r5aU8PUAIpG 
XET/8+kOGI1dSYjoux80AuHvkWp1EeHfMwC/SZ9t6rF4sYqV5Lj9t32ELbh2VNbE 
/7QEVZnXRi5GdhozBZtS1gJHM2/Q+iToyh5dfTaAU8bTnLEPMNC1h3qcUQIDAQAB 
AoGAcbh6UFqewgnpGKIlZ89bpAsANVckv1T8I7QT6qGvyBrABut7Z8t3oEE5r1yX 
UPGcOtkoRniM1h276ex9VtoGr09sUn7duoLiEsp8aip7p7SB3X6XXWJ9K733co6C 
dpXotfO0zMnv8l3O9h4pHrrBkmWDBEKbUeuE9Zz7uy6mFAECQQDygylLjzX+2rvm 
FYd5ejSaLEeK17AiuT29LNPRHWLu6a0zl923299FCyHLasFgbeuLRCW0LMCs2SKE 
Y+cIWMSRAkEA7AnzWjby8j8efjvUwIWh/L5YJyWlSgYKlR0zdgKxxUy9+i1MGRkn 
m81NLYza4JLvb8/qjUtvw92Zcppxb7E7wQJAIuQWC+X12c30nLzaOfMIIGpgfKxd 
jhFivZX2f66frkn2fmbKIorCy7c3TIH2gn4uFmJenlaV/ghbe/q3oa7L0QJAFP19 
ipRAXpKGX6tqbAR2N0emBzUt0btfzYrfPKtYq7b7XfgRQFogT5aeOmLARCBM8qCG 
tzHyKnTWZH6ff9M/AQJBAIToUPachXPhDyOpDBcBliRNsowZcw4Yln8CnLqgS9H5 
Ya8iBJilFm2UlcXfpUOk9bhBTbgFp+Bv6BZ2Alag7pY= 
-----END RSA PRIVATE KEY-----"; 

if (!$privateKey = openssl_pkey_get_private($private)) die('Loading Private Key failed'); 
if (!$publicKey = openssl_pkey_get_public($public)) die('Loading Public Key failed'); 

我還將包括一個小的編碼/解碼例如:

$encrypted = ''; 
$decrypted = ''; 

$plaintext = 'This is just some text to encrypt'; 

echo '<p>$plaintext = ' . $plaintext . '<p>'; 

if (!openssl_public_encrypt($plaintext, $encrypted, $publicKey)) die('Failed to encrypt data'); 

echo '<p>$encrypted = ' . $encrypted . '<p>'; 

if (!openssl_private_decrypt($encrypted, $decrypted, $privateKey)) die('Failed to decrypt data'); 

echo '<p>$decrypted = ' . $decrypted . '<p>'; 

或者以防萬一你可以用php生成密鑰:

$NEW_KEY = openssl_pkey_new(array(
    'private_key_bits' => 1024, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
     )); 

openssl_pkey_export_to_file($NEW_KEY, 'private.key'); 

$NEW_KEY_DETAILS = openssl_pkey_get_details($NEW_KEY); 
file_put_contents('public.key', $NEW_KEY_DETAILS['key']); 

openssl_free_key($NEW_KEY); 
+1

啊哈,我在file_get_contents之後將文件路徑傳入'openssl_pkey_get_private()'並傳遞結果,我不再有錯誤。感謝你的令人驚訝的徹底的例子。 –

6

請注意file://path/to/file.pem在文檔中是指文件協議+文件路徑。在像操作系統這樣的UNIX中,這就像file:///rsa_private_key.pem。在路徑字符串中有THREE斜槓,而不是TWO。並且file://不能省略。

+0

這應該是被接受的答案;我正在走上一條道路,並沒有意識到需要協議的功能。 – M1ke