我正在尝试在 Java 和 Spring 中创建签名的 SOAP 消息。
我在我的
@Bean
课上创建了一个ClientConfig
,这是内容:
@Bean
public CryptoFactoryBean getCryptoFactoryBeanClient() throws IOException {
CryptoFactoryBean cryptoFactoryBean = new CryptoFactoryBean();
Properties cryptoProperties = new Properties();
cryptoProperties.setProperty("org.apache.ws.security.crypto.provider", "org.apache.ws.security.components.crypto.Merlin");
cryptoProperties.setProperty("org.apache.ws.security.crypto.merlin.file", new ClassPathResource("client.jks").getPath());
cryptoProperties.setProperty("org.apache.ws.security.crypto.merlin.keystore.type", "jks");
cryptoProperties.setProperty("org.apache.ws.security.crypto.merlin.keystore.password", "clientkeystore");
cryptoFactoryBean.setConfiguration(cryptoProperties);
return cryptoFactoryBean;
}
之前我使用以下命令从终端创建了一个 jks 文件:
keytool -genkeypair -alias clientKeyPair -keyalg RSA -keysize 2048 \ -dname "CN=localNamespace" -validity 365 -storetype JKS \ -keystore client.jks -storepass clientkeystore
和另一个名为
server.jks
的 jks 密钥库,其中包含客户端公私密钥对的公钥。
当我尝试执行这段代码时,我总是得到这个错误,我无法修复:
23:06:10.342 [main] ERROR org.springframework.ws.soap.security.wss4j2.Wss4jSecurityInterceptor -- Could not secure response: Error during Signature:
org.springframework.ws.soap.security.wss4j2.Wss4jSecuritySecurementException: Error during Signature:
at org.springframework.ws.soap.security.wss4j2.Wss4jSecurityInterceptor.secureMessage(Wss4jSecurityInterceptor.java:630)
at org.springframework.ws.soap.security.AbstractWsSecurityInterceptor.handleRequest(AbstractWsSecurityInterceptor.java:206)
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:576)
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:539)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:391)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:385)
at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:375)
at com.soapproject.soapprojectwebservice.ExamsClient.getOneExam(ExamsClient.java:18)
at com.soapproject.soapprojectwebservice.RunClient.main(RunClient.java:28)
Caused by: org.apache.wss4j.common.ext.WSSecurityException: Error during Signature:
at org.apache.wss4j.dom.action.SignatureAction.execute(SignatureAction.java:173)
at org.apache.wss4j.dom.handler.WSHandler.doSenderAction(WSHandler.java:240)
at org.springframework.ws.soap.security.wss4j2.Wss4jHandler.doSenderAction(Wss4jHandler.java:58)
at org.springframework.ws.soap.security.wss4j2.Wss4jSecurityInterceptor.secureMessage(Wss4jSecurityInterceptor.java:628)
... 8 common frames omitted
Caused by: org.apache.wss4j.common.ext.WSSecurityException: No crypto property file supplied for signature
at org.apache.wss4j.dom.message.WSSecSignature.getSigningCerts(WSSecSignature.java:860)
at org.apache.wss4j.dom.message.WSSecSignature.prepare(WSSecSignature.java:171)
at org.apache.wss4j.dom.action.SignatureAction.execute(SignatureAction.java:110)
... 11 common frames omitted
23:06:10.343 [main] DEBUG org.springframework.ws.client.MessageTracing.received -- Received no response for request [SaajSoapMessage {localNamespace}getExamRequest]
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "localnamespace.GetExamResponse.getExamRegistration()" because "response" is null
at com.soapproject.soapprojectwebservice.RunClient.main(RunClient.java:29)
我了解到客户端出现错误,代码似乎无法检索私钥以签署 SOAP 消息。
有什么想法吗?
非常感谢