2012-11-29 48 views
1

我想使用php生成example.com.crtexample.com.pem。獲取文件的Linux命令是:在php中使用openssl命令

openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes 
      -out example.com.crt -keyout example.com.pem 

我想在兩個字符串中獲取兩個文件內容。什麼是這個PHP的等效代碼?

更新:請不要求執行Linux命令。

回答

0

也許它不是最好的解決方案,但你可以使用exec()和file_get_contents()函數,是這樣的:

exec("openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out example.com.crt -keyout example.com.pem"); 
$crtFile = file_get_contents("example.com.crt"); 
$pemFile = file_get_contents("example.com.pem"); 

注意文件的權限,顯然文件路徑。如果您在這些命令中添加一些錯誤處理,則更好。

瞭解更多:http://php.net/manual/en/function.exec.php

和:http://php.net/manual/en/function.file-get-contents.php

+0

'EXEC'不允許共享hostings。 –

0

有OpenSSL的擴展PHP,你應該檢查一下是不夠的,你因爲這將是更好地使用它insteaf的exec()

http://php.net/manual/en/book.openssl.php

+0

我看到了。但我找不到如何使用它。 –

+0

如果啓用它,則將其用作任何其他PHP方法/函數 - 請參閱鏈接到的文檔 –

1

你可以使用phpseclib, a pure PHP X.509 implementation

http://phpseclib.sourceforge.net/x509/examples.html#selfsigned

<?php 
include('File/X509.php'); 
include('Crypt/RSA.php'); 

// create private key/x.509 cert for stunnel/website 
$privKey = new Crypt_RSA(); 
extract($privKey->createKey()); 
$privKey->loadKey($privatekey); 

$pubKey = new Crypt_RSA(); 
$pubKey->loadKey($publickey); 
$pubKey->setPublicKey(); 

$subject = new File_X509(); 
$subject->setDNProp('id-at-organizationName', 'phpseclib demo cert'); 
//$subject->removeDNProp('id-at-organizationName'); 
$subject->setPublicKey($pubKey); 

$issuer = new File_X509(); 
$issuer->setPrivateKey($privKey); 
$issuer->setDN($subject->getDN()); 

$x509 = new File_X509(); 
//$x509->setStartDate('-1 month'); // default: now 
//$x509->setEndDate('+1 year'); // default: +1 year 

$result = $x509->sign($issuer, $subject); 
echo "the stunnel.pem contents are as follows:\r\n\r\n"; 
echo $privKey->getPrivateKey(); 
echo "\r\n"; 
echo $x509->saveX509($result); 
echo "\r\n"; 
?> 

這將創建一個私有密鑰和一個自簽名的X.509證書(如你的CLI例子所做的)與私鑰對應的公鑰。

0

這裏另一個命令:

<?php 
// generate 2048-bit RSA key 
$pkGenerate = openssl_pkey_new(array(
    'private_key_bits' => 2048, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA 
)); 

// get the private key 
openssl_pkey_export($pkGenerate,$pkGeneratePrivate); // NOTE: second argument is passed by reference 

// get the public key 
$pkGenerateDetails = openssl_pkey_get_details($pkGenerate); 
$pkGeneratePublic = $pkGenerateDetails['key']; 

// free resources 
openssl_pkey_free($pkGenerate); 

// fetch/import public key from PEM formatted string 
// remember $pkGeneratePrivate now is PEM formatted... 
// this is an alternative method from the public retrieval in previous 
$pkImport = openssl_pkey_get_private($pkGeneratePrivate); // import 
$pkImportDetails = openssl_pkey_get_details($pkImport); // same as getting the public key in previous 
$pkImportPublic = $pkImportDetails['key']; 
openssl_pkey_free($pkImport); // clean up 

// let's see 'em 
echo "\n".$pkGeneratePrivate 
    ."\n".$pkGeneratePublic 
    ."\n".$pkImportPublic 
    ."\n".'Public keys are '.(strcmp($pkGeneratePublic,$pkImportPublic)?'different':'identical').'.'; 
?>