كيف يمكنك استخدام مصادقة HTTP TLS / SSL مع عميل CXF إلى خدمة ويب؟

StackOverflow https://stackoverflow.com/questions/543896

سؤال

أحاول الوصول إلى خدمة ويب مضمونة بواسطة شهادة. الأمن هو الإعداد على IIS وخدمة الويب وراء ذلك.

لا أعتقد أن الأمن WS سيفعل هذا النوع من المصادقة. هل هناك أي طريقة لتمرير شهادة العميل عند استدعاء خدمة الويب؟

أنا فقط أحصل على صفحة خطأ IIS التي تقول "الصفحة تتطلب شهادة عميل".

أنا أستخدم CXF 2.1.4

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

المحلول

نعم، هذا ممكن باستخدام CXF. ستحتاج إلى إعداد قناة العميل. يمكنك تحديد KEYSTORE التي تحتوي على الشهادات التي ستتيح لك الوصول إلى خدمة الويب في IIS. طالما أن الشهادة التي تستخدمها هنا هي عميل معروف معروف في IIS، يجب أن تكون على ما يرام.

<http:conduit name="{http://apache.org/hello_world}HelloWorld.http-conduit">

   <http:tlsClientParameters>
       <sec:keyManagers keyPassword="password">
            <sec:keyStore type="JKS" password="password"
                 file="src/test/java/org/apache/cxf/systest/http/resources/Morpit.jks"/>
       </sec:keyManagers>
       <sec:trustManagers>
           <sec:keyStore type="JKS" password="password"
                file="src/test/java/org/apache/cxf/systest/http/resources/Truststore.jks"/>
       </sec:trustManagers>

       ...

   </http:tlsClientParameters>

عينة من: CXF Wiki.

نصائح أخرى

الجواب أعلاه صحيح ولكن مضيفا إلى ذلك ....

يجب أن تكون الفاصوليا العميل كما يلي (لهذا SSL يعمل بشكل جيد):

<jaxws:client id="helloClient" serviceClass="demo.spring.HelloWorld" address="http://localhost:9002/HelloWorld" />

إذا قمت بتحديد الفاصوليا العميل كما يلي SSL لن يعمل:

<bean id="proxyFactory" 
class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="demo.spring.HelloWorld"/>
<property name="address" value="http://localhost:9002/HelloWorld"/>
</bean> 

كما ذكرنا ByGG، تحتاج إلى إضافة اعتراضي إلى JaxwsProxyfactoryBean واستخدام HTTPCConduit.

هنا هو نموذج التعليمات البرمجية التي يمكنك الرجوع إليها.
هذه سوف يرشد الرمز كيفية تعيين tlsclientparameters

للقيام بذلك بشكل طبيعي، قم بإنشاء اعتراضي وإضافته إلى JaxWsProxyFactoryBean مع factory.getOutInterceptors().add(new TLSInterceptor()).

public class TLSInterceptor extends AbstractPhaseInterceptor<Message> {

    public TLSInterceptor() {
        super(Phase.SETUP);
    }

    @Override
    public void handleMessage(final Message message) throws Fault {
            final Conduit conduit = message.getExchange().getConduit(message);
            if (conduit instanceof HTTPConduit) {
                final HTTPConduit httpConduit = (HTTPConduit) conduit;
                final TLSClientParameters tlsClientParameters = ObjectUtils.firstNonNull(httpConduit.getTlsClientParameters(), new TLSClientParameters());

               // configure the params

                httpConduit.setTlsClientParameters(tlsClientParameters);
            }
        }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top