我正在开发一个客户端服务器对,其中服务器基于Java,客户端基于C ++(gSOAP)。使用HTTP可以完美地进行通信。现在,我想基于HTTPS实现加密的通信。
因此,我遵循了gSOAP教程
https://www.genivia.com/tutorials.html#cert
要创建自签名证书:一个用于客户端,一个用于Web服务。
然后我使用OpenSSL转换了.pem文件,如下所示:
openssl pkcs12 -export -in Servicecert.pem -inkey Servicekey.pem -certfile cacert.pem -out Service -name "service"
此外,我还这样导出了x.509客户端证书:
openssl x509 -outform der -in Clientcert.pem -out Clientcert.der
keytool -import -alias client -keystore Client -file Clientcert.der
我正在用作密钥库(服务)和信任库(客户端)的这两个文件
现在在客户端使用gSOAP示例代码,如下所示:
using namespace std;
int main()
{
struct soap* soap = soap_new();
soap->fsslverify = ssl_verify;
soap_register_plugin(soap, soap_wsse);
CountriesPortSoap11Proxy service("https://localhost:9443/ws");// = new CountriesPortSoap11Proxy("https://localhost:9443/ws");
_ns1__getCountryRequest* request = new _ns1__getCountryRequest;
_ns1__getCountryResponse response;
soap_ssl_init();
if (soap_ssl_client_context(soap,
SOAP_SSL_ALLOW_EXPIRED_CERTIFICATE, // requires server authentication
"Client.pem",// keyfile for client authentication to server
"password", // the keyfile password
"cacert.pem",// cafile CA certificates to authenticate the server
NULL,// capath CA directory path to certificates
NULL))
{
cout << "Zertifikat" << endl;
soap_print_fault(soap, stderr);
exit(1);
}
request->name = "Poland";
request->soap = soap;
if (soap_ssl_accept((struct soap*)soap))
cout << "ok" << endl;
else
cout << "fail" << endl;;
if(service.getCountry(request, response)==SOAP_OK)
cout << "ok" << endl;
else{
cout << "fail" << endl;
service.soap_stream_fault(std::cerr);
}
cout << response.country->currency << endl;
return 0;
}
然后我得到以下错误代码
ok
fail
SOAP 1.1 fault SOAP-ENV:Server[no subcode]
"SSL_ERROR_SSL
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
unable to get local issuer certificate"
Detail: SSL_connect() error in tcp_connect()
segmentation fault (Speicherabzug geschrieben)
有人知道这是怎么回事吗?
答案 0 :(得分:0)
不确定为什么必须按照说明转换PEM文件。 cert.sh
脚本生成PEM密钥文件和PEM证书文件。该脚本可用于服务器端生成server.pem
和cacert.pem
。 cert.sh
脚本位于gSOAP软件包的gsoap/samples/ssl
中。 cacert.pem
文件是服务器的证书,由根(使用root.pem
脚本创建的root.sh
)签名。该cacert.pem
文件是客户端使用自签名证书验证服务器真实性所需的唯一文件。使用服务器端的server.pem
文件。除非您使用client.pem
在服务器端强制实施客户端身份验证以使用SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION
初始化SSL上下文,否则不需要soap_ssl_server_context
。 server.pem
文件实际上是由cert.sh
创建的服务器私钥及其证书的串联。
答案 1 :(得分:0)
我必须转换PEM文件才能在使用keytool的java webservice中使用它们。据我所知,该密钥工具仅了解PKCS12证书。另外,我还必须使用客户端证书,因为服务器在信任库中使用客户端x.509证书。