簡體   English   中英

如何使用 keystore.jks 對 SOAP 消息進行簽名和加密

[英]How to use keystore.jks to sign and encrypt a SOAP message

我是 Web 服務安全性的新手,我正在嘗試學習如何對soap 消息請求進行簽名和加密。 我已經閱讀了很多與這個主題相關的帖子,但似乎有很多不同的方法,我很困惑要走哪條路。

我有一個正常運行的 Web 服務 (SOAP)。 我還有一個包含 2 個條目的 keystore.jks 文件。

第一個條目類型是trustedCertEntry。 (X.509 / RSA 公鑰)

第二個條目類型是privateKeyEntry。

我的理解是密鑰庫包含憑據,信任庫包含受信任的網站(服務器)列表。 所以“...\\jdk1.6.0_19\\jre\\lib\\security\\cacerts”是我的信任庫,keystore.jks 是我的密鑰庫。

我假設我需要使用密鑰庫憑據來簽署和加密soap 消息。 但是如何實現它對我來說仍然不清楚。

我可以獲得 X.509 證書。

KeyStore ks = KeyStore.getInstance(KEYSTORE_INSTANCE);
ks.load(new FileInputStream(KEYSTORE_FILE), KEYSTORE_PWD.toCharArray());
ks.getCertificate(KEYSTORE_ALIAS);

我也可以得到私鑰:

KeyStore.Entry entry = ks_pk.getEntry(KEYSTORE_ALIAS_PK, new KeyStore.PasswordProtection(pass));

所以我可以從密鑰庫中獲取信息,但我不確定如何處理它以便對我的 SOAP 請求消息進行簽名和加密。

我是否需要將簽名添加為另一個 SOAPheader 元素? 如何加密消息?

任何指針、代碼示例和提示將不勝感激。

我使用 Apache CXF 作為客戶端和 Rampart 來簽署和加密 SOAP 消息。 這個 Rampart 包實現了 WSS 標准。

在客戶端項目中,在 pom.xml 中添加以下依賴項 [檢查可用的最新版本]

<dependency>
    <groupId>org.apache.rampart</groupId>
    <artifactId>rampart-policy</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>org.apache.rampart</groupId>
    <artifactId>rampart-core</artifactId>
    <version>1.4</version>
</dependency>

創建一個crypto.properties文件,它應該放在類路徑中,如下所示:

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=JKS
org.apache.ws.security.crypto.merlin.file=c:/Documents and Settings/garry/keys/client.ks [this is the path to keystore]
org.apache.ws.security.crypto.merlin.keystore.password=client-ks-pass [this is the keystore password]

然后修改 Client 類,提供 Rampart 執行簽名所需的信息

添加以下導入:

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import org.apache.cxf.ws.security.SecurityConstants;
import org.apache.ws.security.WSPasswordCallback;

//實現回調處理程序以檢索密碼

SService ss = new SService(wsdlURL, SERVICE_NAME);
Service port = service.getPort1();
BindingProvider bp = (BindingProvider) port;
Map<String, Object> context = bp.getRequestContext();
//c1 is The alias of the entry in the keystore
context.put(SecurityConstants.SIGNATURE_USERNAME, "c1");
context.put(SecurityConstants.CALLBACK_HANDLER, new CallbackHandler() {
    @Override
    public void handle(Callback[] callbacks) throws IOException,
    UnsupportedCallbackException {
        for (int i = 0; i < callbacks.length; i++) {
                WSPasswordCallback pwcb = (WSPasswordCallback) callbacks[i];
                String id = pwcb.getIdentifier();
                if (id.equals("c1")) {
                pwcb.setPassword("c1-pass");
            }
        }
    }
    });
context .put(SecurityConstants.SIGNATURE_PROPERTIES, "crypto.properties");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM