Apache Camel AS2库如何根据请求动态生成指定签名的MDN响应
动态根据AS2请求头指定的MIC算法生成签名MDN
要实现这个需求,核心是绕过端点初始化时的硬编码配置,在请求处理阶段动态提取请求头中的MIC算法,替换MDN签名逻辑的算法参数。以下是具体实现步骤:
步骤1:移除端点配置中的硬编码签名算法
首先修改configureServerEndpoint方法,删掉硬编码的签名算法设置,让端点不预设固定算法:
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=*"); } }
步骤2:提取请求头MIC算法并动态配置
在处理器中解析AS2请求头里的signed-receipt-micalg参数,映射为Camel AS2支持的签名算法枚举,再动态修改当前请求的AS2配置:
@Override public void configure() { try { from(configureServerEndpoint()).process(exchange -> { // 从请求头获取Disposition-Notification-Options字段 String dispositionOptions = exchange.getIn().getHeader("Disposition-Notification-Options", String.class); String micAlgorithm = extractMicAlgorithm(dispositionOptions); // 映射为Camel AS2的签名算法枚举 AS2SignatureAlgorithm targetAlgorithm = mapToSignatureAlgorithm(micAlgorithm); // 动态修改当前请求的AS2配置 AS2Configuration config = exchange.getIn().getHeader(AS2Constants.AS2_CONFIGURATION, AS2Configuration.class); if (config != null) { config.setSigningAlgorithm(targetAlgorithm); } // 原有业务处理逻辑... }); } catch (Exception e) { throw new RuntimeException(e); } } // 解析Disposition-Notification-Options中的signed-receipt-micalg参数 private String extractMicAlgorithm(String dispositionOptions) { if (dispositionOptions == null || dispositionOptions.isEmpty()) { return "md5"; // 客户端未指定时用默认算法 } // 拆分参数,兼容空格、大小写差异 String[] params = dispositionOptions.split(";"); for (String param : params) { String[] keyValue = param.trim().split("="); if (keyValue.length == 2 && "signed-receipt-micalg".equalsIgnoreCase(keyValue[0])) { return keyValue[1].trim().toLowerCase(); } } return "md5"; } // 将MIC算法字符串映射为AS2SignatureAlgorithm枚举 private AS2SignatureAlgorithm mapToSignatureAlgorithm(String micAlgorithm) { return switch (micAlgorithm) { case "sha1" -> AS2SignatureAlgorithm.SHA1WITHRSA; case "sha256" -> AS2SignatureAlgorithm.SHA256WITHRSA; case "sha384" -> AS2SignatureAlgorithm.SHA384WITHRSA; case "sha512" -> AS2SignatureAlgorithm.SHA512WITHRSA; default -> AS2SignatureAlgorithm.MD5WITHRSA; // 默认回退到原有算法 }; }
关键说明
- AS2协议规定客户端通过
Disposition-Notification-Options头的signed-receipt-micalg字段指定MIC算法,解析时需兼容参数格式的大小写、空格差异。 - 从Exchange的
AS2Constants.AS2_CONFIGURATION头可获取当前请求的配置实例,修改后会直接作用于后续MDN生成流程。 - 保留默认算法分支,避免客户端未指定算法时出现异常。
内容的提问来源于stack exchange,提问作者Harshil Kapasi
相关产品推荐
相关产品推荐

