You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:53:17