11

奇妙な問題があります。基本的に、私はこれを行う必要があります:

 $handle = stream_context_create();
 stream_context_set_option($handle , 'ssl', 'local_cert', '/tmp/cert');

でも。証明書はサーバー内にファイルとして保持されません。むしろ、クラスター化されたデータベース環境で保持される暗号化された文字列です。したがって、証明書がファイル名ポインターではなく、証明書の物理的な内容です。そのため、ファイル名を使用する代わりに、証明書の内容を指定する必要があります。

例えば:

 $cert = '-----BEGIN CERTIFICATE-----....
 upWbwmdMd61SjNCdtOpZcNW3YmzuT96Fr7GUPiDQ
 -----END CERTIFICATE-----';

一体どうやってこれができるのか、誰か知っていますか?私はこの問題に頭を悩ませていますが、私の本能はそれが実行可能であると言います。

みなさん、よろしくお願いします!

4

2 に答える 2

8

Maerlyn が言ったように、これを行う唯一の方法は、証明書をメモリから一時ファイルに書き込み、関数を呼び出し、要求を行い、一時ファイルを削除することです。

PHP ソース コード (関連するコードはこちら) を調べたところ、SSL を使用するリクエストを行うと、local_certコンテキスト オプションが設定されているかどうかがチェックされ、設定されている場合は、最終的にディスクから証明書を読み取るOpenSSL 関数SSL_CTX_use_PrivateKey_fileが呼び出されます。ファイル。

リクエストが実行されるまでファイルは読み取られないことに注意してください。そのため、 を呼び出した後ではなく、リクエストが完了するまで一時ファイルを削除できませんstream_context_set_option

于 2012-07-09T21:54:53.890 に答える
4

stream_wrapper (php://memory & カスタム ストリーム ラッパー) を使用しようとしましたが、成功しませんでした :-(。少なくとも、ランダムな一時ファイルを作成し、シャットダウン時に削除されるように登録してから、コードを実行できます。

$tmp_file = tempnam(sys_get_temp_dir(), "key");
register_shutdown_function("unlink",  $tmp_file);

//rest of your code go there
于 2014-07-16T09:54:26.777 に答える