【问题标题】:Certificate not accepted. Unable to set private key file不接受证书。无法设置私钥文件
【发布时间】:2016-02-03 11:38:51
【问题描述】:

我尝试通过 SoapClient 建立连接。我需要一个证书。我收到了 .pfx 证书。我使用以下命令创建了一个 .pem 文件。

openssl pkcs12 -in cert.pfx -out cert.pem -nodes

证书中有密码,所以我需要在获取 cert.pem 文件之前输入密码。到目前为止一切顺利,我认为。

现在我尝试连接到 WSDL 服务。

$url = "https://test.website.com/webservices/transfer.asmx?WSDL";
$cert = '/path/to/cert.pem';
$passphrase = "12345678";                                               

$soapClient = new SoapClient($url, array('local_cert'=>$cert,'passphrase'=>$passphrase));

我收到以下错误:

(警告)SoapClient::SoapClient(): 无法设置私钥文件`/var/www/vhosts/............./cert.pem'

我认为问题出在证书上。我将 .pfx 转换为 .pem 的方式是否正确?

【问题讨论】:

  • 我仍然有这个问题。找到了这个。注意:在此处包含“-nodes”标志将防止使用密码来加密私钥。无论是否输入密码,我都会遇到同样的错误。
  • 该证书是公共证书还是私人证书?
  • 你为什么用-nodes而不是-clcerts

标签: php soap certificate pem pfx


【解决方案1】:

您遇到的问题是.pem 证书始终应该是加密文件。根据OpenSSL docs for the pkcs12 command,当您使用-nodes 时,它没有加密任何内容,而是将每个节点都放入纯文本中,这导致.pem 证书无效,您的SoapClient 无法解析无效文件。

要解决这个问题,希望你没有删除原始的cert.pfx,只需使用此行重新转换即可:

openssl pkcs12 -in cert.pfx -out cert.pem -clcerts

您的cert.pem 文件将是正确的。

【讨论】:

  • 你是我今天最喜欢的人!泰!在尝试了一百零一种方法获得正确的证书之后,这终于做到了。然后$soapClient = new \SoapClient($wsdl, ['local_cert' => 'cert.pem', 'passphrase' => 'Entered PEM pass phrase', 'trace' => 1, 'exceptions' => 0]);,您可以使用$soapClient->__getFunctions();检索所有给定的方法
【解决方案2】:

今天我遇到了无效证书/私人组合的问题,这意味着证书不属于指定的密钥。

您可以使用以下方法验证此问题:

openssl rsa  -noout -modulus -in server.key | openssl md5
openssl x509 -noout -modulus -in server.crt | openssl md5

key 和 cert 应该返回相同的校验和。如果不是,则有人混淆了一些文件。

同样的程序也适用于 CSR:

# and for a CSR
openssl req -noout -modulus -in server.csr | openssl md5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多