问题 PHP stream_context_set_option SSL证书为字符串


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

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

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

例如:

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

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

在此先感谢大家!


10042
2017-07-09 21:12


起源

您是否考虑将其写入临时文件,将名称作为参数传递,然后删除文件? - Maerlyn
我非常认真地考虑它,但特别想知道如果没有在解密状态下将文件存储(甚至暂时)存储在磁盘上,是否可以这样做。遗憾的是,这可能是唯一的方法。 - Roger Thomas
我认为临时文件是唯一的方法;我检查了PHP源代码和指定时间 local_cert 它最终调用OpenSSL函数 SSL_CTX_use_PrivateKey_file 它从文件系统中读取文件。似乎没有办法用PHP在内存中指定密钥。 - drew010
感谢Maerlyn和drew010如果您将其作为正确答案提交,我很乐意接受您的一条评论。再说一遍,谢谢你:) - Roger Thomas
查看来源,@ drew010值得信赖。 - Maerlyn


答案:


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

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

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


7
2017-07-09 21:54





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

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

//rest of your code go there

4
2017-07-16 09:54



谢谢你。这可能是最好的主意,但我仍然希望看到PHP允许更直接的注入。这样的事情让我感到沮丧。不过,谢谢:) - Roger Thomas