PHP stream_context_set_option SSL证书为字符串

Rog*_*mas 11 php ssl curl pem

我有一个奇怪的问题.基本上,我需要这样做:

 $handle = stream_context_create();
 stream_context_set_option($handle , 'ssl', 'local_cert', '/tmp/cert');
Run Code Online (Sandbox Code Playgroud)

然而.证书不作为服务器中的文件保存.相反,它是在集群数据库环境中保存的加密字符串.因此,证书的物理内容不是证书作为文件名指针.因此,我需要指定证书的内容,而不是使用文件名.

例如:

 $cert = '-----BEGIN CERTIFICATE-----....
 upWbwmdMd61SjNCdtOpZcNW3YmzuT96Fr7GUPiDQ
 -----END CERTIFICATE-----';
Run Code Online (Sandbox Code Playgroud)

有没有人知道我到底怎么做到这一点?我正在为这个问题摸不着头脑,但我的直觉本能说它是可行的.

在此先感谢大家!

dre*_*010 7

正如Maerlyn所说,似乎唯一的方法是将证书从内存写入临时文件,调用函数,发出请求,然后删除临时文件.

我查看了PHP源代码(此处为相关代码),当您发出将使用SSL的请求时,它会检查local_cert是否设置了context选项,如果是,则最终调用OpenSSL函数SSL_CTX_use_PrivateKey_file,该函数从磁盘读取证书文件.

请注意,在执行请求之前,文件不会被读取,因此您不能在请求之后删除临时文件,而不是在调用之后删除stream_context_set_option.


131*_*131 5

我尝试使用stream_wrapper(php://内存和自定义流包装器)但没有成功:-(。至少,您可以创建一个随机临时文件,将其注册为在关闭时删除,然后运行代码

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

//rest of your code go there
Run Code Online (Sandbox Code Playgroud)