我有一个使用远程轴web服务的c应用程序,当我使用http协议连接到服务时没有问题,但是当我想使用ssl时,我无法调用服务操作&它只返回NULL。
下面是客户机应用程序的axis2.xml的一部分:
<transportReceiver name="http" class="axis2_http_receiver">
<parameter name="port" locked="false">6060</parameter>
<parameter name="exposeHeaders" locked="true">false</parameter>
</transportReceiver>
<transportReceiver name="https" class="axis2_http_receiver">
<parameter name="port" locked="false">6060</parameter>
<parameter name="exposeHeaders" locked="true">false</parameter>
</transportReceiver>
<transportSender name="http" class="axis2_http_sender">
<parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
<parameter name="xml-declaration" insert="false"/>
<!--parameter name="Transfer-Encoding">chunked</parameter-->
<!--parameter name="HTTP-Authentication" username="" password="" locked="true"/-->
<!--parameter name="PROXY" proxy_host="127.0.0.1" proxy_port="8080" proxy_username="" proxy_password="" locked="true"/-->
</transportSender>
<transportSender name="https" class="axis2_http_sender">
<parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
<parameter name="xml-declaration" insert="false"/>
</transportSender>
这个配置有错误吗?我还需要什么吗?
我的服务器使用自签名证书,这会导致问题吗?
另一个问题是,如果我想启用客户端身份验证,我如何通过所需的参数(SERVER_CERT, KEY_FILE, SSL_PASSPHRASE)在我的代码(&axis2.xml中没有)?
编辑:
我通过普通SSL成功连接到服务(没有客户端身份验证),但是当我想使用客户端身份验证时,客户端失败,并出现以下日志:
[Sun Mar 16 12:49:10 2014] [info] Starting addressing out handler
[Sun Mar 16 12:49:10 2014] [debug] ....srcmodulesmod_addraddr_out_handler.c(133) No action present. Stop processing addressing
[Sun Mar 16 12:49:10 2014] [debug] ....srccoretransporthttpsenderhttp_transport_sender.c(246) ctx_epr:https://mysite.com/axis2/services/myService
[Sun Mar 16 12:49:10 2014] [debug] ....srccoretransporthttpsenderhttp_transport_sender.c(805) using axis2 native http sender.
[Sun Mar 16 12:49:10 2014] [debug] ....srccoretransporthttpsenderhttp_sender.c(416) msg_ctx_id:urn:uuid:fe18bf10-6611-4af9-85f6-b062bd7eb231
[Sun Mar 16 12:49:14 2014] [debug] ....srccoretransporthttpsenderhttp_client.c(571) http client , response timed out
[Sun Mar 16 12:49:14 2014] [error] ....srccoretransporthttpsenderhttp_client.c(574) Response timed out
[Sun Mar 16 12:49:14 2014] [error] ....srccoretransporthttpsenderhttp_sender.c(1381) status_code < 0
[Sun Mar 16 12:49:14 2014] [error] ....srccoreengineengine.c(179) Transport sender invoke failed
要诊断问题,您可以查看日志文件。默认情况下,它在axis2c/logs
目录中,并且在您传入axutil_env_create_all
函数时它有一个名称。
你不能在同一个端口上同时传输"http"one_answers"https"。在axis2.xml
中最好使用"http"或"https"传输。
以编程方式设置SSL参数(以SERVER_CERT
为例):
axutil_property_t* ca_prop = axis2_property_create(env);
axutil_property_set_value(ca_prop, env, axis2_strdup("/path/to/ca.pem", env));
axis2_options_set_property(options, env, "SERVER_CERT", ca_prop);
这是一篇关于如何为SSL配置Axis2/C的好文章:http://people.apache.org/~dumindu/docs/HowToConfigureSSL.html
这实际上是发生在Apache SSL引擎中的服务器端问题!当我查看apache错误日志时,我看到如下错误:
[Sun Mar 16 13:33:43 2014] [error] SSL Library Error: 336068931 error:14080143:SSL routines:SSL3_ACCEPT:unsafe legacy renegotiation disabled
根据mod_ssl文档,这个问题是因为我的axis库是用旧版本的openssl构建的:
如果mod_ssl链接的OpenSSL版本为0.9.8m或更高版本,默认情况下,只有支持新协议扩展的客户端才支持重新协商。如果启用此指令,则允许与旧的(未打补丁的)客户端重新协商,尽管不安全。
所以我刚刚用新版本的OpenSSL重新编译了axis库&现在一切都好了!
当然,还有另一种不安全的解决方案,即在Apache配置文件的虚拟主机部分添加以下行:
SSLInsecureRenegotiation ON