我正在尝试连接需要相互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
我现在正尝试使用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
参数传递给此调用。
非常感谢任何帮助。
答案 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_client
和curl
等工具会将连接的key-cert文件理解为-cert
选项的参数,并使用密钥和证书。