使用gSOAP进行相互SSL身份验证

时间:2012-02-14 11:36:22

标签: c ssl gsoap mutual-authentication

我正在尝试连接需要相互SSL身份验证的SOAP服务。

我们创建了一个自签名证书并将其传输给服务运营商,以便他们验证我们的连接。同样,他们向我们发送了他们的证书副本。

通过使用openssl s_client并手动输入HTTP请求,标头和SOAP内容,我已成功连接到从服务获取预期的SOAP响应。 我使用类似于以下的参数来成功连接:

openssl s_client -connect example.com:443 -key my_key.pem -cert my_cert.pem -pass file:my_passphrase
  • my_key.pem 是我的私钥的文件名
  • my_cert.pem 是转发给服务运营商的自签名证书的文件名。
  • my_passphrase 包含私钥的密码。

我现在正尝试使用gSOAP及其C绑定来访问相同的服务。我按照http://www.cs.fsu.edu/~engelen/soapdoc2.html处的文档来创建服务WSDL的绑定,并添加了对soap_ssl_client_context()的调用以建立SSL连接,但我遇到了问题。

我假设我应该使用 my_key.pem 的路径作为keyfile参数,但是使用gdb,我可以看到它是对SSL_CTX_use_certificate_chain_file()的调用失败了。 gSOAP将keyfile参数作为file参数传递给此调用。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

解决方案是gSOAP希望证书和密钥位于相同文件中。

来自gSOAP文档中的SSL Certificates and Key Files

  

密钥文件(client.pem和server.pem)是通过将私钥PEM与证书PEM连接而创建的。

您可以通过将两个文件连接在一起来实现此目的。使用Unix工具cat很简单。在shell提示符下,使用与问题相同的文件名:

$ cat my_cert.pem my_key.pem > my_certkey.pem

其中my_certkey.pem是输出文件。现在,您可以使用my_certkey.pem的路径作为soap_ssl_client_context()调用中的密钥文件参数。

openssl s_clientcurl等工具会将连接的key-cert文件理解为-cert选项的参数,并使用密钥和证书。