6

PHP で作成および使用される RSA キーの作成/使用に問題があります。問題は、(公開および秘密)キーを異なるサーバー間で交換する必要があることです(たとえば、ユーザーアカウントが移動した場合)。

現在、PHP の openssl-lib は、キーが作成される形式に関する詳細情報を提供していません。http://php.net/manual/en/function.openssl-pkey-export.phpの最新のドキュメントには、「PEM 形式」であるとだけ記載されていますが、PKCS#1 であるか、またはPKCS#8

さらに、次のコードが示すように、秘密鍵 PEM のヘッダーとトレーラーは PHP のバージョンによって異なります。

<?php
$config = array(
    "digest_alg" => 'sha512',
        "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA
);
$keyPair = openssl_pkey_new($config);
$privateKey = NULL;
openssl_pkey_export($keyPair, $privateKey);
var_dump($privateKey);
$keyDetails = openssl_pkey_get_details($keyPair);
$publicKey = $keyDetails['key'];
var_dump($publicKey);
die();
?>

異なるものを出力します:

PHP v 5.4:

string(3272) "-----BEGIN PRIVATE KEY-----
MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqA//...
-----END PRIVATE KEY-----
"

string(800) "-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAO//...
-----END PUBLIC KEY-----
"

PHP v5.5:

string(3272) "-----BEGIN RSA PRIVATE KEY-----
MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqA//...
-----END RSA PRIVATE KEY-----
"

string(800) "-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAO//...
-----END PUBLIC KEY-----
"

PHP v 5.6:

string(3272) "-----BEGIN PRIVATE KEY----- 
MIIJQgIBADANBggsdisdVUCJDSQCjqgl2XqzR+bSv//...
-----END PRIVATE KEY-----
"

string(800) "-----BEGIN PUBLIC KEY----- 
MIICIjANBgkqhkiG9w0BsdvQEFAAOdfAg8AMIICFAgEAo6oJdl6s0fm0r7QlaN/U//...
-----END PUBLIC KEY----- 
"

そのため、使用している PHP のバージョンに基づいて、秘密鍵のヘッダー/トレーラーが変更されます。これは実際の問題ではありませんが、結局のところ、"RSA" を使用してキー ヘッダーを作成するシステムは、たとえば openssl_sign() の場合、"RSA" を使用せずにユーザー キーを作成することはできません。 「提供されたキーを秘密キーに強制できませんでした」というエラー...そして、これが厄介なところです。

https://tls.mbed.org/kb/cryptography/asn1-key-structures-in-der-and-pemによると、ヘッダーに「RSA」を含む秘密鍵の PEM 形式とそれらの形式を区別する必要があります。なし、PKCS#1 および PKCS#8 である、つまり、アルゴリズムなどに関する追加情報があるかどうか。

このため、深刻な問題に直面しています。PHP5.6 用に作成された同じソフトウェアは、PHP5.5 では実行できません。5.5 ヘッダーを 5.6 互換ヘッダーに手動で置き換えることで回避策を使用できますが、これは単なる「汚いハック」です。これに対処する「良い」方法はありますか?

セットアップ時に、この置換コードは秘密鍵を作成し、ヘッダーを抽出して「記憶」しようとします。実行時に使用されるすべてのキーがチェックされます。見つかったヘッダーが「ローカル」ヘッダーに適合しない場合は、交換する必要があります。

しかし、どの形式を使用するかを設定できる、ある種の設定オプション (まだ見つけることができていません) があると思いますか?

次に、より興味深い質問: openssl によって正確に作成される形式は何ですか? PKCS#1? PKCS#8? これも設定可能ですか?

4

1 に答える 1