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


Следующий код на 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?

Author: Farshid Zaker, 2014-10-15

2 answers

Вот как вы можете создать открытые/закрытые ключи 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
Author: arredodo, 2014-10-18 15:22:30

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

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

<?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
Author: willbradley, 2017-03-20 10:18:17