生成OpenSSL私钥和公钥

时间:2012-01-13 09:09:39

标签: php ssl openssl ssl-certificate

我有一项任务:为银行生成私钥/公钥对。

应包括状态,城市,公司,名称,电子邮件等一些用户数据。我如何用PHP或Shell生成这些键?

更新1

我需要银行的私钥和证书。

5 个答案:

答案 0 :(得分:3)

PHP提供interface to OpenSSL functions。您需要生成证书(密钥对不能包含用户数据),这比生成密钥对要复杂一些。您可以生成自签名证书(在此类证书中,Issuer和Subject字段相同),这可能就是您所需要的。

如果您需要CA签名证书,而不是需要生成证书签名请求(CSR)和私钥,请将CSR发送到将对其签名的证书颁发机构并将证书发回给您(请记住私钥仍然在你身边,所以你需要保存它)。

此外,google search显示了good tutorial for you

答案 1 :(得分:1)

私钥和公钥对不包含名称和地址等标识信息。证书具有(以及证书请求,因为这些请求将转换为证书)。

openssl命令可以生成密钥对和证书请求,也可以签署证书请求以生成证书。首先,确切地确定您需要哪种对象,是否需要使用中央CA来签署证书等等......然后您应该能够轻松找到需要传递哪些参数以生成每种类型对象的信息

答案 2 :(得分:1)

这是我用于使用openssl生成证书的shell脚本。 这只是我编写的测试脚本,因此您可能需要设置一些额外的安全性。在某处写密码并不是一个好主意。您可能希望在测试环境中彻底运行它或根据需要进行调整。

以下是它的要求:

  1. 一个合适的CA证书,它自己的私钥等,我假设你已经拥有它。 (我生成了一个自签名的,我会把它放在demoCA文件夹中。或者你可以使用/usr/share/ssl/misc/CA.sh -newca生成)
  2. Openssl的
  3. 文本文件(cert.input)具有所需数据{国家,州,城市,公司,组织,公用名等所有新行}}
  4. 确认输入的文本文件(caconfirm.input)(用于说“是”)
  5. 密码的文本文件。 (pass.input)我将使用MyPassword获取所有与证书相关的密码。
  6. 只有1个要求,ca私钥文件不应受密码保护。如果是,您可以运行:

      

    openssl rsa -in demoCA / private / cakey.pem -out   demoCA /私人/ cakey_nopass.pem

    假设我在CERT_FILE_NAME中存储了文件名。

    最后,您将获得一个文件夹,其中包含您提供的名称(文件名),其中包含: pem格式的证书(filename.pem),crt格式的证书(filename.crt),证书(二进制格式,(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
    

答案 3 :(得分:0)

您需要什么类型的私人/公众?说你这样做的人必须提供algorythm或类型的密钥。有各种各样的私钥/公钥类型,而不仅仅是RSA。

答案 4 :(得分:0)

以下是生成PRIVATE和PUBLIC KEYS的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](带[examples] [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); 
?>