Как использовать закодированный закрытый ключ PKCS8 в переполнении стека

Следующий код в Java делает эту работу:

        InputStream is = CipherRunnable.class.getClassLoader().getResourceAsStream("privateKey.pem");
byte[] bytes = new byte[is.available()];
is.read(bytes);
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(bytes);
KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance("RSA");
Key key = keyFactory.generatePrivate(privateKeySpec);

Каков эквивалентный код в PHP?

2

Решение

Вот как вы можете создавать открытые / закрытые ключи PKCS8 в PHP, используя phpseclib, чистая реализация PHP RSA:

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

$rsa = new Crypt_RSA();

$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS8);

extract($rsa->createKey());

echo $privatekey . "\r\n\r\n";
echo $publickey;
2

Другие решения

Если вы хотите использовать только OpenSSL, то, похоже, нет никаких функций PKCS8 для PHP, которые я могу найти; любая версия OpenSSL, которую вы используете, является форматом по умолчанию.

Вот что я в итоге сделал, любезно этот ответ и Документация OpenSSL RSA Tool. Примечание. Я создаю совершенно новые самозаверяющие сертификаты / ключи, поэтому, если вы этого не сделаете, вы можете пропустить все, кроме последних нескольких строк:

<?php
// Create the private and public key
$sslConfig = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);

$privKey = openssl_pkey_new($sslConfig);

$csrConfig = array(
"countryName" => "yourcountry",
"stateOrProvinceName" => "yourstate",
"localityName" => "yourcity",
"organizationName" => "yourcompany",
"organizationalUnitName" => "yourorg",
"commonName" => "your.domain.name");

// create a certificate signing request
$csr = openssl_csr_new($csrConfig, $privKey, $sslConfig);
// self-sign for 365 days
$signed = openssl_csr_sign($csr, null, $privKey, 365, $sslConfig);

// Extract the public certificate
openssl_x509_export($signed, $sslCert);

// Extract the private key (in default openssl format, which for 1.x will be PKCS8 / "PRIVATE KEY" format)
openssl_pkey_export($privKey, $sslKey);

// Convert private key to RSA ("traditional" / "SSLeay" / "RSA PRIVATE KEY") format
exec('echo '.escapeshellarg($sslKey).' | openssl rsa -outform PEM 2>/dev/null', $output, $return_var);

$traditionalSslKey = implode("\n", $output);

var_dump($traditionalSslKey); // private key
var_dump($sslcert); // certificate (public key is available via openssl_pkey_get_public($sslcert))
0

По вопросам рекламы [email protected]