AS2端口自动发送文件时报错:FAILURE: The Message Integrity Check returned by the server is incorrect. Expected: XXXX; Received : XXXX。但是手动发送文件时可以成功,是什么原因呢?
AS2发送文件失败可能有多种原因,以下是一些可能的原因:
证书问题:如果证书不正确或已过期,可能会导致AS2连接失败。请确保证书正确并且没有过期。
防火墙问题:防火墙可能会阻止AS2连接。请检查防火墙设置并确保已经打开了AS2端口。
配置问题:AS2配置可能不正确,导致连接失败。请检查AS2配置并确保它们与您的合作伙伴的配置相匹配。
通信问题:网络问题或其他通信问题可能导致AS2连接失败。请确保网络连接稳定并且没有通信故障。
由于AS2发送文件失败可能的原因很多,无法给出具体的代码解决方案。以下是一些常见的AS2连接代码,您可以使用它们作为参考:
使用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);
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);
``
这个错误通常是由于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头字段中。