我正在尝试连接需要相互SSL身份验证的SOAP服务。
我们创建了一个自签名证书,并将其传输给服务运营商,以便他们验证我们的连接。同样,他们给我们发了一份ssl证书的副本。
通过使用openssls_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
参数传递给此调用。
非常感谢您的帮助。
解决方案是gSOAP希望证书和密钥位于同一文件中。
来自gSOAP文档中的SSL证书和密钥文件:
密钥文件(client.pem和server.pem)是通过连接私钥pem和证书pem来创建的。
您可以通过将两个文件串联来实现这一点。这使用Unix工具cat
非常简单。在shell提示下,使用与问题中相同的文件名:
$ cat my_cert.pem my_key.pem > my_certkey.pem
其中my_certkey.pem
是输出文件。现在,您可以在对soap_ssl_client_context()
的调用中使用my_certkey.pem
的路径作为keyfile参数。
像openssl s_client
和curl
这样的工具将把连接的密钥证书文件理解为-cert
选项的参数,并从中同时使用密钥和证书。