該教程包括兩個部分,在第 1 部分中,您將瞭解如何使用 IBM® Websphere® Studio Application Developer V5.1.2(以下稱爲 Application Developer)保護使用傳輸級安全性 (HTTPS) 的 Web 服務,以及如何從 Java™ 2 Extended Edition (J2EE)、Java 2 Standard Edition (J2SE) 和 .Net 客戶機中對其進行訪問。然後我們將在 Web 服務安全性頭中添加 UsernameToken、數字簽名和加密並從 J2EE 客戶機中調用它們。
在該教程中,我們將瞭解如何在 Application Developer 和 Application Server 中配置 Web 服務安全性。我們將配置傳輸級安全性和 Web 服務安全性。我們的示例場景包括三個客戶機和一個服務器,如圖 1 所示。
圖 1. 示例場景
首先,您需要在 Application Developer 中創建下面的 Java 項目:
- EchoService——一個包含 EJB 模塊 (EchoServiceEJB) 的企業應用程序,該模塊包括示例服務 (EchoService) 的實現和一個 Web 模塊 (EchoServiceWeb),而 Web 模塊承載服務 HTTP 端點並在 EJB 模塊中向實現轉發請求。
- EchoServiceClient——一個包含 Web 模塊 (EchoServiceClientWeb) 的企業應用程序,該 Web 模塊包含作爲 EchoService 的客戶機的 Servlet (TestServlet)。
- EchoServiceJ2SEClient——一個單機版 Java 應用程序項目,該項目包含作爲 EchoService 的客戶機的 Java 應用程序 (TestClient)。
- EchoServiceClient.exe——一個 .Net EchoService 客戶機,它是在安裝有.Net framework Version 1.1 和 Microsoft Web Services Enhancements V2.0 的 Microsoft™ Windows™ 2000 之上構建的。
我們將在兩個級別中使用 PKI 密鑰和證書。首先,我們將使用 SSL 保護 HTTP 傳輸,這裏需要證書。其次,客戶機將與使用 Web 服務和 Web 服務安全性(包含 XML 簽名以及 XML 加密元素)的服務器進行交互,因此這裏同樣需要證書。
示例場景中的三個客戶機都使用 SSL 傳輸安全性。Servlet 和 Java 2 Standard Edition 客戶機使用雙向驗證的 SSL,而 .Net 客戶機只使用服務器身份驗證。
只有基於 Servlet 的客戶機,TestServlet,具有 Web 服務安全性。我們將爲該客戶機配置 XML 數字簽名、XML 加密以及 UsernameToken。
|
要完成該教程,您需要下面的工具:
- 具備 V5.1 WebSphere Test Environment 的 Application Developer V5.1.2。
- 如果希望使用該教程附帶的 .Net 客戶機,您還需要一臺安裝了 .Net framework V1.1 的 Windows 計算機(2000 或者 XP)。
需要具備以下知識:
- 熟悉如何使用 Application Developer V5.1.2 構建 Web 服務。
- 理解安全性的概念和術語。
- 熟悉如何使用 Application Developer 保護 Web 應用程序。
|
創建本教程使用的全部項目所需的 Application Developer V5.1.2 項目交換文件稱爲 WSS5.1.zip,它包含在下載部分附帶的 wssecurity1.zip 文件中。
- 選擇 Start => Programs => WebSphere Studio => Application Developer,啓動 Application Developer。
- 通過將名稱 L10 添加到缺省名稱,創建一個新工作區。
- 將 EchoService 和客戶機導入到該工作區,如下所示:
- 選擇 File => Import => Project Interchange。
- 瀏覽到 /WTE2004/WSSecurity 文件夾。
- 選擇 WTE2004WSLabs.zip。
- 生成 EJB Deploy 和 RMIC 代碼,如下所示:
- 在 EJB Modules 下面,選擇 EchoServiceEJB 項目。
- 右鍵單擊該項目,選擇 Generate => Deploy and RMIC Code。
- 選擇 EchoService,然後單擊 Finish。
- 通過執行以下操作,驗證測試服務器是否正常啓動:
- 打開服務器透視圖 (Server perspective)。
- 選擇 Servers 選項卡。
- 右鍵單擊 WebSphere v5.1 Test Environment 服務器,然後選擇 Start。如果應用服務器正常啓動,您應該在控制檯窗口看到下面的信息:
|
這一部分描述了創建密鑰存儲和密鑰所必需的步驟,以便將 Application Server 用於測試。沒有介紹生產環境中常見的發出證書請求的實踐。
Application Server 提供了操作密鑰存儲的兩個工具:
- iKeyman 提供了使用密鑰存儲的圖形界面,這可能更適合於新用戶。但 iKeyman 有一個侷限性,它不允許用戶指定每一個密鑰的密碼。它爲存儲中的所有密鑰設置的密鑰密碼與密鑰存儲密碼相同。
- keytool 是 Java 開發工具包 (JDK) 所附帶的,它提供一個命令行界面。對大多數應用程序來說,這是首選項,因爲它可以通過編寫腳本來實現。
由於 keytool 具有更大的靈活性,它允許密鑰密碼獨立於密鑰存儲密碼進行配置,並且它可以通過編寫腳本來實現,因此在該教程中我們將使用 keytool 創建密鑰。
請注意,雖然兩個工具都允許用戶生成自簽署的證書,但是它們都不允許用戶簽署證書。使用某個受信任的認證中心密鑰簽署證書的功能需要最複雜的 PKI 安裝,這表明爲了實現此目的,任何部署 PKI 技術的組織都應該研究成熟的工具。Application Server 附帶的工具適用於小型安裝和測試的目的。
這一經常忽視的步驟可以幫助避免混淆和失敗,而它們往往以安全性專家的昂貴訪問而告終。花幾分鐘的時間從邏輯上擬定系統,這些系統將通信並指示它們需要哪些密鑰,這些密鑰存儲在哪些密鑰存儲中。圖 2 顯示了密鑰存儲的一個可能的佈局。在該圖中,Echo Service 寄宿在 Application Server 中。
圖 2. 密鑰存儲佈局示例
當生成使用傳輸安全性的密鑰時,會出現兩個問題。第一個問題是,頒發給服務器的證書中專有名稱 (DN) 的通用名稱 (CN) 組件應該是服務器的域名。第二個問題是,如果使用客戶機證書,客戶機證書中的 DN 可能必須映射到服務器使用的用戶註冊表中的一個真正的用戶。可以將 Application Server 配置爲只檢查客戶機證書是否由受信任的認證中心頒發,但是也可以配置爲根據客戶機證書中的 DN 建立安全上下文。在後面的示例中,客戶機證書必須包含 Application Server 領域的一個有效的用戶 DN。
對於雙向 SSL,我們需要客戶機密鑰和服務器密鑰。
- 客戶端需要考慮的事項:要建立 Application Server 安全上下文,我們不使用用於建立 SSL 會話的客戶機證書,因此我們不需要考慮頒發一個其 DN 與 Application Server 用戶註冊表中的 DN 相匹配的客戶機證書。然而,我們需要將客戶機配置爲信任簽署服務器的公鑰證書的認證中心 (CA)。在我們的示例中,由於服務器的證書是自簽署的,我們需要將服務器的公鑰證書配置爲客戶機受信任的簽署者。
- 服務器端需要考慮的事項:我們要將服務器配置爲需要受信任的 CA 頒發的客戶機證書。因爲我們的客戶機證書將是自簽署的,所以我們需要將客戶機的公鑰證書配置爲服務器受信任的簽署者。同樣,如上所述,按照約定,編寫的客戶機必須要求:用於識別服務器的證書(當建立 SSL 會話時,服務器提供給客戶機的證書)具有的 CN 與客戶機認爲正在與其通信的主機的域名相同。這意味着,當客戶機試圖與 https://www.mydomain.com/ 建立 SSL 連接時,客戶機必須要求:服務器提供給客戶機的證書中的 CN 爲 www.mydomain.com。這是一個稍微簡單的示例,可能會有更加複雜的場景,但它表示了實質問題。因此,我們需要決定客戶機將使用哪一個 URL 與服務器取得聯繫並使用其 CN 設置爲服務器創建證書。爲了使我們的場景變得簡單,我們將在同一臺計算機上運行所有的客戶機和服務器,這樣我們可以選擇使用客戶機使用的 URL 中的主機名
localhost
與服務器連接。因此,這意味着應該將我們的服務器證書的 CN 設置爲localhost
。
按照約定,將密鑰存儲分爲兩類,一類包含私鑰,一類包含公鑰。後者一直包裝在公鑰證書中。我們在此處將遵循該約定,爲每個客戶機和服務器創建兩個密鑰存儲。
有關下面使用的命令行選項的詳細說明,請參閱 keytool 用戶指南。
我們希望生成的這些密鑰可以用於 Application Server 中。當爲 Application Server 創建 SSL 配置時,您將注意到不能指定密鑰別名或者密鑰密碼。從這裏您可以看出,使用 SSL 的用於包含私鑰的密鑰存儲應該只包含一個私鑰(它可以包含其他的公鑰證書)。您還可以看到,密鑰密碼必須設置爲密鑰存儲密碼。
下面的步驟描述瞭如何創建該練習中使用的密鑰。您可以按照以下部分一個一個地進行練習,或者使用 wssecurity1.zip 文件中附帶的 createKeyStores.cmd 命令文件。
設置 keytool
- 打開命令提示符,轉到目錄 c:/WSSLabOne。
- 通過鍵入下面的命令,將包含 keytool 的目錄添加到路徑中:
其中 <WSAD_Install_Root> 是 Application Server 的安裝目錄。例如:
爲 J2SE 和 J2EE 客戶機創建密鑰對和證書
- 要創建密鑰對和自簽署的公鑰證書來表示 J2SE 和 J2EE 客戶機,請轉到命令提示符並在一行中鍵入下面的命令:
成功完成以後,您將看到以下信息:
您還應該有一個稱爲 clientsslkeys.jceks 的文件。
請注意,如果您要根據客戶機證書中的標識在 Application Server 中建立安全上下文,您需要使用承載服務的 Application Server 使用的用戶註冊表中 keytool 命令的 DN。爲此,您需要確定希望客戶機表示的用戶 DN,然後將該 DN 放在 -dname 選項後面的引號中。
- 要導出客戶機公鑰證書以將其導入到服務器信任存儲中,請鍵入下面的命令:
成功完成該命令以後,您將看到以下信息:
現在您有了第二個文件,稱爲 wasclient.cert。
爲服務器創建密鑰對和證書
- 在一行中鍵入下面的命令創建密鑰對和自簽署的公鑰證書,以表示 Application Server:
成功完成以後,您將看到以下信息:
您應該有了一個稱爲 serversslkeys.jceks 的文件。
請注意,如果訪問服務器時 URL 中使用的主機名不是
localhost
,則需要修改上面的 DN 以反映這種情況。爲此,您要確定希望客戶機在 URL 中使用的服務器的主機名,然後將該字符串放在引號中的 DN 的cn=
部分,位於 keytool 命令中 -dname 選項之後。上面的配置將爲 URL 進行如下設置:http://localhost/somepath
。 - 通過鍵入下面的命令,導出服務器公鑰證書以將其導入到客戶機信任存儲中:
該命令成功完成以後,您將看到以下信息:
現在您有了一個稱爲 wasserver.cert 的文件。
既然已經爲客戶機和服務器創建了密鑰存儲,我們需要爲客戶機和服務器創建信任存儲來建立信任域。我們需要使用客戶機中的服務器公鑰證書來爲客戶機創建信任存儲。在創建客戶機信任存儲之前,必須已經使用上面服務器部分中的命令創建服務器密鑰存儲並導出服務器公鑰證書。
- 通過執行下面的命令,使用服務器公鑰證書爲客戶機創建信任存儲:
完成之後,您將看到以下信息:
創建了文件 clientssltsrts.jceks。
- 通過執行下面的命令,使用客戶機公鑰證書爲服務器創建信任存儲:
完成之後,您將看到以下信息:
創建了文件 serverssltsrts.jceks。
現在我們具備了配置示例場景所示的 SSL 連接所需要的所有文件。我們可以使用 wasserver.cert 文件爲 .Net 客戶機配置 Windows 環境。接下來,我們需要爲 Web 服務安全性簽名和加密創建密鑰和證書。
在我們的實現中有一個客戶機和一個服務器:EchoServiceClient 和 EchoService。要允許使用 PKI 技術的數字簽名,簽署方 (EchoServiceClient) 必須有權使用將其視爲簽名驗證者 (EchoService) 的私鑰。簽名驗證者必須有權使用包含與用於生成簽名的私鑰關聯的公鑰的公鑰證書。
對於使用 PKI 技術的加密,加密方必須有權使用包含爲其加密消息的一方(即解密方)的公鑰的公鑰證書。而解密方必須有權使用與用於加密消息的公鑰關聯的私鑰。
在我們的場景中,將簽署和加密來自和到達服務的請求。實際上,我們的配置將與 SSL 所需的配置幾乎完全相同,客戶機一方不希望服務的 DN 中的 CN 與服務的 URL 中的主機名相匹配除外。因爲 Application Server V5.1 只支持 J2EE 客戶機,所以我們不用考慮 J2SE 客戶機。
按照約定,我們將密鑰存儲分爲兩類,一類包含私鑰,一類包含公鑰(後者一直包裝在公鑰證書中)。最後,我們將創建兩類密鑰存儲,一類用於客戶機,一類用於服務器。有關下面使用的命令行選項的詳細說明,請參閱 keytool 用戶指南。
爲 EchoService 客戶機創建密鑰
- 在一行中鍵入下面的命令創建密鑰對和自簽署的公鑰證書,以表示基於 J2EE 的 EchoService 客戶機:
完成以後,您將看到以下信息:
如果您要根據客戶機證書中的標識在 Application Server 中建立安全上下文(通過在 Web 服務安全性頭中傳遞客戶機證書),您需要使用承載服務的 Application Server 使用的用戶註冊表中 keytool 命令的 DN。爲此,您需要確定希望客戶機表示的用戶 DN,然後將該 DN 放在 -dname 選項後面的引號中。
- 通過鍵入下面的命令,導出客戶機公鑰證書以將其導入到受信任的客戶機證書的服務器存儲中:
完成以後,您將看到以下信息:
爲 EchoService 創建密鑰
- 在一行中鍵入下面的命令創建密鑰對和自簽署的公鑰證書,以表示 EchoService:
您將看到以下信息:
- 通過鍵入下面的命令,導出服務器的公鑰證書以將其導入到客戶機存儲中:
您將看到以下信息:
既然已經爲 EchoService 客戶機和 EchoSevice 創建了密鑰存儲,我們需要爲客戶機和服務器創建信任存儲來建立信任域。
創建 EchoClient 密鑰存儲
現在需要使用客戶機中的服務器公鑰證書來爲客戶機創建密鑰存儲,這樣我們就可以使用服務器的公鑰驗證來自服務器的簽名,爲服務器加密消息。爲此,請鍵入下面的命令:
|
您將看到以下消息:
|
創建 EchoServer 密鑰存儲
我們需要使用服務器中的客戶機公鑰證書來爲服務器創建密鑰存儲,這樣我們就可以使用客戶機的公鑰驗證來自客戶機的簽名,爲客戶機加密消息。爲此,請鍵入下面的命令:
|
您將看到以下信息:
|
現在已經構建了配置我們的示例場景需要的所有密鑰存儲文件。下載部分附帶的腳本完成了所有這些步驟。第一個版本適用於 Linux™/Unix® 平臺,而第二個版本適用於 Windows™。
|
既然已經創建了密鑰存儲,我們將爲服務器和客戶機配置安全性。在下面的示例中,我們將使用雙向 SSL 向 Web 服務調用提供完整性和機密性。配置雙向 SSL 以後我們將 UsernameToken 添加到 Web 服務安全性頭中來提供身份驗證。您可以看到,實際上,傳輸級安全性的服務器端配置只需遵循與保護常規 Web 應用程序承載的任何常規 URL 所用的步驟相同的步驟。
- 在服務器列表中雙擊服務器,打開服務器配置編輯器。
- 切換到 Security 選項卡並執行以下操作:
- 選中 Enable security 複選框。
- 指定
wasuser
作爲服務器 ID。 - 指定
wasuser
作爲服務器密碼。
圖 3. 啓用安全性 - 保存配置並重新啓動服務器。
- 在 Web 透視圖中,選擇 EchoServiceWeb => Web Deployment Descriptor。
- 單擊 Security 選項卡。
- 在 Security Roles 字段中,單擊 Add 添加一個新的安全性角色。
- 將該安全性角色命名爲 EntityConnectingToEchoServiceUsingSSL。
圖 4. 添加安全性角色 - 然後在 Security 頁面上,從 Security Roles 選項卡切換到 Security Constraints 選項卡。
- 單擊 Add 添加一個新的安全性約束。
- 在 Web Resource Collections 部分中,選擇缺省的 Web 資源集合 New Web Resource Collection,並單擊 Edit。
- 按照以下步驟編輯集合:
- 將名稱設置爲 EchoService。
- 選中所有的 HTTP 方法。
- 添加服務 URL /services/EchoService(WSDL 中的 URL 不包含 Web 應用程序上下文根 (context root))。
- 單擊 OK。
圖 5. 編輯 Web 資源集合 - 在 Authorized Roles 部分中,單擊 Edit 添加剛剛創建的角色 EntityConnectingToEchoServiceUsingSSL。
- 在 User Data Constraint 字段中,將數據約束類型改爲 Confidential。
- 切換到 Pages 選項卡並檢查 Login 部分,確保將 Authentication Method 設置爲 Unspecified。
圖 6. 註冊身份驗證方法如果希望基於傳入的客戶機證書建立 Application Server 安全上下文,則需要將身份驗證方法設置爲
Client-Cert
。您必須在證書中使用一個有效的用戶 DN 以使證書正常工作。未指定身份驗證方法時,默認爲 Basic,這意味着 Application Server 將在 HTTP 頭中查找用戶名和密碼。最初我們不會發送該信息,因此必須告訴 Application Server 我們正在保護的 URL 應該允許每一個人訪問。在企業應用程序部署描述符中完成該操作,如下所示。
- 保存配置並關閉 Web 應用程序部署描述符編輯器。
- 選擇 EchoService => EAR Deployment Descriptor 編輯 EchoService 企業應用程序部署描述符。
- 切換到 Security 選項卡並單擊 Gather。
- 選擇聚合角色 EntityConnectingToEchoServiceUsingSSL。
- 選中 WebSphere Bindings 下面的 Everyone。這將有效地禁止生成 J2EE 安全上下文,從而使我們不必在客戶機證書中使用有效的用戶名。
圖 7. 指定安全訪問 - 保存配置並關閉編輯器。
在爲 Application Server 創建 SSL 配置時,可以注意到不能指定密鑰別名或密鑰密碼。從這裏可以得出下面的結論:
- 使用 SSL 的用於包含私鑰的密鑰存儲應該只包含一個私鑰(它可以包含其他的公鑰證書)。
- 密鑰密碼必須設置爲密鑰存儲密碼。
在 Application Developer 中創建 SSL 配置有兩種方式:
- 在應用服務器上啓用管理控制檯,然後使用控制檯創建 SSL 配置。
- 在應用服務器配置編輯器中添加 SSL 配置。
- 在服務器透視圖中,雙擊服務器列表中的服務器,打開配置編輯器。
- 切換到 Configuration 選項卡。
- 選中 Server Configuration 下面的 Enable administration console。
圖 8. 啓用管理控制檯 - 保存配置並關閉編輯器。
- 重新啓動服務器。
- 在服務器列表中右鍵單擊服務器,選擇 Run administrative console。如果出現安全警報,單擊 Yes。
- 使用 wasuser 作爲用戶 ID 和密碼,登錄到管理控制檯。
- 在導航樹中,選擇 Security => SSL 可以看到 SSL 配置的列表。
- 單擊 New 創建一個新的 SSL 配置。
圖 9. SSL 配置 - 按照以下操作填寫新的 SSL 配置:
- 指定一個與 Application Server 一致的別名;例如:WASServerSSL。
- 將密鑰文件名設置爲服務器 SSL 密鑰文件的文件系統中的完整路徑;例如:<path>/serversslkeys.jceks,其中
<path>
爲密鑰文件的位置。 - 爲密鑰文件設置密碼;例如:serversslkeys。
- 將密鑰存儲格式設置爲適當的存儲類型。編輯器將 JCEKS 類型稱爲 JCEK。
- 將信任文件名設置爲服務器 SSL 信任文件的文件系統中的完整路徑;例如 <path>/serverssltrusts.jceks,其中 <path>> 爲密鑰文件的位置。
- 設置信任文件的密碼;例如 serverssltrusts。
- 設置信任文件的格式;例如,JCEK。
- 選擇 Client authentication。
- 單擊 OK 保存配置。請注意,只有單擊屏幕頂部的 Save 時纔會真正保存配置,但由於我們要對配置進行更多的修改,因此將在完成修改以後保存所有的更改。
圖 10. SSL 配置
現在需要設置 Web 容器以在 HTTPS 端口使用新的 SSL 配置。在管理控制檯,按照以下步驟進行設置:
- 選擇 Servers => Application Servers。
- 在服務器列表中選擇 server1。
- 在 Additional Properties 下面,選擇 Web Container。
圖 10. 選擇 Web 容器 - 在 Additional Properties 下面,選擇 HTTP Transports。
圖 11. 選擇 HTTP 傳輸可以將 Application Server 配置爲在端口 9443 上通過 SSL 公開應用程序。在這裏,可以創建新的傳輸定義並偵聽另一個端口,但現在我們只在端口 9443 上修改 SSL 配置。
- 選擇與端口 9443 關聯的主機名。缺省值爲 *,它表示接受任何主機名。
圖 12. 選擇主機名 - 爲該傳輸更改 SSL 配置以使用新的 SSL 配置 localhost/WASServerSSL。請注意,管理控制檯將 localhost/ 作爲提供給 SSL 配置的名稱的前綴。
圖 13. 指定 SSL 配置 - 單擊 OK。
- 在屏幕頂部單擊 Save 鏈接,保存配置更改。
- 單擊 Save,將這些更改寫入配置文件中。
|
基於 Application Server 的客戶機是運行於 Application Server 容器內部的 Web 服務客戶機。這樣的客戶機有 Servlet、JSP 和 EJB。完成以下部分中的步驟來配置基於 Application Server 的 Web 服務客戶機,以將 SSL 用於客戶機到服務的連接。在我們的示例場景中,基於 Application Server 的客戶機是在 com.ibm.issw Java 包中的 EchoServiceClientWeb Web 應用程序中實現的 Servlet。我們將使用 Application Developer 對示例場景代碼做一些更改。
有兩種方法可以更改客戶機用於調用服務的端點。第一種方法是修改生成的 Locator 類。然而,這不是一個很好的策略,因爲重新生成代理時該類將被重寫。更好的方法是,實例化 setEndpoint() 後在代理上調用它。
- 在 Java 透視圖中,選擇 EchoServiceClientWeb => com.ibm.issw => TestServlet。
- 創建代理對象後在代碼中添加一行代碼,以在代理對象上調用 setEndpoint(),如下所示。
圖 14. 修改代碼以調用 setEndpoint() - 要獲取一個有好的開頭的 URL 來傳遞給 setEndpoint(),可以打開所生成的 Locator 類並查找私有最終字符串 echoService_address。
- 選擇地址字符串並將其複製到剪貼板。
圖 15. 獲取 URL 地址 - 切換回 TestServlet 代碼並將地址粘貼到對 setEndpoint() 的調用,然後做如下修改:
- 將協議更改爲 https。
- 將端口更改爲 9443。代碼行應該如下所示:
如下圖所示:
圖 16. 修改 TestServlet 代碼
- 保存 TestServlet 代碼。
現在我們需要爲客戶機創建 SSL 配置,以將其用於與服務器進行通信。在爲 Application Server 創建 SSL 配置時,可以注意到不能指定密鑰別名或密鑰密碼。從這裏可以看出,使用 SSL 的用於包含私鑰的密鑰存儲應該只包含一個私鑰(它可以包含其他的公鑰證書)。還可以看出,必須將密鑰密碼設置爲密鑰存儲密碼。本練習的步驟與服務器端所用的步驟類似,如下所示:
- 使用 wasuser 作爲用戶 ID 和密碼登錄到管理控制檯。請注意,您可能已從服務器端的先前配置登錄了。
- 在導航樹中,選擇 Security => SSL 可以看到 SSL 配置的列表。
- 單擊 New 創建一個新的 SSL 配置。
- 按照以下操作填寫新的 SSL 配置:
- 將別名設置爲一個與 Application Server 一致的名稱;例如,WASClientSSL。
- 將密鑰文件名設置爲服務器 SSL 密鑰文件的文件系統中的完整路徑;例如,<path>/clientsslkeys.jceks,其中 <path> 爲密鑰文件的位置。
- 爲密鑰文件設置密碼;例如,clientsslkeys。
- 將密鑰存儲格式設置爲適當的存儲類型。編輯器將 JCEKS 類型稱爲 JCEK。
- 將信任文件名設置爲服務器 SSL 信任文件的文件系統中的完整路徑;例如,<path>/clientssltrusts.jceks,其中 <path> 爲密鑰文件的位置。
- 設置信任文件的密碼;例如,clientssltrusts。
- 設置信任文件的格式;例如:JCEK。
- 單擊 OK。
- 單擊屏幕頂部的 Save。
- 單擊 Save。
圖 17. 配置 SSL
既然爲客戶機創建了 SSL 配置,我們需要告訴 Application Server Web 服務客戶機存根調用服務時使用它。爲此,我們將指向 SSL 配置的引用添加到 Web 服務客戶機部署描述符文件中。
- 在 Web 透視圖中,選擇 EchoServiceClientWeb => Web Content => WEB-INF => wsdl => webservicesclient.xml。
- 切換到 Port Bindings 選項卡。
- 在 Port Qualified Name Binding Details 部分中,在 HTTP SSL configuration name 字段中輸入
localhost/WASClientSSL
。請注意,通過管理控制檯添加 SSL 配置時,localhost/
爲指定的 SSL 配置的名稱的前綴。
圖 18. 配置 Web 服務部署描述符 - 重新啓動服務器。
- 現在通過使用 URL (
http://localhost:9080/EchoServiceClientWeb/TestServlet
) 調用 TestServlet,可以測試基於 Application Server 的客戶機與服務的連接。
|
非基於 Application Server 的客戶機是在 Application Server 容器外運行的客戶機。這樣的客戶機有託管 J2EE 客戶機應用程序和單機版 J2SE Java 應用程序。
有兩種方法可以更改客戶機用於調用服務的端點。第一種方法是修改生成的 Locator 類。然而,這不是一個很好的策略,因爲重新生成代理時該類將被重寫。更好的方法是,實例化 setEndpoint() 後在代理上調用它。爲此,按照以下步驟進行操作:
- 在 Java 透視圖中,選擇 EchoServiceJ2SEClient => com.ibm.issw => TestClient.java。
- 創建代理對象後在代碼中添加一行代碼,以在代理對象上調用 setEndpoint()。
- 要獲取一個有好的開頭的 URL 來傳遞給 setEndpoint(),可以打開所生成的 Locator 類並查找私有最終字符串 echoService_address。
- 選擇地址字符串並將其複製到剪貼板。
- 切換回 TestClient 代碼並將地址粘貼到對 setEndpoint() 的調用,然後做如下修改:
- 將協議更改爲 https。
- 將端口更改爲 9443。
- 代碼行應該如下所示:
如下圖所示:
圖 19. 配置服務端點
- 保存 TestClient 代碼。
對於 Application Developer 附帶的 WebSphere 測試環境 (WTE),需要檢查是否已配置提供程序。用於檢查的文件所在的目錄類似於:
|
在 java.security 文件中查找安全性提供程序並添加下面的一行代碼:
|
其中 <n> 爲下一個未使用的號碼。
對於 J2SE 客戶機,我們使用 Java 系統屬性告訴運行時使用哪些密鑰和信任存儲。在命令行運行 Java 客戶機時,與您定義的任何其他系統屬性相同,將系統屬性添加到 Java 命令中。我們將在 Application Developer 內部運行 Java 客戶機。通過執行以下步驟,在 Application Developer 中將下面的系統屬性添加到 JVM 啓動命令行中:
- 爲了使用一組正確的庫而配置 Java 應用程序之前,我們要在 Application Developer 中定義環境變量,以使這一過程變得簡單,如下所示:
- 在 Application Developer 中,選擇 Window => Preferences。
- 在 Preferences 對話框中,從左邊的樹中選擇 Java => Classpath Variables。
- 選擇並編輯變量 WAS_50_PLUGINDIR。我們需要複製該變量的值以使創建新的變量更加簡單,因此繼續下一步,將該變量的值複製到剪貼板。
- 單擊 OK。
圖 20. 複製 WAS_50_PLUGINDIR 變量 - 回到 Preferences 對話框,單擊 New 創建一個新變量。
- 將新變量稱爲
WAS_51_PLUGINDIR
並從剪貼板粘貼值。在路徑的末尾添加1
,最後,路徑如下所示: - 單擊 OK。
- 現在讓我們配置客戶機,以在運行時使用正確的 java jar 文件。爲此,按照以下步驟進行操作:
- 右鍵單擊 EchoServiceJ2SEClient 項目,然後從上下文菜單中選擇 Properties。
- 在 Properties 對話框中,從左邊的菜單中選擇 Java Build Path,然後單擊 Libraries 選項卡。
圖 21. 創建新變量 - 編輯使用變量 WAS_50_PLUGINDIR 的每一個條目,並將其更改爲 WAS_51_PLUGINDIR。
圖 22. 編輯變量 - 單擊 OK 關閉 Properties 對話框。
- 打開 TestClient.java 文件,從 Application Developer 頂部菜單選擇 Run => Run...。
- 在 Run 對話框中,切換到 (x)=Arguments 選項卡並在 VM Arguments 部分中輸入以下內容:
其中 <path> 爲密鑰文件的位置,例如 <C>/WTE2004/WSSecurity/L10。
圖 23. 指定 VM 參數 - 單擊 JRE 選項卡並在 JRE 字段中選擇 WebSphere V5.1 JRE runtime。
- 單擊 Apply,然後單擊 Run 來測試 Java 客戶機。
圖 24. 指定 JRE 運行時
|
配置 .Net 組件以在連接到服務時提供特定的客戶端證書是一個複雜的過程。有關詳細信息,請參閱 MSDN 庫中的 Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication。
我們可以在 Windows 環境中相當容易地配置信任證書,以允許 .Net 客戶機信任 Application Server 提供的證書。首先需要更改服務器,使其不需要客戶端證書,然後在 Windows 環境中配置客戶機使用的服務器證書。
我們將使用 Application Server 管理控制檯修改服務器的 SSL 配置。也可以在 Application Developer 中使用服務器配置編輯器做同樣的事情。按照以下步驟進行操作:
- 使用 wasuser 作爲 ID 和密碼登錄到管理控制檯。請注意,您可能已從前面的配置操作中登錄了。
- 從左邊的樹中,選擇 Security => SSL 可以看到 SSL 配置的列表。
- 選擇 WASServerSSL 配置,然後單擊 Edit。
- 取消選中 Client Authentication 並保存配置。
- 重新啓動服務器。
已經創建 Windows 客戶機並將其作爲基於控制檯的 Windows 可執行文件。它將調用服務並在控制檯上打印出回顯字符串。在 Windows 中,傳輸機制 HTTP and HTTPS 是由系統組件處理的。這些系統組件在證書管理註冊表中查找信息。我們可以使用一個稱爲 Microsoft 管理控制檯 (MMC) 的工具管理 Windows 證書註冊表。可以使用 mmc
命令在命令行中調用 MMC。請按照以下步驟配置 Windows 以通過 SSL 進行 Web 服務調用:
- 在 Windows 開始菜單中單擊 Run 以啓動 MMC,然後在命令名稱中鍵入
mmc
。 - 在主窗口中,選擇 Console => Add/Remove Snap-in。
- 在 Add/Remove Snap-in 對話框中,單擊 Add。
- 在 Add Standalone Snap-in 對話框中,選擇列表中的 Certificates,然後單擊 Add。
圖 25. 添加證書 - 在 Certificates Snap-in 對話框中,選擇 Computer account,然後單擊 Next。
- 在 Select Computer 對話框中,確保已選中 Local computer,然後單擊 Finish。
- 關閉 Add/Remove Snap-in 對話框。
- 在左邊的樹中,選擇 Certificates (Local Computer) => Trusted Root Certificates。
- 右鍵單擊 Certificates 並選擇 All Tasks => Import。
圖 26. 導入證書 - 在 Certificate Import 嚮導中,瀏覽到包含服務器證書的文件。在我們的示例中,該文件爲 wasserver.cert。然後單擊 Next。
圖 27. 瀏覽到服務器證書 - 選擇 Automatically select the certificate store based on the type of certificate,然後單擊 Next。
- 在下一頁單擊 Next,然後單擊 Finish。
- 當出現提示時,回答 Yes。
上面是導入證書的一些步驟。現在可以按照以下步驟運行 .Net 客戶機來訪問響應服務:
- 打開命令窗口。
- 切換到 <drive>:/WTE2004/WSSecurity/L10 目錄。
- 運行 WTE2004Client.exe。
|
下一部分介紹了配置 Web 服務安全性 (WSS) 基礎設施來在 WSS 頭中傳遞 UsernameToken 所需的步驟。這一部分描述了 Application Developer 中所需的步驟,不過這些步驟與使用 Application Server 運行時附帶的 ATK 所需的步驟幾乎完全相同。我們描述瞭如何配置 Application Server 以在 Servlet 客戶機和響應服務之間的 WSS 頭中傳遞 UsernameToken。
按照以下步驟配置服務端:
- 在 Web 透視圖中,單擊 EchoServiceEJB => ejbModule => META-INF => wsdl => webservices.xml。
- 切換到 Security Extensions 選項卡。
- 打開 Login Config 部分。
- 單擊 Add 並從下拉列表中選擇 BasicAuth。
圖 28. 配置服務器登錄身份驗證 - 在 Add Authentication Method 對話框中,選擇兩個 Nonce 框,然後單擊 OK。需要 Nonce 以防止重播攻擊。
圖 29. 添加身份驗證方法 - 切換到 Binding Configurations 選項卡,然後在 Login Mapping 部分中單擊 Add。
- 在 Login Mapping 對話框中,執行以下操作:
- 在 Authentication method 中指定 BasicAuth。
- 輸入配置名稱
WSLogin
(區分大小寫)。 - 將 Callback handler 設置爲
com.ibm.wsspi.wssecurity.auth.callback.WSCallbackHandlerFactoryImpl
。 - 其他所有的值都保留缺省值。
- 單擊 OK。
圖 30. 配置服務器登錄映射 - 保存配置,然後選擇 EchoService => Restart Project。
按照以下步驟配置客戶端:
- 在 Web 透視圖中,單擊 EchoServiceClientWeb => Web Content => WEB-INF => wsdl > webservicesclient.xml。
- 切換到 Security Extensions 選項卡。
- 在 Login Config 部分中,在 Authentication method 字段中,從下拉列表中選擇 BasicAuth,然後選中 Nonce 框。
圖 31. 配置客戶機登錄身份驗證 - 切換到 Port Binding 選項卡,並在 Login Binding 部分中單擊 Enable。
- 在 Login Binding 對話框中,執行以下操作:
- 對於 Authentication method,選擇 BasicAuth。
- 從下拉列表中將 Callback handler 設置爲
com.ibm.wsspi.wssecurity.auth.callback.NonPromptCallbackHandler
。 - 輸入用戶 ID 和密碼。
- 單擊 OK。
圖 32. 配置客戶機登錄綁定
- 以上是發送靜態配置的 UsernameToken 需要做的所有工作。通過使用 URL (
http://localhost:9080/EchoServiceClientWeb/TestServlet
) 調用 TestServlet 測試客戶機。
|
描述 | 名字 | 大小 | 下載方法 |
---|---|---|---|
sample .NET client, scripts, project file | wssecurity1.zip | 62 KB | FTP|HTTP |
關於下載方法的信息 | Get Adobe® Reader® |
|
- 您可以參閱本文在 developerWorks 全球站點上的 英文原文。
- developerWorks SOA and Web services 專區提供有關 SOA 和 Web 服務方面的文章、下載和其他資源。
- developerWorks WebSphere Web services 專區提供有關 WebSphere 和 Web 服務方面的文章和其他資源。