سؤال

أنا أحاول تطوير مستقل جافا ويب خدمة العميل مع جاكس-WS (مترو) التي تستخدم WS-الأمن مع اسم المستخدم رمز التوثيق (كلمة المرور الهضم ، nonces والطابع الزمني) والطابع الزمني التحقق جنبا إلى جنب مع WS-معالجة عبر SSL.

WSDL كنت لا تعرف أي سياسة أمن المعلومات.لقد كنت غير قادر على معرفة بالضبط كيفية إضافة هذه المعلومات رأس (الطريقة الصحيحة للقيام بذلك) عندما WSDL لا تحتوي على هذه المعلومات.معظم الأمثلة وجدت باستخدام مترو تدور حول استخدام Netbeans أن تولد تلقائيا من WSDL التي لا تساعدني على الإطلاق.لقد بحثت في WSIT, XWSS ، إلخ.دون الكثير من الوضوح أو الاتجاه.جبوس WS مترو بدا واعدا بعدم الكثير من الحظ حتى الآن هناك إما.

أي شخص لديه خبرة في فعل هذا أو لديك اقتراحات حول كيفية إنجاز هذه المهمة ؟ حتى لافتا في الاتجاه الصحيح سيكون مفيدا.أنا لا تقتصر على التكنولوجيا الأخرى من أنه يجب أن يكون جافا القائمة.

هل كانت مفيدة؟

المحلول

لم ينتهي كشف هذه المسألة ولكن ذهبت في اتجاه آخر للقيام بذلك.الحل هو استخدام CXF 2.1 و جاكس-WS تنفيذ تجمع بين قوة CXF مع القائمة الربيع البنية التحتية أنا بالفعل في المكان.كنت متشككا في البداية بسبب العديد من الجرار المطلوبة من قبل CXF, ولكن في نهاية الأمر توفير أفضل و أبسط حل.

تكييف مثال من CXF موقع العميل التكوين, لقد استخدمت مخصص CXF JAXWS مساحة في الربيع و استخدامها خارج اعتراضية على اسم المستخدم رمز التوثيق (كلمة المرور الهضم ، nonces والطابع الزمني) والطابع الزمني التحقق.فقط خطوة أخرى لجعل هذا العمل خلق بلدي كلمة السر رد معالج التي يتم تنفيذها لكل الصادرة الصابون الطلب.

SSL التكوين ، لقد تحولت مرة أخرى إلى CXF و دعم SSL عبر القنوات, على الرغم من أنني لا يمكن أبدا أن تجعل SSL العمل محدد http:conduit اسم اضطررت لاستخدام العامة غرض واحد هو أن لا ينصح بيئات الإنتاج.

فيما يلي مثال من ملف التكوين.

الربيع config

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xmlns:sec="http://cxf.apache.org/configuration/security"
    xmlns:http="http://cxf.apache.org/transports/http/configuration"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:cxf="http://cxf.apache.org/core"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd
    http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">

    <context:property-placeholder location="meta/my.properties" />
    <context:component-scan base-package="com.foo" />

    <import resource="remoting.xml" />
    <jaxws:client id="myWebService" address="${my.endpointAddress}"
                  serviceClass="com.foo.my.ServicePortType">

<!-- Testing only, adds logging of entire message in and out -->
<jaxws:outInterceptors>
    <ref bean="TimestampUsernameToken_Request" />
    <ref bean="logOutbound" />
</jaxws:outInterceptors>
<jaxws:inInterceptors>
        <ref bean="logInbound" />
    </jaxws:inInterceptors>
    <jaxws:inFaultInterceptors>
        <ref bean="logOutbound" />
    </jaxws:inFaultInterceptors>

<!-- Production settings -->
<!--
    <jaxws:outInterceptors> <ref bean="TimestampUsernameToken_Request" />
    </jaxws:outInterceptors>
    -->
</jaxws:client >



<!--
    CXF Interceptors for Inbound and Outbound messages
    Used for logging and adding Username token / Timestamp Security Header to SOAP message
-->
<bean id="logInbound" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />

<bean id="TimestampUsernameToken_Request" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameToken Timestamp" />
            <entry key="user" value="${my.group}.${my.userId}" />
            <entry key="passwordType" value="PasswordDigest" />
            <entry key="passwordCallbackClass" value="com.foo.my.ClientPasswordHandler" />
        </map>
    </constructor-arg>
</bean>

<!--
    http:conduit namespace is used to configure SSL using keystores, etc
    *.http-conduit works but CXF says its only supposed to be for temporary use (not production),
    well until the correct way works, we're going to use it.
-->
<http:conduit name="*.http-conduit">
    <http:tlsClientParameters   
                  secureSocketProtocol="SSL">
                  <!--
          <sec:trustManagers>
        <sec:keyStore type="JKS"
                         password="${my.truststore.password}"
                         file="${my.truststore.file}" />
                  </sec:trustManagers>
                  -->
                  <sec:keyManagers keyPassword="${my.keystore.password}">
                    <sec:keyStore type="JKS"
                         password="${my.keystore.password}"
                         file="${my.keystore.file}" />
                  </sec:keyManagers>

                  <!-- Cipher suites filters specify the cipher suite to allow/disallow in SSL communcation  -->
                  <sec:cipherSuitesFilter>
                    <sec:include>.*_WITH_3DES_.*</sec:include>
                    <sec:include>.*_EXPORT_.*</sec:include>
                    <sec:include>.*_EXPORT1024_.*</sec:include
                    <sec:include>.*_WITH_DES_.*</sec:include
                    <sec:exclude>.*_WITH_NULL_.*</sec:exclude
                    <sec:exclude>.*_DH_anon_.*</sec:exclude>
                  </sec:cipherSuitesFilter>
    </http:tlsClientParameters>
</http:conduit>
</beans>

جافا العميل كلمة المرور معالج:

import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.log4j.Logger;
import org.apache.ws.security.WSPasswordCallback;


/**
 * <p>
 * Provides a callback handler for use processing outbound/inbound SOAP messages.
 * ClientPasswordHandler sets the password used in the WS-Security UsernameToken 
 * SOAP header.
 * 
 * </p>
 * 
 * Created: Apr 1, 2009
 * @author Jared Knipp
 * 
 */
public final class ClientPasswordHandler implements CallbackHandler {
    protected static Logger log = Logger.getLogger(ClientPasswordHandler.class);

    private static final PropertyManager PROPS = PropertyManager.getInstance();
    private static String PASSWORD = PROPS.getPassword();
    private static boolean IS_PASSWORD_CLEAR = PROPS.getIsClearPassword();

    /**
     * Client password handler call back.  This method is used to provide
     * additional outbound (or could be inbound also) message processing.
     * 
     * Here the method sets the password used in the UsernameToken SOAP security header
     * element in the SOAP header of the outbound message.  For our purposes the clear 
     * text password is SHA1 hashed first before it is hashed again along with the nonce and 
     * current timestamp in the security header.
     */
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        if(log.isDebugEnabled()) { log.debug("Setting password for UsernameToken"); }
        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];


        // Check to see if the password is already Hashed via SHA1, if not then hash it first
        if(IS_PASSWORD_CLEAR) {
            synchronized(this) {
                PASSWORD = PasswordDigestUtil.doPasswordDigest(PASSWORD);
                IS_PASSWORD_CLEAR = false;
                PROPS.setIsClearPassword(IS_PASSWORD_CLEAR);
                PROPS.setPassword(PASSWORD);
                PROPS.saveProperties();
            }
        }

        pc.setPassword(PASSWORD);
    }
}

نصائح أخرى

إذا لم تكن المعلومات في اختصار، هل أنت متأكد من انها في خدمة التي وصفها WSDL؟ ويهدف WSDL لتوفير جميع المعلومات اللازمة لوصف الخدمة، بما في ذلك السياسات الأمنية اللازمة لاستخدام هذه الخدمة.

وماذا منصة فإن WSDL تأتي من؟ هل من الممكن أن WSDL ليس وصف كامل؟ على سبيل المثال، قد يكون WSDL التي هي <م> تضمين د في WSDL آخر <م> لا توفير المعلومات الأمنية.

وهناك وظيفة هنا شرح كيفية تكوين عميل وخادم في CXF مع WS-الأمن: <لأ href = "http://blog.jeshurun.ca/technology/jax-ws-web-services-with -spring و-CXF "يختلط =" نوفولو "> JAX-WS خدمات ويب مع الربيع وCXF

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top