• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rikka
V2EX  ›  程序员

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

  •  
  •   rikka · Dec 6, 2017 · 4554 views
    This topic created in 3108 days ago, the information mentioned may be changed or developed.
    问题是这样的,刚好在做一个微信现金红包功能,调用微信接口要传个证书,而这个证书是保存在数据库,那常见做法就是把证书保存到一个文件里,再把文件传给 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 replies    2017-12-07 02:39:39 +08:00
    dangyuluo
        1
    dangyuluo  
       Dec 6, 2017
    感觉需求不大啊,证书这种东西肯定是要本地保存好的,权限设置非常严格。你设置成字符串了,发布到 github 上怎么办
    moult
        2
    moult  
       Dec 6, 2017
    同样有需求,甲方要求后台能配置微信的证书,所以也要存到数据库。

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

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

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

    很蛋疼,各种 http client 都是基于 curl,无解,所以这世界最好的语言让我情何以堪
    realpg
        20
    realpg  
    PRO
       Dec 6, 2017
    @rikka #19
    针对你吐槽的这个问题,六年还没完成这个需求,根本原因是六年了,有这个需求的你都没把这个需求的迫切性让开发维护 php-curl 的人知道
    rikka
        21
    rikka  
    OP
       Dec 6, 2017
    @realpg 哎,惭愧,英文烂而且我还都不知道怎么联系他们
    shiny
        22
    shiny  
    PRO
       Dec 6, 2017
    可以写邮件到 php.dev 新闻组里。
    realpg
        23
    realpg  
    PRO
       Dec 6, 2017
    @rikka #21
    当年都是从英文烂过来的 别怕说别怕用
    alex321
        24
    alex321  
       Dec 6, 2017 via Android
    用了 #3 的方法。
    gejigeji
        25
    gejigeji  
       Dec 6, 2017
    python 吧 想怎么来怎么来
    g079708
        26
    g079708  
       Dec 7, 2017 via iPhone
    找鸟哥试一下?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1339 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 17:14 · PVG 01:14 · LAX 10:14 · JFK 13:14
    ♥ Do have faith in what you're doing.