Usando certificados SSL de cliente para solicitações PHP cURL no OSX

Usando o Guzzle para interagir com um serviço da web que requer certificados SSL do cliente, eu recebia consistentemente um erro informando que o certificado não podia ser carregado:

$httpClient->send($request, [
'curl' => [
CURLOPT_SSLCERT
=> 'path/to/cert.pem'
]
]);

Erro cURL 58: SSL: Não é possível carregar o certificado e sua chave privada: OSStatus -61

O problema era que o cURL integrado do OSX usa a própria biblioteca de transporte seguro da Apple em vez de OpenSSL e, portanto, apenas os certificados de formato P12 são suportados.

A opção óbvia é converter seu certificado no formato esperado:

$ openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.p12

Se estiver usando o Homebrew, há outra opção.

Por padrão, quando o cURL é instalado via Homebrew, ele usa a biblioteca Secure Transport do sistema. Para reinstalá-lo com OpenSSL:

$ brew rm curl && brew install curl --with-openssl

Então, por padrão, o PHP faz uso da versão do sistema do cURL. Para usar a versão Homebrew de cURL:

$ brew uninstall php56 && brew install php56 --with-homebrew-curl

Reinicie seu servidor da web para carregar a biblioteca PHP atualizada e agora deve suportar o certificado de formato PEM.