WS-securitypolicy в cxf-bc развертывается в сервисмиксе

Мне было интересно, можно ли создать cxf-bc с WS-SecurityPolicy вместо только WS-Security. WS-SecurityPolicy кажется более элегантным решением, поскольку все находится в WSDL. Примеры приветствуются. :)

Что ж, с помощью Дэвида мне удалось установить и запустить CXF-BC на ESB, но я не могу его протестировать. Он продолжает возвращаться с:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <soap:Fault>
     <faultcode>soap:Server</faultcode>
     <faultstring>These policy alternatives can not be satisfied: 
        {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}UsernameToken</faultstring>
  </soap:Fault>
 </soap:Body>
</soap:Envelope>

Мое сообщение:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://nwec.faa.gov/wxrec/UserAccount/types">
  <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
   <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/ws-securitypolicy-1.2.xsd">
     <wsse:UsernameToken wsu:Id="UsernameToken-25" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsse:Username>bob</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bobspassword</wsse:Password>
     </wsse:UsernameToken>
   </wsse:Security>
  <wsa:Action>http://nwec.faa.gov/wxrec/UserAccount/UserAccountPortType/ApproveDenyAccountRequest</wsa:Action>
 </soapenv:Header>
 <soapenv:Body>
   ...
 </soapenv:Body>

Here's the policy in the wsdl:

<wsp:Policy wsu:Id="UserAccountBindingPolicy" xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
  <wsp:ExactlyOne>
    <wsp:All>
      <wsaw:UsingAddressing xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" wsp:Optional="true" />
        <wsp:Policy >
          <sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/Always">
            <wsp:Policy>
              <sp:WssUsernameToken10 />
            </wsp:Policy>
          </sp:UsernameToken>
        </wsp:Policy>
      </wsp:All>
   </wsp:ExactlyOne>
 </wsp:Policy>

person Vinh    schedule 31.03.2010    source источник


Ответы (2)


Согласно решению https://issues.apache.org/activemq/browse/SMXCOMP-711 и https://issues.apache.org/activemq/browse/SMXCOMP-712 (servicemix-cxf-bc-2010.01) это должно быть возможно и легко сделать.

См. http://fisheye6.atlassian.com/browse/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/ws/security/CxfBcSecurityJAASTest.java?r=HEAD для примера. В частности, метод testJAASPolicy.

Что касается ошибки, связанной с утверждением утверждения UsernameToken, вы можете попробовать поместить утверждение UsernameToken внутрь SupportingToken или привязка утверждения в зависимости от того, что вы хотите делать с токеном. Похоже, вы просто хотите, чтобы имя пользователя и пароль были переданы в сообщении без какой-либо другой защиты, такой как криптографическая привязка токена к сообщению или шифрование, поэтому вспомогательный токен, скорее всего, будет соответствовать вашим потребностям.

Я также призываю вас учитывать следующие дополнительные меры предосторожности при использовании UsernameToken:

  1. Криптографически привяжите токен к сообщению с помощью подписи.
  2. Используйте одноразовый номер и созданную временную метку и кэшируйте токен на сервере, чтобы предотвратить повтор
  3. Рассмотрите возможность шифрования токена (перед подписью, если вы также подписываете) с помощью XML enc
  4. Использование TLS вместо или в дополнение к приведенным выше предложениям
person DavidValeri    schedule 01.04.2010
comment
Хорошо, после просмотра JAASTest я до сих пор не имею ни малейшего представления о том, как его реализовать. Также кажется, что JAASTest даже не использует wsdl с определенной в нем политикой безопасности ws, если только я что-то не упустил, и похоже, что apache еще не опубликовал servicemix-cxf-bc-2010.01.xsd , поэтому я не могу использовать это. - person Vinh; 06.04.2010
comment
Пример шины CXF с вложением внешней политики: fisheye6.atlassian.com/browse/servicemix/ компоненты/привязки/ См. cxf.apache.org/docs/ws-securitypolicy .html для других способов присоединения политики. Настройте своего потребителя CXF-BC: fisheye6.atlassian.com/browse/servicemix/components/bindings/ - person DavidValeri; 07.04.2010
comment
Все, что вам нужно, должно быть здесь repo2.maven.org /maven2/org/apache/servicemix/servicemix-cxf-bc/ - person DavidValeri; 07.04.2010
comment
Спасибо за вашу помощь, мне было интересно, не могли бы вы помочь с последней проблемой. (исходный вопрос обновлен) - person Vinh; 08.04.2010
comment
Обновленный ответ выше. В будущем, вероятно, будет лучше начать новый вопрос, чем растягивать один вопрос после того, как на него был дан ответ. - person DavidValeri; 13.04.2010

С Дэвидом и Фрименом в списке рассылки servicemix-user. Наконец-то я смог получить правильную конфигурацию для реализации политики WS-Security.

Вот мой окончательный beans.xml для моего BC

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0" xmlns:util="http://www.springframework.org/schema/util"
 xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
 xmlns:http="http://cxf.apache.org/transports/http/configuration" xmlns:sec="http://cxf.apache.org/configuration/security"
 xmlns:person="http://www.mycompany.com/ws-sec-proto"
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/util
   http://www.springframework.org/schema/util/spring-util.xsd
   http://servicemix.apache.org/cxfbc/1.0
   http://repo2.maven.org/maven2/org/apache/servicemix/servicemix-cxf-bc/2010.01/servicemix-cxf-bc-2010.01.xsd
   http://cxf.apache.org/transports/http-jetty/configuration
   http://cxf.apache.org/schemas/configuration/http-jetty.xsd
   http://cxf.apache.oarg/transports/http/configuration
   http://cxf.apache.org/schemas/configuration/http-conf.xsd">

 <import resource="classpath:META-INF/cxf/cxf.xml" />
 <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
 <import resource="classpath:META-INF/cxf/cxf-extension-http.xml" />
 <import resource="classpath:META-INF/cxf/osgi/cxf-extension-osgi.xml" />
 <import resource="classpath:META-INF/cxf/cxf-extension-policy.xml" />
 <import resource="classpath:META-INF/cxf/cxf-extension-ws-security.xml" />

 <bean id="myPasswordCallback" class="com.mycompany.ServerPasswordCallback" />

 <cxfbc:consumer wsdl="classpath:wsdl/person.wsdl"
  targetService="person:PersonService" targetInterface="person:Person"
  properties="#properties" delegateToJaas="false" >
 <!-- not important for ws-security
 <cxfbc:inInterceptors>
   <bean class="com.mycompany.SaveSubjectInterceptor" />
   <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
 </cxfbc:inInterceptors> 
 -->
 </cxfbc:consumer>

 <util:map id="properties">
   <entry>
    <key>
     <util:constant
      static-field="org.apache.cxf.ws.security.SecurityConstants.CALLBACK_HANDLER" />
    </key>
    <ref bean="myPasswordCallback" />
   </entry>
 </util:map>

 <httpj:engine-factory bus="cxf">
  <httpj:engine port="9001">
   <httpj:tlsServerParameters>
    <sec:keyManagers keyPassword="password">
      <sec:keyStore type="JKS" password="password" resource="certs/cherry.jks" />
    </sec:keyManagers>
    <sec:cipherSuitesFilter>
      <sec:include>.*_WITH_3DES_.*</sec:include>
      <sec:include>.*_WITH_DES_.*</sec:include>
      <sec:exclude>.*_WITH_NULL_.*</sec:exclude>
      <sec:exclude>.*_DH_anon_.*</sec:exclude>
    </sec:cipherSuitesFilter>
    <sec:clientAuthentication want="false"
      required="false" />
  </httpj:tlsServerParameters>
 </httpj:engine>
 </httpj:engine-factory>

 <bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl" />

 <bean class="org.apache.servicemix.common.osgi.EndpointExporter" />

</beans>

Полный пример можно найти здесь, но через некоторое время его там может не быть.

person Vinh    schedule 30.06.2010