![](/img/trans.png)
[英]how to fix fastlane error: Keystore file 'keystore.jks' not found for signing config 'externalOverride'.?
[英]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.