Создание открытых и открытых ключей OpenSSL

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

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

ОБНОВЛЕНИЕ 1

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

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

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

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

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

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

Вот сценарий оболочки, который я использую для создания сертификатов с помощью 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 / private / cakey_nopass.pem

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

В конце вы получите папку с указанным вами именем (имя файла), содержащее: cert в формате pem (filename.pem), cert в формате crt (filename.crt), cert in der (двоичный формат, (filename.der) ), сертификат в защищенном паролем формате .p12 (filename.p12), защищенный секретный ключ сертификата (filename_Password.key) и закрытый секретный ключ cert, не защищенный паролем. (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 

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

Вот PHP-коды для генерации PRIVATE и PUBLIC KEYS:

=== метод 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) =======

включить эту [phpec open-source library] [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); ?> в <?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); ?> в <?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); ?>