Следующий код в 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?
Вот как вы можете создавать открытые / закрытые ключи 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;
Если вы хотите использовать только 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))