我有一个任务:为银行生成私钥/公钥对。生成OpenSSL私钥和公钥
应该包括像州,城市,公司,名称,电子邮件和其他一些数据的用户数据。我如何使用PHP或Shell生成这些密钥?
更新1
我需要一个银行私钥和证书。
我有一个任务:为银行生成私钥/公钥对。生成OpenSSL私钥和公钥
应该包括像州,城市,公司,名称,电子邮件和其他一些数据的用户数据。我如何使用PHP或Shell生成这些密钥?
更新1
我需要一个银行私钥和证书。
PHP的报价为interface to OpenSSL functions。您需要生成证书(密钥对不能包含用户数据),这比生成密钥对要复杂一些。您可以生成自签名证书(在这种证书中,颁发者和主题字段是相同的),这可能是您需要的。
如果您需要一个CA签名证书,而您需要生成一个证书签名请求(CSR)和一个私钥,然后将CSR发送给证书颁发机构,签名并将证书发回给您(请记住那个私钥仍然在你身边,所以你需要保存它)。
私有&公钥对不包含名称和地址等标识信息。证书(以及证书请求,因为这些证书是要转换成证书的)。
openssl
命令可以生成密钥对和证书请求,也可以签署证书请求以生成证书。首先,找出你需要的对象类型,是否需要使用中央CA来签署证书等......然后,您应该能够轻松找到需要传递哪些参数的信息以生成每种类型的对象。
哦。那我怎么才能生成证书,在哪里可以找到更多信息,而不仅仅是一些奇怪的例子? – 2012-01-13 09:17:04
通过使用CA私钥(仅生成一次)签署证书请求(您可能从用户获得)来生成证书。请更详细地了解您需要的PKI体系结构类型,然后在遇到困难时询问具体问题。 – Celada 2012-01-13 09:20:11
你需要什么类型的私人/公共?有人说你这样做必须提供algory或密钥类型。有大量的私钥/公钥类型,不仅是RSA。
这是一个用于使用openssl生成证书的shell脚本。 这只是我写的一个测试脚本,所以你可能想要设置一些额外的安全性。把密码写在某个地方不是一个好主意。您可能希望在测试环境中彻底运行它,或者根据需要进行调整。
这里是它要求:
只有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
下面是PHP代码生成私钥和公钥:
<?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').'.';
?>
包括此[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);
?>
@JevgeniSmirnov,这听起来像你试图实施一个CA(从这个意义上说,你将不得不颁发证书)。有[框架](http://www.openca.org/projects/openca/)这样做。另外,你不应该有私人密钥,只有发放证书的实体应该。 (如果不能期望用户使用更具体的工具生成CSR,那么浏览器中的密钥生成可以从用户的角度提供帮助。) – Bruno 2012-01-13 11:15:54