axis2c SSL客户端身份验证

时间:2014-03-11 09:50:39

标签: c authentication ssl client axis2c

我有一个使用远程轴Web服务的应用程序,当我使用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)(&amp;不在axis2.xml中)?

编辑:
我成功通过普通SSL连接到服务(没有客户端身份验证),但是当我想使用客户端身份验证时,客户端失败并显示以下日志:

[Sun Mar 16 12:49:10 2014] [info]  Starting addressing out handler
[Sun Mar 16 12:49:10 2014] [debug] ..\..\src\modules\mod_addr\addr_out_handler.c(133) No action present. Stop processing addressing
[Sun Mar 16 12:49:10 2014] [debug] ..\..\src\core\transport\http\sender\http_transport_sender.c(246) ctx_epr:https://mysite.com/axis2/services/myService
[Sun Mar 16 12:49:10 2014] [debug] ..\..\src\core\transport\http\sender\http_transport_sender.c(805) using axis2 native http sender.
[Sun Mar 16 12:49:10 2014] [debug] ..\..\src\core\transport\http\sender\http_sender.c(416) msg_ctx_id:urn:uuid:fe18bf10-6611-4af9-85f6-b062bd7eb231
[Sun Mar 16 12:49:14 2014] [debug] ..\..\src\core\transport\http\sender\http_client.c(571) http client , response timed out
[Sun Mar 16 12:49:14 2014] [error] ..\..\src\core\transport\http\sender\http_client.c(574) Response timed out
[Sun Mar 16 12:49:14 2014] [error] ..\..\src\core\transport\http\sender\http_sender.c(1381) status_code < 0
[Sun Mar 16 12:49:14 2014] [error] ..\..\src\core\engine\engine.c(179) Transport sender invoke failed

2 个答案:

答案 0 :(得分:0)

要诊断问题,您可以查看日志文件。默认情况下它位于axis2c/logs目录中,并且在您传递axutil_env_create_all函数时它有一个名称。

你不能同时拥有两种传输方式&#34; http&#34;和&#34; https&#34;在同一个港口。更好的是使用&#34; http&#34;或&#34; https&#34;传输axis2.xml

以编程方式设置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

答案 1 :(得分:0)

实际上,这是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 documentation,这个问题是因为我的轴库是用旧版本的openssl构建的:

  

如果mod_ssl与OpenSSL版本0.9.8m或更高版本链接,则默认情况下,只有支持新协议扩展的客户端才支持重新协商。如果启用此指令,则旧的(未修补的)客户端将允许重新协商,尽管不安全。

所以我只是使用较新版本的OpenSSL&amp; amp;重新编译轴库。一切都好了!
当然还有另一个不安全的解决方案是将以下行添加到Apache配置文件的虚拟主机部分:

SSLInsecureRenegotiation ON

因为启用SSLInsecureRenegotiation会导致中间人攻击,所以它不是一个安全的解决方案。