2012-01-13 253 views
1

我有一個任務:爲銀行生成私鑰/公鑰對。生成OpenSSL私鑰和公鑰

應該包括像州,城市,公司,名稱,電子郵件和其他一些數據的用戶數據。我如何使用PHP或Shell生成這些密鑰?

更新1

我需要一個銀行私鑰和證書。

回答

3

PHP的報價爲interface to OpenSSL functions。您需要生成證書(密鑰對不能包含用戶數據),這比生成密鑰對要複雜一些。您可以生成自簽名證書(在這種證書中,頒發者和主題字段是相同的),這可能是您需要的。

如果您需要一個CA簽名證書,而您需要生成一個證書籤名請求(CSR)和一個私鑰,然後將CSR發送給證書頒發機構,簽名並將證書發回給您(請記住那個私鑰仍然在你身邊,所以你需要保存它)。

另外,google search揭示了good tutorial for you

+0

@JevgeniSmirnov,這聽起來像你試圖實施一個CA(從這個意義上說,你將不得不頒發證書)。有[框架](http://www.openca.org/projects/openca/)這樣做。另外,你不應該有私人密鑰,只有發放證書的實體應該。 (如果不能期望用戶使用更具體的工具生成CSR,那麼瀏覽器中的密鑰生成可以從用戶的角度提供幫助。) – Bruno 2012-01-13 11:15:54

1

私有&公鑰對不包含名稱和地址等標識信息。證書(以及證書請求,因爲這些證書是要轉換成證書的)。

openssl命令可以生成密鑰對和證書請求,也可以簽署證書請求以生成證書。首先,找出你需要的對象類型,是否需要使用中央CA來簽署證書等......然後,您應該能夠輕鬆找到需要傳遞哪些參數的信息以生成每種類型的對象。

+0

哦。那我怎麼才能生成證書,在哪裏可以找到更多信息,而不僅僅是一些奇怪的例子? – 2012-01-13 09:17:04

+0

通過使用CA私鑰(僅生成一次)簽署證書請求(您可能從用戶獲得)來生成證書。請更詳細地瞭解您需要的PKI體系結構類型,然後在遇到困難時詢問具體問題。 – Celada 2012-01-13 09:20:11

0

你需要什麼類型的私人/公共?有人說你這樣做必須提供algory或密鑰類型。有大量的私鑰/公鑰類型,不僅是RSA。

1

這是一個用於使用openssl生成證書的shell腳本。 這只是我寫的一個測試腳本,所以你可能想要設置一些額外的安全性。把密碼寫在某個地方不是一個好主意。您可能希望在測試環境中徹底運行它,或者根據需要進行調整。

這裏是它要求:

  1. 一個適當的CA證書,自己的私鑰等,我假設你已經擁有了它。 (我生成一個自簽名之一,我非常有它的demoCA文件夾,或者你就可以使用/usr/share/ssl/misc/CA.sh -newca)
  2. Openssl的
  3. 文本文件(證書。輸入)具有所需數據{國家,州,城市,公司,組織,通用名等所有內容在換行}
  4. 用於確認輸入的文本文件(caconfirm.input)(用於說'是')
  5. 密碼。 (pass.input)我將使用MyPassword作爲我所有與證書相關的密碼。

只有1個要求,ca私鑰文件不應該被密碼保護。如果是,你可以運行:

OpenSSL的RSA -in demoCA /私營/ cakey.pem退房手續 demoCA /私營/ cakey_nopass.pem

可以說我保存的文件名在CERT_FILE_NAME。

最後,您將獲得一個文件夾,其中包含以下名稱(文件名): cert in pem格式(filename.pem),cert in crt格式(filename.crt),cert in der(二進制格式, (filename.der)),以受密碼保護的.p12格式(filename.p12),證書私鑰密碼保護(filename_Password.key)和證書私鑰非密碼保護證書。 (filename_NoPassword.key)

#!/bin/sh 
CERT_FILE_NAME=$1 

#Lets generate a typical private key 
openssl genrsa -passout pass:MyPassword -des3 -out ${CERT_FILE_NAME}_Password.key 1024 

#Now, generate a cert signing request, and recieve the data from cert.input  
openssl req -passin pass:MyPassword -new -key ${CERT_FILE_NAME}_Password.key -out ${CERT_FILE_NAME}.csr < cert.input 

#Sign the csr with the private key of our CA, and recieve the confirmation from caconfirm.input 
openssl ca -in ${CERT_FILE_NAME}.csr -cert demoCA/cacert.pem -keyfile demoCA/private/cakey_nopass.pem -out ${CERT_FILE_NAME}.crt -days 3825 < caconfirm.input 

#Export my new cert to a password protected p12 file 
openssl pkcs12 -passin pass:MyPassword -passout pass:MyPassword -export -in ${CERT_FILE_NAME}.crt -inkey ${CERT_FILE_NAME}_Password.key -out ${CERT_FILE_NAME}.p12 

#(Optional) Export my private key to a plain text private key 
openssl rsa -passin file:pass.input -in ${CERT_FILE_NAME}_Password.key -out ${CERT_FILE_NAME}_NOPassword.key 

# Output the crt into strict pem format having BEGIN/END lines 
grep -A 1000 BEGIN ${CERT_FILE_NAME}.crt > ${CERT_FILE_NAME}.pem 

# Convert the pem into der (binary) format 
openssl x509 -outform der -in ${CERT_FILE_NAME}.pem -out ${CERT_FILE_NAME}.der 

# Create a directory 
mkdir ${CERT_FILE_NAME} 

# Move all my cert files in the folder 
mv ${CERT_FILE_NAME}*.* ${CERT_FILE_NAME} 

現在我們使用的(在新行每個項目)的文本文件的內容:

cert.input:

Country 
State 
CityName 
CompanyName 
OrgName 
CommonName 

pass.input:

MyPassword 

caconfirm.input:

y 
y 
0

下面是PHP代碼生成私鑰和公鑰:

===方法A)====

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

// getting private-key 
openssl_pkey_export($pk_Generate, $pk_Generate_Private); // we pass 2nd argument as reference 

// getting public-key 
$pk_Generate_Details = openssl_pkey_get_details($pk_Generate); 
$pk_Generate_Public = $pk_Generate_Details['key']; 

// free resources 
openssl_pkey_free($pk_Generate); 

// getting/importing public-key using PEM format 
// $pk_Generate_Private now gets into PEM format... 
// this is an alternative method compared to above used "public retrieval" 
$pk_Import = openssl_pkey_get_private($pk_Generate_Private); // importing 
$pk_Import_Details = openssl_pkey_get_details($pk_Import); // same method to get public key, like in previous 
$pk_Import_Public = $pk_Import_Details['key']; 
openssl_pkey_free($pk_Import); // cleanup 

// see output 
echo "\r\n\r\n".$pk_Generate_Private."\r\n\r\n".$pk_Generate_Public."\r\n\r\n".$pk_Import_Public ."\r\n\r\n".'Public keys are '.(strcmp($pk_Generate_Public,$pk_Import_Public)?'different':'identical').'.'; 
?> 

====方法B)=======

包括此[phpsec開源庫] [1](與[實施例] [2]),然後執行:

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

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

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

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

$cert_Issuer = new File_X509(); 
$cert_Issuer->setPrivateKey($priv_Key); 
$cert_Issuer->setDN($object->getDN()); 

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

$result = $x_509->sign($cert_Issuer, $object); 
echo "the stunnel.pem contents are as follows:\r\n\r\n".$priv_Key->getPrivateKey()."\r\n\r\n".$x_509->saveX509($result); 
?>