在OSX上读取p12证书时,写权限错误(OSStatus -61)


Write permissions error (OSStatus -61) when reading p12 certificate on OSX

我试图通过cURL在OSX 10.9上加载文件以下命令在从我的用户帐户完成时工作正常,但通过PHP (user_www)完成时失败

 curl https://test.test.com:8443 -sslv3 --cert /Users/[my account]/Sites/sandbox/certificate.p12:password --cert-type P12

得到的错误是:

* SSL: Can't load the certificate "/Users/[my account]/Sites/sandbox/certificate.p12" and its private key: OSStatus -61

写权限错误;不是出版商,但_www已经读过了。对文件夹的写权限。

当使用证书的通用名称(我手动添加到我的系统钥匙链)时,调用从我自己的帐户和_www都可以正常工作

curl https://test.test.com:8443 -sslv3 --cert [the common name]

我想让它与p12文件一起工作,这样我就可以在生产服务器上使用与我在开发机器上相同的代码。使用普通的php cURL库不是一个选择,因为它还不支持--cert参数(它似乎使用旧的--cafile,这在OSX 10.9中不支持)

终于找到解决办法了:-)

首先,你需要使用OpenSSL(默认使用安全传输)和PHP使用这个curl(默认使用系统curl)编译你自己的curl。

编译和安装Homebrew:

brew install curl --with-openssl
brew install php56 --with-homebrew-curl

然后使用Linux下的PEM格式的证书发送curl请求(只有OS X的curl支持P12格式,使用Secure Transport进行编译)

例如,使用HTTPful发送客户端认证请求:

Request::get('https://127.0.0.1:12345/ping')->authenticateWithCert(
    'client-auth.crt',
    'client-auth.key'
);

关于-61错误,我想这是因为PHP在Apache(在_www下运行)没有访问密钥链的权限。安全传输将首先将P12证书导入登录密钥链(这会导致此错误),然后从它签名请求(这会提示并请求许可)。

我尝试在我的帐户下运行Apache,但仍然遇到这个问题。这可能与不同的环境变量有关。