我有一个奇怪的问题。基本上,我需要这样做:
$handle = stream_context_create();
stream_context_set_option($handle , 'ssl', 'local_cert', '/tmp/cert');
然而。证书不作为服务器中的文件保存。相反,它是在集群数据库环境中保存的加密字符串。因此,证书的物理内容不是证书作为文件名指针。因此,我需要指定证书的内容,而不是使用文件名。
例如:
$cert = '-----BEGIN CERTIFICATE-----....
upWbwmdMd61SjNCdtOpZcNW3YmzuT96Fr7GUPiDQ
-----END CERTIFICATE-----';
有没有人知道我到底怎么做到这一点?我正在为这个问题摸不着头脑,但我的直觉本能说它是可行的。
在此先感谢大家!
正如Maerlyn所说,似乎唯一的方法是将证书从内存写入临时文件,调用函数,发出请求,然后删除临时文件。
我查看了PHP源代码(相关代码 这里)当您发出将使用SSL的请求时,它会检查是否 local_cert
设置了context选项,如果是,则最终调用OpenSSL函数 SSL_CTX_use_PrivateKey_file 从磁盘文件中读取证书。
请注意,在执行请求之前,文件不会被读取,因此您不能在请求之后删除临时文件,而不是在调用之后 stream_context_set_option
。
我尝试使用stream_wrapper(php://内存和自定义流包装器)但没有成功:-(。至少,您可以创建一个随机临时文件,注册它以在关机时删除,然后运行代码
$tmp_file = tempnam(sys_get_temp_dir(), "key");
register_shutdown_function("unlink", $tmp_file);
//rest of your code go there