6 年过去了, PHP 的 curl 还没支持 CURLOPT_SSL_CTX_FUNCTION 这个选项

2017-12-06 01:28:28 +08:00
 rikka
问题是这样的,刚好在做一个微信现金红包功能,调用微信接口要传个证书,而这个证书是保存在数据库,那常见做法就是把证书保存到一个文件里,再把文件传给 curl,但是这样太不优雅了,就不能直接把证书内容传给 curl ?找了一圈,6 年前一个帖子
https://stackoverflow.com/questions/7958892/passing-pem-and-key-as-string-in-curl-using-php
libcurl 的作者说有个 CURLOPT_SSL_CTX_FUNCTION 选项可以来搞定但是 php 好像不支持

我感觉如今应该早就支持了吧,查了文档没有,不死心去看 php 源码,死心了确实不支持
所以我大 PHP 这个问题居然就这样就无解了,心碎 T_T

是不是没人给 php 开发组提需求啊
3966 次点击
所在节点    程序员
26 条回复
dangyuluo
2017-12-06 01:41:45 +08:00
感觉需求不大啊,证书这种东西肯定是要本地保存好的,权限设置非常严格。你设置成字符串了,发布到 github 上怎么办
moult
2017-12-06 01:50:39 +08:00
同样有需求,甲方要求后台能配置微信的证书,所以也要存到数据库。

@dangyuluo #1, 如果仅仅为了这类用户的安全的话,那肯定是拦不住的,你不让他设置成字符串,他就把证书放到项目路径下面,同样发布到 GitHub 了~~~
xfspace
2017-12-06 01:54:30 +08:00
CURLOPT_SSLCERT 一个包含 PEM 格式证书的文件名。
是不是在说这个东西?
rikka
2017-12-06 01:58:03 +08:00
@xfspace 是的,它只能传个文件名参数
dangyuluo
2017-12-06 08:23:11 +08:00
还真有这个需求,像这种异步操作我们会采用队列的形式用 python 去处理。php 只负责向这个队列里加任务
lxrmido
2017-12-06 08:43:53 +08:00
生成临时文件->传输文件->删除临时文件

只好这样了
realpg
2017-12-06 08:54:26 +08:00
给 php-curl 的 mail list 发邮件啊 说明白你的需求场景 以及庞大的集群应用市场需求 估计会加上的
azhi
2017-12-06 09:04:16 +08:00
搞不懂,为什么不把文件路径存到库里
sagaxu
2017-12-06 09:06:17 +08:00
加这个功能并不难,自己加一下
HanSonJ
2017-12-06 09:08:26 +08:00
居然没人提 easyWeChat ?
cevincheung
2017-12-06 09:20:07 +08:00
@HanSonJ #10 easywechat 也是传递一个文件名
cevincheung
2017-12-06 09:20:22 +08:00
换 python 吧 celery 大法好
liverpool08
2017-12-06 09:28:42 +08:00
@cevincheung php 也可以用 gearman 甚至 php-resqueue 或者 beanstalkd 实现吧 类似 celery 功能的东西太多了
mcfog
2017-12-06 09:44:47 +08:00
试试看 data stream wrapper? http://php.net/manual/en/wrappers.data.php
cevincheung
2017-12-06 09:51:03 +08:00
刚看了看 python 的 requests 是这么判定的
pynix
2017-12-06 12:17:46 +08:00
换一个 http client
klesh
2017-12-06 16:18:07 +08:00
换 node.js 吧, request 库只接收 Buffer 类型, 妥妥的
```
var fs = require('fs')
, path = require('path')
, certFile = path.resolve(__dirname, 'ssl/client.crt')
, keyFile = path.resolve(__dirname, 'ssl/client.key')
, caFile = path.resolve(__dirname, 'ssl/ca.cert.pem')
, request = require('request');

var options = {
url: 'https://api.some-server.com/',
cert: fs.readFileSync(certFile),
key: fs.readFileSync(keyFile),
passphrase: 'password',
ca: fs.readFileSync(caFile)
};
```
iyaozhen
2017-12-06 16:31:25 +08:00
这个估计还是需求少。正常来说证书肯定是个文件。自己处理下吧,系统初始化的时候生成证书文件
rikka
2017-12-06 16:44:49 +08:00
这个问题还是有不少场景的

比如极端情况,没有可写的目录,只能存数据库
换语言是不可能,比如你是给人二开程序或者原项目就是 php
还有比如程序是运行在 php 的虚拟主机,队列啥的都折腾不了了
还有各种历史遗留问题,证书就是存在数据库的

很蛋疼,各种 http client 都是基于 curl,无解,所以这世界最好的语言让我情何以堪
realpg
2017-12-06 17:15:03 +08:00
@rikka #19
针对你吐槽的这个问题,六年还没完成这个需求,根本原因是六年了,有这个需求的你都没把这个需求的迫切性让开发维护 php-curl 的人知道

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/412332

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX