【问题标题】:Error using ssl cert with PHP将 ssl 证书与 PHP 一起使用时出错
【发布时间】:2010-10-23 00:29:46
【问题描述】:

我是 php 新手,尝试加载证书时遇到此错误

jameys-macbookpro41:~ user$ php -f ~/Sites/providerService.php

警告:stream_socket_client():无法设置本地证书链文件 `cert.pem';检查您的 cafile/capath 设置是否在第 27 行的 /Users/jamey/Sites/providerService.php 中包含您的证书及其颁发者的详细信息

cert.pem 与 php 文件位于同一文件夹中。文件 cert.pem 是在 Apple 钥匙串工具中创建的

class pushNotifications {
...
     private $sslPem = 'cert.pem';
...
     function connectToAPNS(){
          $streamContext = stream_context_create();
          stream_context_set_option($streamContext, 'ssl', 
             'local_cert', $this->sslPem);

感谢您的帮助!

【问题讨论】:

    标签: php sockets ssl


    【解决方案1】:

    您收到一个错误,因为它试图在您运行脚本的目录中查找您的 cert.pem 文件,而不是脚本所在的目录。在您的示例中,它是您的用户目录“~”。

    尝试将您的课程更改为此,或类似的:

    class pushNotifications {
    ...
         private $sslPem = 'cert.pem';
    ...
         function connectToAPNS(){
              $streamContext = stream_context_create();
              stream_context_set_option($streamContext, 'ssl', 'local_cert', dirname(__FILE__) . '/' . $this->sslPem);
    

    【讨论】:

    • 我现在已经越过了那条线,所以我假设已修复它,谢谢!!
    • 原来这不是(全部)现在我明白了。警告:stream_socket_client():无法设置本地证书链文件`/Users/jamey/Sites/cert.pem';检查您的 cafile/capath 设置是否在第 29 行的 /Users/jamey/Sites/providerService.php 中包含您的证书及其颁发者的详细信息
    • 您使用的是自签名证书吗?
    • 这是我创建证书的方式。选择钥匙串访问 > 证书助手 > 向证书颁发机构请求证书。后来我右键单击该键并导出 .pem 这是新的推送通知(APNS)。 APNS 仍处于 NDA 之下,但这是一个问题(我认为),因为我缺乏对 PHP 的理解。
    • SSL 证书在链接机制上工作,简单地说。您的证书由证书颁发机构使用其证书签名。当客户端(浏览器,或 curl 在您的情况下)尝试“使用”您的证书时,它会想要验证或“查找”签署它的实体。
    【解决方案2】:

    我也遇到了这个问题,结果由于某种原因我的私钥与我拥有的 aps_developer_identity.cer 相关联的私钥不匹配...

    我最终从我的“登录”钥匙串项中清除了 所有我的公钥和私钥,然后我重新开始了整个过程(生成了请求)...我提交了新请求程序门户上的文件并生成新证书,下载并通过双击安装它(developer_identity.cer)。然后,我重置配置文件以使用新的 Push SSL 证书,下载并通过双击 (aps_developer_identity.cer) 安装它们。最后,我重置了配置文件并下载了新的。我在 Xcode Organizer 中清除了旧的,并安装了新的。最后,我将我的“私有”密钥导出为 key.p12,将我的 aps_developer_identity.cer 导出为 apsdi.p12,并对它们运行以下命令:

    openssl pkcs12 -clcerts -nokeys -out apsdi.pem -in apsdi.p12
    openssl pkcs12 -nocerts -out key.pem -in key.p12
    

    如果您可以使用密码(推荐用于生产):

    cat apsdi.pem key.pem > cert.pem
    

    如果您希望使用“空白”密码短语,您需要先解密您的私钥,使用您在将其转换为 pem 格式时指定的密码

    openssl rsa -in key.pem -out key.unencrypted.pem
    

    然后将证书和未加密的密钥放入 apns.pem(或您选择的任何文件名):

    cat apsdi.pem key.unencrypted.pem > apns.pem
    

    将您的 aps_developer_identity 证书导出为非常重要,而不是将您的 developer_identity 证书导出为 apsdi.pem。

    如果您可以在 Keychain Access 中扩展您的 developer_identity.cer 和 aps_developer_identity.cer 条目,并且在您这样做时看到一个“私有”密钥,那么一切都应该正常工作。

    【讨论】:

    • 没问题 :-) 很高兴至少有人发现它有用!
    【解决方案3】:

    作为补充提示,对于遇到相同问题的任何人:从 Apple 的钥匙串访问导出私钥并转换为 .pem 时,请指定密码。

    由于某种原因,似乎在其中一个导出中留下空白密码会删除私钥,因此最终的 .pem 不完整。

    所以请输入一个虚拟密码,即使您稍后使用 openssl 将其删除。

    【讨论】:

    • 这对我有用。导出证书/密钥时不使用密码不会生成有效的 .pem 文件。
    【解决方案4】:

    未来的注意事项(因为这一切而头疼之后): 1. 如果您收到握手错误 - 您创建的 pem 文件可能是错误的。

    一个。确保该文件与您尝试运行的 php 位于同一目录中。 湾。在钥匙串访问实用程序中导出证书 p12 文件及其下的密钥。这两个文件的大小相同,但它们不同。 C。在 macintosh 终端中执行上述“openssl”命令。

    1. 目前,我能做的就是以 sudo 运行 php,因为 ck.pem 的 chmod 400。必须给予一些东西......

    顺便说一句,当系统正常运行时,“无法启用加密”的消息将消失。

    【讨论】:

      【解决方案5】:

      只需将所有者更改为 www-data 即可:)

      sudo chown www-data.www-data ck.pem

      apache www-data 的默认用户

      【讨论】:

        猜你喜欢
        • 2013-08-03
        • 2011-02-16
        • 1970-01-01
        • 2015-07-15
        • 2023-04-06
        • 1970-01-01
        • 2010-10-18
        • 2011-02-07
        • 2012-09-23
        相关资源
        最近更新 更多