V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rikka
V2EX  ›  程序员

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

  •  
  •   rikka · 2017-12-06 01:28:28 +08:00 · 4068 次点击
    这是一个创建于 2545 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题是这样的,刚好在做一个微信现金红包功能,调用微信接口要传个证书,而这个证书是保存在数据库,那常见做法就是把证书保存到一个文件里,再把文件传给 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 开发组提需求啊
    26 条回复    2017-12-07 02:39:39 +08:00
    dangyuluo
        1
    dangyuluo  
       2017-12-06 01:41:45 +08:00
    感觉需求不大啊,证书这种东西肯定是要本地保存好的,权限设置非常严格。你设置成字符串了,发布到 github 上怎么办
    moult
        2
    moult  
       2017-12-06 01:50:39 +08:00
    同样有需求,甲方要求后台能配置微信的证书,所以也要存到数据库。

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

    只好这样了
    realpg
        7
    realpg  
       2017-12-06 08:54:26 +08:00
    给 php-curl 的 mail list 发邮件啊 说明白你的需求场景 以及庞大的集群应用市场需求 估计会加上的
    azhi
        8
    azhi  
       2017-12-06 09:04:16 +08:00 via Android
    搞不懂,为什么不把文件路径存到库里
    sagaxu
        9
    sagaxu  
       2017-12-06 09:06:17 +08:00 via Android
    加这个功能并不难,自己加一下
    HanSonJ
        10
    HanSonJ  
       2017-12-06 09:08:26 +08:00
    居然没人提 easyWeChat ?
    cevincheung
        11
    cevincheung  
       2017-12-06 09:20:07 +08:00
    @HanSonJ #10 easywechat 也是传递一个文件名
    cevincheung
        12
    cevincheung  
       2017-12-06 09:20:22 +08:00
    换 python 吧 celery 大法好
    liverpool08
        13
    liverpool08  
       2017-12-06 09:28:42 +08:00
    @cevincheung php 也可以用 gearman 甚至 php-resqueue 或者 beanstalkd 实现吧 类似 celery 功能的东西太多了
    mcfog
        14
    mcfog  
       2017-12-06 09:44:47 +08:00 via Android
    试试看 data stream wrapper? http://php.net/manual/en/wrappers.data.php
    cevincheung
        15
    cevincheung  
       2017-12-06 09:51:03 +08:00
    刚看了看 python 的 requests 是这么判定的
    pynix
        16
    pynix  
       2017-12-06 12:17:46 +08:00
    换一个 http client
    klesh
        17
    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
        18
    iyaozhen  
       2017-12-06 16:31:25 +08:00
    这个估计还是需求少。正常来说证书肯定是个文件。自己处理下吧,系统初始化的时候生成证书文件
    rikka
        19
    rikka  
    OP
       2017-12-06 16:44:49 +08:00
    这个问题还是有不少场景的

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

    很蛋疼,各种 http client 都是基于 curl,无解,所以这世界最好的语言让我情何以堪
    realpg
        20
    realpg  
       2017-12-06 17:15:03 +08:00
    @rikka #19
    针对你吐槽的这个问题,六年还没完成这个需求,根本原因是六年了,有这个需求的你都没把这个需求的迫切性让开发维护 php-curl 的人知道
    rikka
        21
    rikka  
    OP
       2017-12-06 18:16:39 +08:00
    @realpg 哎,惭愧,英文烂而且我还都不知道怎么联系他们
    shiny
        22
    shiny  
       2017-12-06 18:22:38 +08:00
    可以写邮件到 php.dev 新闻组里。
    realpg
        23
    realpg  
       2017-12-06 19:06:09 +08:00
    @rikka #21
    当年都是从英文烂过来的 别怕说别怕用
    alex321
        24
    alex321  
       2017-12-06 19:51:14 +08:00 via Android
    用了 #3 的方法。
    gejigeji
        25
    gejigeji  
       2017-12-06 20:25:35 +08:00
    python 吧 想怎么来怎么来
    g079708
        26
    g079708  
       2017-12-07 02:39:39 +08:00 via iPhone
    找鸟哥试一下?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   987 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:43 · PVG 03:43 · LAX 11:43 · JFK 14:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.