Các dịch vụ Web Java: Sử dụng độ chi tiết của WS-Security

Áp dụng WS-Security ở mức hoạt động hoặc mức thông báo

WS-Security (An ninh dịch vụ Web) cho các dịch vụ Web SOAP không nhất thiết phải là một đề xuất hoặc tất cả hoặc không gì cả. Bằng cách cấu hình WS-Security tại mức hoạt động hoặc mức thông diệp, bạn có thể áp dụng một mức độ bảo vệ thích hợp cho mọi trao đổi, giảm hoặc loại bỏ chi phí WS-Security cho các hoạt động không cần bảo vệ đầy đủ. Dennis Sosnoski tiếp tục loạt bài các dịch vụ Web Java của mình bằng việc xem xét WS-Security chi tiết mịn hơn trong Web Services Description Language (WSDL-Ngôn ngữ mô tả dịch vụ Web) sử dụng Axis2 và Rampart của Apache.

Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc.

Dennis Sosnoski là một nhà tư vấn và nhà trợ giúp đào tạo chuyên về các dịch vụ Web và SOA dựa trên-Java. Kinh nghiệm phát triển phần mềm chuyên nghiệp của ông trải suốt hơn 30 năm qua, với một thập kỉ cuối tập trung vào các công nghệ XML và Java phía máy chủ. Dennis là nhà phát triển hàng đầu về dụng cụ liên kết dữ liệu XML JiBX mã nguồn mở, cũng là một người có duyên nợ với khung công tác của các dịch vụ Web Apache Axis2. Ông cũng là một trong những thành viên của nhóm chuyên gia đặc tả kỹ thuật của Jax-WS 2.0 và JAXB 2.0. Xem trang web của ông để có thông tin về các dịch vụ đào tạo và tư vấn của ông.



11 12 2009

Trong các môi trường dịch vụ Web đơn giản, các máy khách kết nối trực tiếp đến các máy chủ và các máy chủ trực tiếp thực hiện tất cả các xử lý cần thiết cho yêu cầu. Như các bạn đã tìm hiểu trong bài viết trước của loạt bài này, các kết nối an ninh SSL có thể cung cấp an ninh tuyệt vời cho hầu hết các mục đích trong kiểu môi trường này. Tuy nhiên, môi trường phức tạp hơn đang ngày càng phổ biến, trong đó nhiều tầng của các máy chủ tham gia vào việc xử lý một yêu cầu. Toàn bộ ý tưởng của cách dàn dựng (orchestration) dịch vụ đang ngày càng phổ biến trong nhiều môi trường doanh nghiệp, là dựa vào cách tiếp cận này, như là khái niệm về kiến trúc hướng dịch vụ (SOA). Trong các kiểu môi trường này, sự lựa chọn WS-Security mạnh hơn là cần thiết.

Về loạt bài này

Các dịch vụ Web là một phần chủ yếu của vai trò công nghệ Java™ trong điện toán doanh nghiệp. Trong loạt bài viết này, nhà tư vấn XML và các dịch vụ Web Dennis Sosnoski trình bày các khung công tác và công nghệ chính rất quan trọng với các nhà phát triển Java khi sử dụng các dịch vụ Web. Hãy theo dõi loạt bài này để cập nhật những phát triển mới nhất trong lĩnh vực này và hiểu được bạn có thể sử dụng chúng để hỗ trợ cho các dự án lập trình của bạn như thế nào.

WS-Security đòi hỏi chi phí hiệu năng lớn, như đã thảo luận trong bài viết trước. Một cách để giảm chi phí đó là thiết lập WS-SecurityPolicy (Chính sách an ninh dịch vụ Web) thích hợp cho từng hoạt động riêng lẻ hoặc thậm chí mỗi thông điệp được một dịch vụ xác định, hơn là áp dụng chỉ một WS-SecurityPolicy với toàn bộ dịch vụ. Sử dụng độ chi tiết mịn hơn của WS-Security đòi hỏi phải xem xét nhiều hơn so với cách tiếp cận một-kích-cỡ-vừa-với-tất-cả, nhưng khi được áp dụng đúng cách nó có thể làm giảm chi phí hiệu năng cho các hoạt động thường được sử dụng mà không làm suy yếu việc bảo đảm an ninh của các hoạt động cần đến nó.

Định nghĩa một chính sách

Ứng dụng ví dụ được sử dụng cho bài viết này chính là ứng dụng đã sử dụng trong "Axis2 WS-Security basics" (Những điều cơ bản về An ninh dịch vụ Web của Axis2) và "Axis2 WS-Security signing and encryption" (Ký và mã hoá trong An ninh dịch vụ Web của Axis2) — một dịch vụ quản lý thư viện đơn giản - (Xem Tải về để nhận được mã nguồn đầy đủ cho bài này). Dịch vụ này định nghĩa ba hoạt động:

  • getBook để lấy ra các chi tiết về một cuốn sách cụ thể được nhận diện bằng mã số sách tiêu chuẩn quốc tế (ISBN - International Standard Book Number).
  • getBooksByType để lấy ra các chi tiết cho tất cả các cuốn sách thuộc một kiểu cụ thể.
  • addBook để thêm một cuốn sách mới vào thư viện.

Để đưa ra một số tính đa dạng thú vị trong việc bảo đảm an ninh, bài viết này giả định rằng:

  • Hoạt động getBook có thể trưng ra một cách an toàn cho bất cứ ai (không có bảo mật).
  • getBooksByType cần một sự cấp phép (vì thế đòi hỏi một UsernameToken).
  • Hoạt động addBook cần một lịch sử hoạt động để lần theo vết ai đã gửi mỗi cuốn sách (được thực hiện bằng cách ký các thông báo yêu cầu).

Trong các bài viết trước, bạn đã thấy cách cấu hình Axis2/Rampart bằng cách gắn một tài liệu WS-SecurityPolicy vào cá thể org.apache.axis2.client.ServiceClient (ở phía máy khách) hoặc bằng cách nhúng tài liệu chính sách trong tệp cấu hình dịch vụ services.xml (ở phía máy chủ). Cách tiếp cận này làm việc được và có thể có ích trong việc thử nghiệm, nhưng đối với việc chạy sản xuất, tốt nhất là kết hợp trực tiếp WS-SecurityPolicy với một định nghĩa dịch vụ bằng cách nhúng nó trong một tài liệu WSDL. WS-Policy và WS-SecurityPolicy được thiết kế để hỗ trợ kiểu nhúng này, với các tham chiếu từ các định nghĩa <wsdl:binding>, <wsdl:binding>/<wsdl:operation>, hoặc <wsdl:binding>/<wsdl:operation>/<wsdl:message> được sử dụng để nhận biết chính sách thích hợp được áp dụng cho liên kết, hoạt động hoặc thông báo đó. Axis2 1.4.1 đã triển khai thực hiện xử lý sơ bộ cho các chính sách được nhúng trong WSDL và trển khai thực hiện này đã được cải thiện trong mã của bản phát hành Axis2 1.5 hiện tại. Để giải thích việc sử dụng chính sách trong WSDL, bài viết này sử dụng mã của bản phát hành Axis2 1.5 kết hợp với mã Rampart hiện tại chưa phát hành (mà cuối cùng sẽ phải được phát hành như Rampart 1.5).

Liệt kê 1 cho thấy WSDL dành cho ứng dụng ví dụ có chính sách được thêm vào và được tham chiếu từ các vị trí thích hợp. (Liệt kê 1 đã chỉnh sửa để vừa chiều dài và chiều rộng; WSDL đầy đủ có sẵn trong tệp library.wsdl trong phần tải mã.) Mỗi chính sách định nghĩa một giá trị Id (mã nhận dạng) mà sau đó giá trị này được tham khảo từ hoạt động thích hợp (trong trường hợp của chính sách UsernameToken) hoặc thông báo (trong trường hợp của chính sách ký), tất cả được chỉ ra bằng in đậm.

Liệt kê 1. WSDL với các chính sách an ninh chi tiết
<wsdl:definitions targetNamespace="http://ws.sosnoski.com/library/wsdl"
    xmlns:wns="http://ws.sosnoski.com/library/wsdl"
    xmlns:tns="http://ws.sosnoski.com/library/types"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">

  <!-- Policy for signing message, with certificate from client included in each
    message to server -->
  <wsp:Policy wsu:Id="SignOnly" xmlns:wsu=
      "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
      xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
    <wsp:ExactlyOne>
      <wsp:All>
        <sp:AsymmetricBinding
            xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
          <wsp:Policy>
            <sp:InitiatorToken>
              <wsp:Policy>
                <sp:X509Token sp:IncludeToken=".../IncludeToken/AlwaysToRecipient"/>
              </wsp:Policy>
            </sp:InitiatorToken>
            ...
          </wsp:Policy>
        </sp:AsymmetricBinding>
        <sp:SignedParts
            xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
          <sp:Body/>
        </sp:SignedParts>

      </wsp:All>
    </wsp:ExactlyOne>
  </wsp:Policy>

  <!-- Policy for UsernameToken with plaintext password, sent from client to
    server only -->
  <wsp:Policy wsu:Id="UsernameToken" xmlns:wsu=
      "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
      xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
    <wsp:ExactlyOne>
      <wsp:All>
        <sp:SupportingTokens
            xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
          <wsp:Policy>
            <sp:UsernameToken sp:IncludeToken=".../IncludeToken/AlwaysToRecipient"/>
          </wsp:Policy>
        </sp:SupportingTokens>
      </wsp:All>
    </wsp:ExactlyOne>
  </wsp:Policy>
  ...
  <wsdl:binding name="LibrarySoapBinding" type="wns:Library">

    <wsdlsoap:binding style="document"
      transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="getBook">
      <wsdlsoap:operation soapAction="urn:getBook"/>
      <wsdl:input name="getBookRequest">
        <wsdlsoap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="getBookResponse">
        <wsdlsoap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>

    <wsdl:operation name="getBooksByType">
      <wsp:PolicyReference xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
                  URI="#UsernameToken"/>
      <wsdlsoap:operation soapAction="urn:getBooksByType"/>
      <wsdl:input name="getBooksByTypeRequest">
        <wsdlsoap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="getBooksByTypeResponse">
        <wsdlsoap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>

    <wsdl:operation name="addBook">
      <wsdlsoap:operation soapAction="urn:addBook"/>
      <wsdl:input name="addBookRequest">
        <wsp:PolicyReference xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
                      URI="#SignOnly"/>
        <wsdlsoap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="addBookResponse">
        <wsdlsoap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>

  </wsdl:binding>
  <wsdl:service name="library-granular">
    ...
  </wsdl:service>
</wsdl:definitions>

Các chính sách và WSDL trong Liệt kê 1 tất cả đều được lấy từ các bài viết trước, mặc dù trước đó đã không được hòa trộn theo cách này. Mặc dù vậy, bạn có thể nhận ra một sự khác biệt đáng kể trong các chính sách: tất cả các phiên bản trước đó đã bao gồm các thông tin cấu hình Rampart, là đặc thù cho hoặc máy khách hoặc máy chủ. Bây giờ chính sách này được nhúng vào trong WSDL, vì bao gồm trực tiếp cấu hình Rampart không phải là cách làm tốt. (Bạn sẽ cần phải chỉnh sửa WSDL để bao gồm thông tin cấu hình Rampart của máy khách của bạn và tạo lại mã mỗi lần thông tin cấu hình này thay đổi và trên máy chủ, thông tin cấu hình Rampart của bạn sẽ được trưng ra với bất kỳ ai truy cập vào WSDL). Vì vậy, thay vào đó mã ví dụ thiết lập thông tin cấu hình này riêng rẽ. Để làm điều này, nó sử dụng các biến thể của chính kỹ thuật được sử dụng trước đây cho các chính sách có bao gồm cả cấu hình Rampart.


Cách sử dụng phía máy khách

Việc tạo mã từ WSDL vẫn làm việc như cũ theo quan điểm người dùng cho dù có bao gồm WS-Policy hay không. Nếu bạn nhìn bên trong gốc máy khách được tạo ra từ một WSDL có chứa WS-Policy, bạn sẽ thấy rằng chính sách này được gắn trực tiếp với các thành phần mô tả dịch vụ khi nó đang được xây dựng, nhưng điều này được ẩn dấu bên trong việc triển khai thực hiện và không làm ảnh hưởng đến các phương thức giao diện mà mã máy khách của bạn sử dụng.

Để tiến hành sử dụng cấu hình WS-SecurityPolicy trên máy khách, bạn cần phải thực hiện một vài hành động trong mã máy khách của bạn. Ít nhất, bạn phải gài mô đun Rampart trên org.apache.axis2.client.ServiceClient kết hợp với cá thể của bạn. Bước này là cần thiết thậm chí nếu bạn bao gồm các thông tin cấu hình Rampart của bạn trong WSDL. Thật không may, ở đây dường như không có bất kỳ cách làm nào để gài Rampart tại mức hoạt động hay mức thông báo trong mã hiện tại, do đó một phần ích lợi của WS-Security mức chi tiết mịn hơn bị mất vào lúc này khi nó được sử dụng với một máy khách Axis2.

Nếu bạn duy trì cấu hình Rampart của bạn tách biệt khỏi WSDL như đã khuyến cáo, bạn cũng cần phải áp dụng cấu hình đó cho mô tả dịch vụ. Liệt kê 2 cho thấy mã máy khách được sử dụng cho mục đích này trong ứng dụng ví dụ. Nó gọi phương thức applyPolicy() để thêm chính sách có chứa cấu hình Rampart vào định nghĩa dịch vụ.

Liệt kê 2. Cấu hình các hoạt động phía máy khách
// create the client stub
String target = args[0] + "://" + args[1] + ":" + args[2] + args[3];
System.out.println("Connecting to " + target);
LibraryGranularStub stub = new LibraryGranularStub(target);

// configure and engage rampart module
ServiceClient client = stub._getServiceClient();
client.getAxisService().applyPolicy(loadPolicy("rampart-client-policy.xml"));
client.engageModule("rampart");

// set the username and password for requests which use them
Options options = client.getOptions();
options.setUserName("libuser");
options.setPassword("books");

Mã trong Liệt kê 2 thiết lập tên người dùng và mật khẩu cho các tùy chọn ServiceClient có nghĩa là chúng được định nghĩa cho tất cả các hoạt động sử dụng dịch vụ đó ngay cả khi chúng được sử dụng bởi chỉ một hoạt động. Không giống như việc gài mô đun Rampart cho tất cả các hoạt động, việc thiết lập tên người dùng và mật khẩu theo cách này không gây thiệt hại — các giá trị được sử dụng chỉ khi cần có Rampart để xây dựng một UsernameToken và nếu không cần thì được bỏ qua.

Tài liệu chính sách có chứa cấu hình Rampart được hiển thị trong Liệt kê 3. Đây chính là chính sách đã sử dụng trong "Ký và mã hóa WS-Security của Axis2," bây giờ được trích xuất thành một tài liệu chính sách riêng biệt.

Liệt kê 3. Chính sách cấu hình máy khách Rampart
<wsp:Policy xmlns:wsu=
    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
  <wsp:ExactlyOne>
    <wsp:All>

      <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy"> 
        <ramp:user>clientkey</ramp:user>
        <ramp:passwordCallbackClass
          >com.sosnoski.ws.library.adb.PWCBHandler</ramp:passwordCallbackClass>
        
        <ramp:signatureCrypto>
          <ramp:crypto provider="org.apache.ws.security.components.crypto.Merlin">
            <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.type"
              >JKS</ramp:property>
            <ramp:property name="org.apache.ws.security.crypto.merlin.file"
              >client.keystore</ramp:property>
            <ramp:property
              name="org.apache.ws.security.crypto.merlin.keystore.password"
              >nosecret</ramp:property>
          </ramp:crypto>
        </ramp:signatureCrypto>
        
      </ramp:RampartConfig>
    
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

Tệp build.xml của Ant có trong phần mã tải về sẽ xử lý việc sinh ra cả mã máy khách và mã máy chủ từ WSDL, biên dịch mã và tạo tệp AAR dịch vụ. Nó cũng sao chép chính sách cấu hình Rampart (được cung cấp trong phần tải về dưới dạng tệp rampart-client-policy.xml, trong thư mục gốc) vào trong đường dẫn lớp (classpath) của máy khách, cùng với thực hiện một số việc xử lý chính sách phía máy chủ được thảo luận trong phần tiếp theo.


Cách sử dụng phía máy chủ

Nếu bạn muốn giữ cấu hình Rampart phía máy chủ của bạn bên ngoài WSDL (nói chung đó là một ý tưởng rất tốt) bạn cần phải bao gồm nó trong tệp services.xml để thay thế! Trong các bài viết trước, bạn đã thấy điều này đã được thực hiện với một cấu hình WS- SecurityPolicy đầy đủ, bao gồm cả cấu hình Rampart và được áp dụng cho dịch vụ nói chung. Lúc này, chính sách cấu hình Rampart là phần duy nhất được thêm vào services.xml và nó được thực hiện ở mức hoạt động.

Tài liệu chính sách đang chứa cấu hình Rampart được hiển thị trong Liệt kê 4. Cũng như chính sách cấu hình Rampart phía máy khách, đây chính là chính sách đã sử dụng trong "Ký và mã hoá WS-Security của Axis2," bây giờ được trích xuất thành một tài liệu chính sách riêng biệt.

Liệt kê 4. Chính sách cấu hình máy chủ Rampart
<wsp:Policy xmlns:wsu=
    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
  <wsp:ExactlyOne>
    <wsp:All>

      <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy"> 
        <ramp:user>serverkey</ramp:user>
        <ramp:passwordCallbackClass
          >com.sosnoski.ws.library.adb.PWCBHandler</ramp:passwordCallbackClass>
        
        <ramp:signatureCrypto>
          <ramp:crypto provider="org.apache.ws.security.components.crypto.Merlin">
            <ramp:property name="org.apache.ws.security.crypto.merlin.keystore.type"
              >JKS</ramp:property>
            <ramp:property name="org.apache.ws.security.crypto.merlin.file"
              >server.keystore</ramp:property>
            <ramp:property
              name="org.apache.ws.security.crypto.merlin.keystore.password"
              >nosecret</ramp:property>
          </ramp:crypto>
        </ramp:signatureCrypto>
        
      </ramp:RampartConfig>
    
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

Tệp build.xml của Ant sử dụng một chương trìnhPolicyTool có trong phần tải mã để hòa nhập chính sách của Liệt kê 4 (được cung cấp trong phần tải về dưới dạng tệp rampart-server-policy.xml, trong thư mục gốc) vào trong tệp services.xml. Tệp services.xml đã sửa đổi được hiển thị trong Liệt kê 5 (đã chỉnh sửa để vừa chiều dài và chiều rộng):

Liệt kê 5. services.xml sau các bổ sung
<serviceGroup>
  <service name="library-granular">
    <messageReceivers>
      <messageReceiver class=
        "com.sosnoski.ws.library.adb.LibraryGranularMessageReceiverInOut"
        mep="http://www.w3.org/ns/wsdl/in-out"/>
    </messageReceivers>
    <parameter name="ServiceClass"
      >com.sosnoski.ws.library.adb.LibraryGranularImpl</parameter>
    <parameter name="useOriginalwsdl">true</parameter>
    <parameter name="modifyUserWSDLPortAddress">true</parameter>
    <operation mep="http://www.w3.org/ns/wsdl/in-out" name="getBook"
      namespace="http://ws.sosnoski.com/library/wsdl">
      <actionMapping>urn:getBook</actionMapping>
      <outputActionMapping>.../getBookResponse</outputActionMapping>
    </operation>
    <operation mep="http://www.w3.org/ns/wsdl/in-out" name="getBooksByType"
      namespace="http://ws.sosnoski.com/library/wsdl">
      <actionMapping>urn:getBooksByType</actionMapping>
      <outputActionMapping>.../getBooksByTypeResponse</outputActionMapping>

<module ref="rampart"/>
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu=
    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <wsp:ExactlyOne>
  <wsp:All>

    <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy"> 
    <ramp:user>serverkey</ramp:user>
    ...

    </ramp:RampartConfig>

  </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>
  </operation>
    <operation mep="http://www.w3.org/ns/wsdl/in-out" name="addBook" 
    namespace="http://ws.sosnoski.com/library/wsdl">
      <actionMapping>urn:addBook</actionMapping>
      <outputActionMapping>
        http://ws.sosnoski.com/library/wsdl/Library/addBookResponse
      </outputActionMapping>

<module ref="rampart"/>
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu=
    "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <wsp:ExactlyOne>
  <wsp:All>

    <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy"> 
    <ramp:user>serverkey</ramp:user>
    ...

    </ramp:RampartConfig>

  </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>
  </operation>
  </service>
</serviceGroup>

Thêm chính sách vào services.xml một cách dễ dàng

"Axis2 WS-Security basics" (Cơ sở về WS-Security của Axis2) đã giới thiệu một công cụ để thêm các tham chiếu mô-đun và các chính sách vào tệp services.xml được sinh ra, tránh được yêu cầu chỉnh sửa tệp này bằng tay mỗi khi bạn tạo lại mã phía máy chủ của bạn. Bài viết này sử dụng một phiên bản cải tiến của công cụ này để cho phép bạn thực hiện các bổ sung ở mức hoạt động của cấu hình dịch vụ và để thực hiện nhiều phép bổ sung thêm chỉ bằng một lần thi hành công cụ. Phiên bản được cải tiến là com.sosnoski.ws.PolicyTool; các phiên bản mã nguồn và mã nhị phân nằm trong thư mục policytool của phần mã tải về. Xem tệp readme.txt trong thư mục đó để tìm các hướng dẫn.

Trong Liệt kê 5, bạn có thể thấy rằng một tham chiếu tới mô đun Rampart và một bản sao của chính sách cấu hình máy chủ đã được thêm vào các định nghĩa của hai hoạt động sử dụng WS-Security, getBooksByTypeaddBook. Những thay đổi này định cấu hình dịch vụ để gài Rampart chỉ cho hai hoạt động đó và sử dụng các giá trị cài đặt được cung cấp để truy cập khóa và chứng chỉ Rampart.

Nếu bạn xây dựng và triển khai tệp AAR đã tạo ra cho một bản cài đặt máy chủ Axis2, bạn có thể thấy hiệu ứng của điều này trong trang Administration/Available Services (Quản trị/Các dịch vụ có sẵn), ở đây các mô đun được gài vào cho từng hoạt động đã định nghĩa dịch vụ được liệt kê. Nếu bạn chạy mã máy khách và theo dõi việc trao đổi thông báo (bằng cách sử dụng một công cụ như TCPMon, đã mô tả trong "Cơ sở về WS-Security của Axis2"), bạn sẽ thấy rằng xử lý an ninh làm việc như mong muốn, với:

  • Không có tiêu đề WS-Security nào trên các thông báo getBook.
  • Một tiêu đề WS-Security với một UsernameToken trong thông báo yêu cầu getBooksByType.
  • Một tiêu đề WS-Security với các chữ ký trong thông báo yêu cầu addBook (nhưng không có đáp ứng).

Các hạn chế của Axis2/Rampart

Axis2 và Rampart hiện tại (có nghĩa là, với bản phát hành Axis2 1.5 hiện có và việc xây dựng Rampart hàng đêm) có khả năng xử lý các cấu hình WS-SecurityPolicy cơ bản được nhúng trong WSDL, bao gồm các chính sách chi tiết mịn hơn được định nghĩa ở mức hoạt động hay mức thông báo. Tuy nhiên, một số cấu hình được thử nghiệm cho bài viết này sẽ không làm việc với Axis2/Rampart. Ví dụ, việc cố gắng thiết lập chính sách UsernameToken cho hoạt động addBook (ngoài chính sách ký trong thông báo đầu vào) dẫn đến một lỗi rõ ràng có liên quan đến mã hóa trong mã Rampart (mặc dù đã không sử dụng mã hóa). Xét đoát từ kinh nghiệm này và từ một số báo cáo lỗi, có vẻ như việc xử lý WS-SecurityPolicy của Axis2/Rampart là tốt cho các cấu hình đơn giản phản ánh trường hợp sử dụng thông thường, nhưng dễ thất bại khi được áp dụng cho các tổ hợp không thông thường.

Một vấn đề khác là chi phí của việc kích hoạt Rampart trên máy chủ sẽ luôn luôn xảy ra cả trong xử lý yêu cầu lẫn xử lý đáp ứng ngay cả khi bạn đang áp dụng WS-Security cho chỉ một trong các thông báo (như được thảo luận trong "Chi phí cao của (WS-)Security"). Về phía máy khách, tình hình thậm chí còn tồi tệ hơn — vì việc kích hoạt Rampart trên máy khách hiện là giải phảp tất cả-hay-không có gì, nếu bạn sử dụng WS-Security trên bất kỳ một hoạt động nào bạn sẽ phải sống chung với chi phí Rampart trên mọi hoạt động.

Cuối cùng, việc xử lý WS-Policy của Axis2/Rampart hiện tại không hỗ trợ các lựa chọn chính sách. Các lựa chọn là một đặc tính chính của việc thiết kế WS-Policy, cho phép các dịch vụ để cho các khách hàng lựa chọn cấu hình nào trong hai hay nhiều cấu hình có thể chấp nhận được sử dụng khi họ truy cập vào các dịch vụ. Việc thực hiện chính sách Axis2/Rampart không hỗ trợ tính năng này, thay vào đó bỏ qua tất cả mọi thứ trừ sự lựa chọn đầu tiên.


Tiến lên

Với bài viết này và ba bài trước đó, loạt bài Java Web services đã trình bày tất cả các khía cạnh chính trong việc xử lý WS-Security và WS-SecurityPolicy của Axis2/Rampart, bao gồm cả các vấn đề hiệu năng. Trong các bài viết tiếp theo, bạn sẽ thấy cách các khung công tác dịch vụ Web Java khác hoạt động với WS-Security và WS-SecurityPolicy như thế nào, nhưng trước tiên có một số khía cạnh khác của Axis2 cần xem xét kỹ.

Một vấn đề quan trọng với nhiều tổ chức là sự hỗ trợ cho Kiến trúc Java cho phiên bản liên kết XML 2.X (JAXB 2.X - Java Architecture for XML Binding 2.X). JAXB 2.X là tiêu chuẩn Java chính thức để liên kết dữ liệu XML và mặc dù các lựa chọn mã nguồn mở mang lại những lợi ích riêng của chúng, một số tổ chức muốn bám chặt tiêu chuẩn này. Trong bài viết tiếp theo, bạn sẽ thấy cách bạn có thể sử dụng liên kết dữ liệu JAXB 2.X với Axis2 như thế nào và tìm hiểu nó so sánh với các lựa chọn liên kết dữ liệu khác được Axis2 hỗ trợ ra sao.


Tải về

Mô tảTênKích thước
Source code for this articlej-jws7.zip29KB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Công nghệ Java, SOA và dịch vụ Web, Nguồn mở
ArticleID=455805
ArticleTitle=Các dịch vụ Web Java: Sử dụng độ chi tiết của WS-Security
publish-date=12112009