C语言 axis2c SSL客户端身份验证



我有一个使用远程轴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
由于启用sslinsecurerenenegotiation可能会导致中间人攻击,因此它不是一个安全的解决方案。

相关内容

  • 没有找到相关文章

最新更新