6

プロジェクトで暗号化を扱うのはこれが初めてです。SSL 用のホスティング プロバイダーを使用していますが、機密性の高いデータベースの部分も暗号化したいと考えています。このために、OpenSSL を使用するように言われました。私は自分のローカルホスト (WAMP) でテストしており、OpenSSL をインストールし、PHP と Apache SSL mod を有効にしています。さて、私はチュートリアルに従ってきましたが、いくつかの提案された方法を使用して、公開鍵を生成し、ファイルとして保存することができました。何らかの理由で、秘密鍵を生成できないようです。私が試した 2 つのバージョンのコードを投稿します。

// generate private key
$privateKey = openssl_pkey_new(array(
    'private_key_bits' => 1024,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
// write private key to file
openssl_pkey_export_to_file($privateKey, 'private.key');
// generate public key from private key
$publicKey = openssl_pkey_get_details($privateKey);
// write public key to file
file_put_contents('public.key', $publicKey['key']);
// clear key
echo $privateKey;

?>

これにより public.key ファイルが生成されますが、「openssl_pkey_export_to_file(): パラメーター 1 からキーを取得できません:」および「openssl_pkey_get_details() はパラメーター 1 がリソース、ブール値であると想定しています」という警告が表示されます。

別の方法も試しました:

$config = array(
    "config" => "E:/wamp/bin/apache/apache2.2.22/conf/openssl.cnf",
    "digest_alg" => "sha512",
    "private_key_bits" => 1024,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// Create the private and public key
$res = openssl_pkey_new($config);

// Extract the private key from $res to $privKey
openssl_pkey_export($res, $privKey, NULL);
echo "Private Key: ".$privKey;
// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
echo "Public Key: ".$pubKey;
$data = 'plaintext data goes here';
echo "Data: ".$data;
// Encrypt the data to $encrypted using the public key
openssl_public_encrypt($data, $encrypted, $pubKey);
echo "Encrypted: ".$encrypted;
// Decrypt the data using the private key and store the results in $decrypted
openssl_private_decrypt($encrypted, $decrypted, $privKey);

echo "Decrypted: ".$decrypted;

これはすべてをエコーするはずでしたが、残念ながら私の結果は空の秘密鍵、細かい公開鍵、プレーンテキスト、および暗号化されたテキストであり、復号化しようとするとエラーが発生しました:「openssl_private_decrypt(): キーパラメーターは有効な秘密鍵ではありません」

明らかに、秘密鍵の作成に問題があります。私はインターネットを徹底的に検索しましたが、他のすべての人に役立つと思われる単純なコードを実装したにもかかわらず、修正できませんでした.

前もって感謝します、 エリー・ゼイトウニ

4

6 に答える 6

9

しばらく経ち、すでに解決しているかもしれませんが、私の答えは同じ問題に直面した他の人に役立つと思います(私がしたように)。

したがって、openssl_pkey_export()のドキュメントを見ると、4 つの異なるパラメーターが必要であることがわかります。2 番目の実装を見ると、3 つしか提供していないことがわかります。

openssl_pkey_export($res, $privKey, NULL);

サーバーだけが OPENSSL_CONF 用の適切な環境変数を持っている場合、これは問題ありません。XAMPP でダウンロードされる README-SSL.txt ファイルに引用されているように、openssl.cnf ファイルへのリンクは、PHP からの CSR およびキー生成機能を利用するために必要です。

PHP から CSR およびキー生成関数を使用するには、openssl.cnf ファイルをインストールする必要があります。この目的で使用できるサンプル ファイルが、この readme ファイルと一緒にこのフォルダーに含まれています。

このため、先ほど行ったようにopenssl_pkey_new($config);、config => '/path/to/openssl.cnf' を含む連想配列を作成する必要があります。ちょうどこのような:

openssl_pkey_export($res, $privKey, NULL, $config);

また、私の場合の openssl.cnf のパスが内部にあることも追加したいと思います。

C:\xampp\php\extras\openssl\openssl.cnf

この中には、OPENSSL の設定方法を説明した README-SSL.txt ファイルもあります。

それが役に立てば幸い。:)

于 2014-04-03T19:24:55.207 に答える
4

これをxampp php 5.5を使用してwindows10で動作させることに頭を悩ませました。最後に、上記の tabone の回答は正しい方向であることがわかりました。

C:/xampp/php/extras/openssl/openssl.cnf

これが誰かに役立つことを願っています。

于 2015-09-02T23:39:26.180 に答える
2

私は同じ問題を抱えていました。

そして、それはWindowsの問題です!!!

Unix ベース システムでは発生しません。

そして、私のように Windows を開発のみに使用する場合は、PuTTYGen を使用してキーを生成し、開発環境で静的に使用します。

また

Windows で OpenSSL が機能しない、エラー 0x02001003 0x2006D080 0x0E064002

于 2013-12-18T00:58:16.170 に答える