2012-02-14 170 views
0

我正尝试使用需要相互SSL身份验证的SOAP服务进行连接。使用gSOAP进行相互SSL身份验证

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

我已经能够成功连接到通过使用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连接,但我遇到了一个问题。

我认为我应该为keyfile参数使用路径来my_key.pem,但使用gdb的,我可以看到,它是SSL_CTX_use_certificate_chain_file()进行通话的失败。 gSOAP传递keyfile参数作为此调用的参数file

任何帮助,非常感谢。

回答

1

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

SSL Certificates and Key Files的gSOAP的文档中:

的密钥文件(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选项的参数,并使用此处的密钥和证书。