Создать OpenSSL закрытые и открытые ключи - PullRequest
1 голос
/ 13 января 2012

У меня есть задача: сгенерировать пары закрытых / открытых ключей для банков.

Должны быть включены данные пользователя, такие как штат, город, компания, имя, адрес электронной почты и некоторые другие данные. Как я могу генерировать эти ключи с помощью PHP или Shell?

ОБНОВЛЕНИЕ 1

Мне нужен закрытый ключ и сертификат для банка.

Ответы [ 5 ]

3 голосов
/ 13 января 2012

PHP предлагает интерфейс с функциями OpenSSL . Вам необходимо сгенерировать сертификат (пара ключей не может включать пользовательские данные), и это немного сложнее, чем создание пары ключей. Вы можете создавать самозаверяющие сертификаты (в таких сертификатах поля Issuer и Subject идентичны), что, вероятно, вам и нужно.

Если вам нужен сертификат, подписанный ЦС, вам нужно сгенерировать запрос на подпись сертификата (CSR) и закрытый ключ, а затем отправить CSR в центр сертификации, который его подпишет, и отправить вам сертификат обратно (помните, что закрытый ключ остается на вашей стороне, поэтому вам нужно сохранить его).

Кроме того, Поиск в Google показал хорошее руководство для вас .

1 голос
/ 14 февраля 2013

Вот сценарий оболочки, который я использую для генерации сертификатов с использованием openssl. Это всего лишь тестовый сценарий, который я написал, так что вы можете установить дополнительную безопасность. Наличие паролей, написанных где-то, не очень хорошая идея. Возможно, вы захотите запустить его полностью в своей тестовой среде или настроить по своему усмотрению.

Вот что требуется:

  1. Надлежащий сертификат CA, собственный закрытый ключ и т. Д., Я полагаю, он у вас уже есть. (Я сгенерировал самоподписанный файл, и он будет у меня в папке demoCA. Или вы можете сгенерировать с помощью /usr/share/ssl/misc/CA.sh -newca)
  2. Openssl
  3. Текстовый файл (cert.input) с необходимыми данными {Страна, штат, город, компания, организация, общее имя и т. Д. Все в новой строке}
  4. Текстовый файл (caconfirm.input) для ввода подтверждения (для ответа «да»)
  5. Текстовый файл для паролей. (pass.input) Я буду использовать MyPassword для всех моих паролей, связанных с сертификатом.

Существует только 1 требование, файл закрытого ключа ca не должен быть защищен паролем. Если это так, вы можете запустить:

openssl rsa -in demoCA / private / cakey.pem -out demoCA / частный / cakey_nopass.pem

Допустим, я сохранил имя файла в CERT_FILE_NAME.

В конце вы получите папку с указанным вами именем (имя файла), содержащую: сертификат в формате pem (filename.pem), сертификат в формате crt (filename.crt), сертификат в 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
1 голос
/ 13 января 2012

Пары личного и открытого ключей не содержат идентифицирующей информации, такой как имя и адрес. Сертификаты (а также запросы на сертификаты, поскольку они должны быть превращены в сертификаты).

Команда openssl может генерировать как пары ключей, так и запросы сертификатов, а также может подписывать запросы сертификатов для создания сертификатов. Во-первых, выясните, какие именно объекты вам нужны, нужно ли вам использовать центральный ЦС для подписи сертификатов и т. Д. Затем вы сможете легко найти информацию о том, какие аргументы вам нужно передать для генерации каждого типа объекта. .

0 голосов
/ 23 января 2016

Вот 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); 
?>
0 голосов
/ 13 января 2012

Какой тип частного / общественного вам нужен?Кто-то, кто сказал вам сделать это, должен предоставить алгоритм или тип ключей.Существует огромное разнообразие типов закрытых / открытых ключей, не только RSA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...