我在我的 Java 项目中使用 Apache Camel AS2 库,在该项目中我实现了 AS2 服务器。 目前,我正在通过在服务器端点配置中配置证书和算法来生成签名的 MDN 响应,并且它工作正常。但是,我想根据 AS2 请求对 MDN 进行签名,在标头中,我将获取用户请求的 Mic 算法。因此,我想在运行时使用其中一种算法进行签名,而不是在端点创建时对算法进行硬编码。
我也浏览了库代码,并在线检查,但我无法找到任何解决方案。
我见过在线服务器https://mendelson-e-c.com/as2_testserver,它具有相同的功能,并根据AS2消息进行签名,请帮助我实现这一点。
我的服务器代码如下所示,在端点配置中定义签名。
@Singleton
public class As2Server extends RouteBuilder {
private final CamelContext camelContext;
@Inject
public As2Server(CamelContext camelContext) {
this.camelContext = camelContext;
}
@Override
public void configure() {
try {
from(configureServerEndpoint()).process(exchange -> {
// processing logic
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private Endpoint configureServerEndpoint() throws Exception {
AS2Configuration endpointConfiguration = new AS2Configuration();
endpointConfiguration.setApiName(AS2ApiName.SERVER);
endpointConfiguration.setMethodName(AS2ServerManagerApiMethod.LISTEN.name());
endpointConfiguration.setDecryptingPrivateKey(getPrivateKey());
endpointConfiguration.setSigningPrivateKey(getPrivateKey());
endpointConfiguration.setSigningCertificateChain(getCertificateChain());
endpointConfiguration.setSigningAlgorithm(AS2SignatureAlgorithm.MD5WITHRSA);
endpointConfiguration.setMdnMessageTemplate("Your AS2 message has been received");
try (AS2Component as2Component = new AS2Component()) {
as2Component.setCamelContext(camelContext);
as2Component.setConfiguration(endpointConfiguration);
return as2Component.createEndpoint(STR."as2://server/listen?serverPortNumber=11080&requestUriPattern=*");
}
}
}
此时我们遇到了麦克风问题,因为我们正在使用 AS2SignatureAlgorithm.SHA256WITHRSA,并且当您尝试直接从消息发送算法时,您可能会开始遇到问题。如果您知道 MD5 有效,为什么需要更改它?
顺便说一句,就像我告诉过你的那样,我们正在使用 SHA256WITHRSA 进行测试,但显然不起作用。我只是做了一些更改以使用 SHA2WITHRSA 因为在一些文章中我读到签名的支持算法是 SHA-1 和 MD5,您是否测试了任何其他错误,我们收到的下一个错误是。
org.apache.http.HttpException: Failed to encode MIC
at org.apache.camel.component.as2.api.util.MicUtils.createReceivedContentMic(MicUtils.java:111)
at org.apache.camel.component.as2.api.entity.AS2MessageDispositionNotificationEntity.<init>(AS2MessageDispositionNotificationEntity.java:95)
at org.apache.camel.component.as2.api.entity.DispositionNotificationMultipartReportEntity.<init>(DispositionNotificationMultipartReportEntity.java:66)
at org.apache.camel.component.as2.api.protocol.ResponseMDN.process(ResponseMDN.java:157)
at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:142)
at org.apache.http.protocol.HttpService.handleRequest(HttpService.java:360)
at org.apache.camel.component.as2.api.AS2ServerConnection$RequestHandlerThread.run(AS2ServerConnection.java:163)
Caused by: java.lang.IllegalArgumentException: Data must be specified
at org.apache.camel.util.ObjectHelper.notNull(ObjectHelper.java:153)
at org.apache.camel.component.as2.api.util.EntityUtils.encode(EntityUtils.java:89)
at org.apache.camel.component.as2.api.util.MicUtils$ReceivedContentMic.<init>(MicUtils.java:48)
at org.apache.camel.component.as2.api.util.MicUtils.createReceivedContentMic(MicUtils.java:109)
... 6 common frames omitted
如果您在尝试做您想做的事情之前使用其他算法进行测试,请告诉我。