AS2发送文件失败?

该问题来自社区帖: https://bbs.csdn.net/topics/614557938

AS2端口自动发送文件时报错:FAILURE: The Message Integrity Check returned by the server is incorrect. Expected: XXXX; Received : XXXX。但是手动发送文件时可以成功,是什么原因呢?

AS2发送文件失败可能有多种原因,以下是一些可能的原因:

  1. 证书问题:如果证书不正确或已过期,可能会导致AS2连接失败。请确保证书正确并且没有过期。

  2. 防火墙问题:防火墙可能会阻止AS2连接。请检查防火墙设置并确保已经打开了AS2端口。

  3. 配置问题:AS2配置可能不正确,导致连接失败。请检查AS2配置并确保它们与您的合作伙伴的配置相匹配。

  4. 通信问题:网络问题或其他通信问题可能导致AS2连接失败。请确保网络连接稳定并且没有通信故障。
    由于AS2发送文件失败可能的原因很多,无法给出具体的代码解决方案。以下是一些常见的AS2连接代码,您可以使用它们作为参考:

  5. 使用Apache HttpClient发送AS2消息:

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Content-Type", "application/pkcs7-mime; smime-type=enveloped-data; name=\"smime.p7m\"");
httpPost.setHeader("AS2-Version", "1.1");
httpPost.setHeader("AS2-From", "sender@example.com");
httpPost.setHeader("AS2-To", "receiver@example.com");
httpPost.setHeader("AS2-Message-ID", messageId);
httpPost.setHeader("AS2-Date", date);
httpPost.setHeader("Disposition-Notification-To", "sender@example.com");
httpPost.setHeader("Disposition-Notification-Options", "signed-receipt-protocol=optional, pkcs7-signature; signed-receipt-micalg=optional, SHA1");
httpPost.setHeader("User-Agent", "My AS2 Client");
httpPost.setEntity(entity);
HttpResponse httpResponse = httpClient.execute(httpPost);
  1. 使用BouncyCastle发送AS2消息:
SMIMEEnvelopedGenerator envelopedGenerator = new SMIMEEnvelopedGenerator();
envelopedGenerator.addRecipientInfoGenerator(new JceKeyTransRecipientInfoGenerator(recipientCert).setProvider("BC"));

MimeBodyPart data = new MimeBodyPart();
data.setContent("AS2 message body", "text/plain");

MimeBodyPart encrypted = envelopedGenerator.generate(data, new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES128_CBC).setProvider("BC").build());

MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("sender@example.com"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("receiver@example.com"));
message.setSubject("AS2 message subject");
message.setHeader("AS2-Version", "1.1");
message.setHeader("AS2-From", "sender@example.com");
message.setHeader("AS2-To", "receiver@example.com");
message.setHeader("AS2-Message-ID", messageId);
message.setHeader("AS2-Date", date);
message.setHeader("Disposition-Notification-To", "sender@example.com");
message.setHeader("Disposition-Notification-Options", "signed-receipt-protocol=optional, pkcs7-signature; signed-receipt-micalg=optional, SHA1");
message.setHeader("User-Agent", "My AS2 Client");
message.setContent(encrypted.getContent(), encrypted.getContentType());
message.saveChanges();

Transport.send(message);
``

以下内容部分参考ChatGPT模型:


这个错误通常是由于AS2消息的完整性检查失败导致的。手动发送文件成功的原因可能是在手动发送过程中,AS2消息的完整性检查被正确计算并包含在消息中,而自动发送文件时则没有正确计算。

解决方法可能是检查自动发送代码中完整性检查的计算方式,确保它与手动发送代码中的计算方式相同。此外,还可以检查服务器端是否正确地处理了AS2消息的完整性检查。

以下是一个示例AS2消息的完整性检查计算方式:

private function calculateMIC(message:String, key:String):String {
    var sha1:SHA1 = new SHA1();
    var hmac:HMAC = new HMAC(sha1.getHash, 64);
    hmac.setKey(key);
    var mic:String = hmac.compute(message);
    return mic;
}

其中,message是AS2消息的原始字符串,key是用于计算完整性检查的密钥。在计算完整性检查之后,将其包含在AS2消息中的Content-MIC头字段中。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快