2011-03-24 147 views
6

我試圖將一些.p12文件轉換爲.pem。使用PHP和OpenSSL將P12轉換爲PEM

我的Mac上一切正常,沒有任何交互,因爲我把密碼中的代碼,但是當我使用此代碼:

system('openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12 -passin pass:'); 
system('openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12 -passout pass:1234 -passin pass:'); 
system('openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem -passin pass:1234'); 
system('cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem'); 

它使空白文件。

我的文件權限是755和密碼分別設置沒什麼經過的所以在這裏這就是爲什麼他們是空白......所有的代碼,而無需系統()在MAC終端工程..

感謝閱讀。希望你能幫到

+0

是否有避免內置['openssl_pkcs12_read'](http://us2.php.net/manual/en/function.openssl-pkcs12-read.php)函數的特殊原因? – Charles 2011-03-24 18:26:03

+0

@Charles如果它的工作,我會使用它,但我不知道如何實現與我想要的。 – user633268 2011-03-24 19:10:47

+1

@user,它返回的數據是一個包含私鑰的數組,這似乎是您要在此處提取的內容。您應該可以使用['openssl_pkey_export_to_file'](http://us3.php.net/manual/en/function.openssl-pkey-export-to-file.php)或['openssl_pkey_export'](http:/ /us3.php.net/manual/en/function.openssl-pkey-export.php)獲取PEM格式的密鑰。 – Charles 2011-03-24 19:31:06

回答

19
$filename = 'apns-dev-cert.p12'; 
$password = '...'; 
$results = array(); 
$worked = openssl_pkcs12_read(file_get_contents($filename), $results, $password)); 
if($worked) { 
    echo '<pre>', print_r($results, true), '</pre>'; 
} else { 
    echo openssl_error_string(); 
} 

請嘗試運行這段代碼。將$password設置爲需要打開文件的任何密碼。如果沒有密碼,請將其設置爲空。我不相信你的openssl命令是需要的。

應該得到所需的私鑰輸出,可能在$results['pkey']內。

如果你看到你的私鑰存在,那麼你可以把它傳遞給openssl_pkey_export得到它在PEM格式,然後你就可以寫一個文件:

$new_password = null; 
$result = null; 
$worked = openssl_pkey_export($results['pkey'], $result, $new_password); 
if($worked) { 
    echo "<pre>It worked! Your new pkey is:\n", $result, '</pre>'; 
} else { 
    echo openssl_error_string(); 
} 

設置$new_password您所需的p鍵的密碼,如果你想要一個。

應該爲你工作,根據我正在閱讀的各種文檔頁面。


如果你真的繼續通過炮擊了使用openssl命令,請考慮使用proc_open代替system,這樣就可以適當地捕捉錯誤消息。

OpenSSL也有可能試圖讀取配置文件,並且沒有這樣的權限,儘管它應該給你一個關於這個的錯誤。

+0

謝謝,你會如何爲證書位創建一個文件?感謝你的所有幫助,令人驚歎。 – user633268 2011-03-25 14:28:23

+0

從PKCS12文件中讀取證書後,該證書*可能*在'$ result ['cert']'中。你應該可以使用['openssl_x509_export'](http://www.php.net/manual/en/function.openssl-x509-export.php)來完成這項工作。 (小心!如果您複製並粘貼了我的代碼,我會重複使用一些可能會造成問題的變量名稱。您需要相應調整。) – Charles 2011-03-25 15:26:29