发送和接收 AS2 消息 - Amazon Transfer Family
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

发送和接收 AS2 消息

本节介绍发送和接收 AS2 消息的过程。它还提供了与 AS2 消息相关的文件名和位置的详细信息。

下表列出了 AS2 消息的可用加密算法以及何时可以使用这些算法。

加密算法 HTTP HTTPS 注意
AES128_CBC
AES192_CBC
AES256_CBC
DES_EDE3_CBC 只有在必须支持需要此算法的旧版客户端时才使用此算法,因为它是一种弱加密算法。
NONE 如果您要向 Transfer Family 服务器发送消息,则只能选择NONE是否使用应用程序负载均衡器 (ALB)。

发送 AS2 消息流程

出站进程定义为从 Amazon 外部客户端或服务发送的消息或文件。出站消息的顺序如下:

  1. 管理员调用 start-file-transfer Amazon Command Line Interface (Amazon CLI) 命令或 StartFileTransfer API 操作。此操作引用connector配置。

  2. Transfer Family 检测到新的文件请求并定位该文件。文件经过压缩、签名和加密。

  3. 传输 HTTP 客户端执行 HTTP POST 请求,将有效负载传输到合作伙伴的 AS2 服务器。

  4. 该流程返回已签名的 MDN 响应,该响应与 HTTP 响应(同步 MDN)内联。

  5. 当文件在不同的传输阶段之间移动时,该流程会向客户提供 MDN 响应接收和处理详细信息。

  6. 远程 AS2 服务器将解密并经过验证的文件提供给合作伙伴管理员。

该图显示了出站消息的处理顺序。

AS2 处理支持许多 RFC 4130 协议,重点关注常见使用案例并与启用 AS2 的现有服务器实现集成。有关支持的配置详细信息,请参阅AS2 支持的配置

接收 AS2 消息流程

入站流程定义为正在传输到 Amazon Transfer Family 服务器的消息或文件。入站消息的顺序如下:

  1. 管理员或自动流程在合作伙伴的远程 AS2 服务器上启动 AS2 文件传输。

  2. 合作伙伴的远程 AS2 服务器对文件内容进行签名和加密,然后向 Transfer Family 上托管的 AS2 入站端点发送 HTTP POST 请求。

  3. Transfer Family 使用服务器、合作伙伴、证书和协议的配置值,解密并验证 AS2 有效负载。文件内容存储在已配置的 Amazon S3 文件存储中。

  4. 已签名的 MDN 响应应与 HTTP 响应内联返回,或者通过单独的 HTTP POST 请求异步返回原始服务器。

  5. 审计记录已写入Amazon, CloudWatch 其中包含有关交易所的详细信息。

  6. 解密后的文件位于名为inbox/processed的文件夹中。

该图显示了入站消息的处理顺序。

通过 HTTPS 发送和接收 AS2 消息

本节介绍如何配置使用 AS2 协议通过 HTTPS 发送和接收消息的 Transfer Family 服务器。

通过 HTTPS 发送 AS2 消息

要使用 HTTPS 发送 AS2 消息,请使用以下信息创建一个连接器:

  • 对于网址,请指定 HTTPS URL

  • 对于加密算法,请选择任何可用的算法。

    注意

    要在不使用加密(即您选择NONE加密算法)的情况下向 Transfer Family 服务器发送消息,则必须使用应用程序负载均衡器 (ALB)。

  • 提供连接器的其余值,如 配置 AS2 连接器 中所述。

通过 HTTPS 接收 AS2 消息

Amazon Transfer Family AS2 服务器目前仅通过端口 5080 提供 HTTP 传输。但是,您可以使用自己选择的端口和证书在您的 Transfer Family 服务器 VPC 终端节点前的网络或应用程序负载均衡器上终止 TLS。使用这种方法,您可以让传入的 AS2 消息使用 HTTPS。

先决条件

  • VPC 必须与您的 Transfer Amazon Web Services 区域 Family 服务器位于同一个服务器中。

  • 您的 VPC 的子网必须位于您要在其中使用服务器的可用区内。

    注意

    每台 Transfer Family 服务器最多可以支持三个可用区。

  • 在与您的服务器相同的区域中最多分配三个弹性 IP 地址。或者,您可以选择自带 IP 地址范围(BYOIP)。

    注意

    弹性 IP 地址的数量必须与您用于服务器端点的可用区域数量相匹配。

您可以配置网络负载平衡 (NLB) 或 Application Load Balancer (ALB)。下表列出了每种方法的优缺点。

下表提供了使用 NLB 与 ALB 终止 TLS 时的功能差异。

功能 Network Load Balancer (NLB) Application Load Balancer (ALB)
延迟 由于它在网络层运行,因此延迟更低。 由于它在应用层运行,因此延迟更高。
支持静态 IP 可以附加可以是静态的弹性 IP 地址。 无法附加弹性 IP 地址:提供其基础 IP 地址可以更改的域。
高级路由 不支持高级路由。

支持高级路由。无需加密即可注入 AS2 所需的X-Forwarded-Proto标头。

developer.mozilla.org 网站上的 X-Forwarded-Proto 中描述了这个标题。

TLS/SSL 终止 支持 TLS/SSL 终止 支持 TLS/SSL 终止
双向 TLS (mTLS) Transfer Family 目前不支持将 NLB 用于 mTL 对 mTLS 的 Support
Configure NLB

此过程介绍如何在您的 VPC 中设置面向互联网的网络负载均衡器 (NLB)。

创建网络负载均衡器并将服务器的 VPC 端点定义为负载均衡器的目标
  1. https://console.aws.amazon.com/ec2/ 中打开 Amazon Elastic Compute Cloud 控制台。

  2. 在导航窗格中,选择负载均衡器,然后选择创建负载均衡器

  3. 网络负载均衡器下,选择创建

  4. 基本配置部分,输入以下信息:

    • 对于名称,为负载均衡器输入一个描述性名称。

    • 对于 Scheme,选择 Internet-facing

    • IP 地址类型中,选择 IPv4

  5. 网络映射部分中,输入以下信息:

    • 对于 VPC,请选择您已创建的虚拟私有云 (VPC)。

    • 映射下,选择与公有子网关联的可用区,这些子网位于您用于服务器端点的同一 VPC 中。

    • 对于每个子网的IPv4 地址,请选择您分配的弹性 IP 地址之一。

  6. 侦听器和路由部分中,输入以下信息:

    • 对于协议,选择 TLS

    • 对于端口,输入 5080

    • 对于默认操作,选择创建目标组。有关创建新目标组的详细信息,请参阅 创建目标组

    创建目标组后,在默认操作字段中输入其名称。

  7. 安全侦听器设置部分,在默认 SSL/TLS 证书区域中选择您的证书。

  8. 选择创建负载均衡器以创建您的 NLB。

  9. (可选,但推荐)打开网络负载均衡器的访问日志以保持完整的审计跟踪记录,如网络负载均衡器的访问日志中所述。

    我们建议执行此步骤,因为 TLS 连接已在 NLB 终止。因此,反映在您的 Transfer Family AS2 CloudWatch 日志组中的源 IP 地址是 NLB 的私有 IP 地址,而不是贸易伙伴的外部 IP 地址。

Configure ALB

此过程介绍如何在您的 VPC 中设置 Application Load Balancer (NLB)。

创建 Application Load Balancer 并将服务器的 VPC 终端节点定义为负载均衡器的目标
  1. https://console.aws.amazon.com/ec2/ 中打开 Amazon Elastic Compute Cloud 控制台。

  2. 在导航窗格中,选择负载均衡器,然后选择创建负载均衡器

  3. 应用程序负载均衡器下,选择创建

  4. 在 ALB 控制台中,在端口 443 (HTTPS) 上创建一个新的 HTTP 监听器。

  5. (可选)。如果要设置相互身份验证 (mTLS),请配置安全设置和信任存储。

    1. 将您的 SSL/TLS 证书附加到侦听器。

    2. 在 “客户证书处理” 下,选择相互身份验证 (mTLS)

    3. 选择 “使用信任存储进行验证”。

    4. 在 “高级 mTLS 设置” 下,通过上传您的 CA 证书来选择或创建信任存储。

  6. 创建一个新的目标组,并将 Transfer Family AS2 服务器端点的私有 IP 地址添加为端口 5080 上的目标。有关创建新目标组的详细信息,请参阅 创建目标组

  7. 为目标组配置运行状况检查,使其在端口 5080 上使用 TCP 协议。

  8. 创建新规则,将 HTTPS 流量从侦听器转发到目标组。

  9. 将侦听器配置为使用您的 SSL/TLS 证书。

设置负载均衡器后,客户端通过自定义端口侦听器与负载均衡器进行通信。然后,负载均衡器通过端口 5080 与服务器通信。

创建目标组
  1. 在前面的过程中选择创建目标组后,您将进入新目标组的指定组详细信息页面。

  2. 基本配置部分,输入以下信息。

    • 选择目标类型中,选择 IP 地址

    • 对于目标组名称,输入目标组的名称。

    • 对于协议,选择 TCP

    • 对于端口,输入 5080

    • IP 地址类型中,选择 IPv4

    • 对于 VPC,选择已为 Transfer Family AS2 服务器创建的 VPC。

  3. 运行状况检查部分,选择 TCP 作为运行状况检查协议

  4. 选择下一步

  5. 注册目标页面,输入以下信息:

    • 对于网络,请确认已指定您为 Transfer Family AS2 服务器创建的 VPC。

    • 对于 IPv4 地址,请输入 Transfer Family AS2 服务器端点的私有 IPv4 地址。

      如果您的服务器有多个端点,请选择添加 IPv4 地址以添加另一行,用于输入另一个 IPv4 地址。重复此过程,直到输入服务器所有端点的私有 IP 地址。

    • 确保端口设置为5080

    • 选择包含如下待处理事项,将您的条目添加到审核目标部分。

  6. 查看目标部分,查看您的 IP 目标。

  7. 选择创建目标组,然后返回之前创建 NLB 的过程,并在指示的位置输入新的目标组。

测试从弹性 IP 地址访问服务器

使用弹性 IP 地址或网络负载均衡器的 DNS 名称通过自定义端口连接到服务器。

重要

使用负载均衡器上配置的子网的网络访问控制列表(网络 ACL)管理从客户端 IP 地址对服务器的访问。网络 ACL 权限是在子网级别设置的,因此这些规则适用于使用该子网的所有资源。您无法使用安全组控制来自客户端 IP 地址的访问,因为负载均衡器的目标类型设置为 IP 地址而不是实例。因此,负载均衡器不保留源 IP 地址。如果网络负载均衡器的运行状况检查失败,则意味着负载均衡器无法连接到服务器端点。要对此问题进行故障排除,请检查以下步骤:

  • 确认服务器端点的关联安全组允许来自负载均衡器上配置的子网的入站连接。负载均衡器必须能够通过端口 5080 连接到服务器端点。

  • 确认服务器的状态联机

使用 AS2 连接器传输文件

AS2 连接器在贸易伙伴之间建立关系,将 AS2 消息从 Transfer Family 服务器传输到合作伙伴拥有的外部目的地。

您可以使用 Transfer Family 通过引用连接器 ID 和文件路径发送 AS2 消息,如以下 start-file-transfer Amazon Command Line Interface (Amazon CLI) 命令所示:

aws transfer start-file-transfer --connector-id c-1234567890abcdef0 \ --send-file-paths "/DOC-EXAMPLE-SOURCE-BUCKET/myfile1.txt" "/DOC-EXAMPLE-SOURCE-BUCKET/myfile2.txt"

要获取连接器详细信息,请运行以下命令:

aws transfer list-connectors

list-connectors 命令会返回连接器的连接器 ID、URL 和 Amazon 资源名称(ARN)。

要返回特定连接器的属性,请使用要使用的 ID 运行以下命令:

aws transfer describe-connector --connector-id your-connector-id

describe-connector命令返回连接器的所有属性,包括其 URL、角色、配置文件、消息处置通知 (MDN)、标签和监控指标。

您可以通过查看 JSON 和 MDN 文件来确认合作伙伴已成功接收文件。这些文件是根据文件名和位置中描述的约定命名的。如果您在创建连接器时配置了日志记录角色,则还可以检查 CloudWatch 日志中是否有 AS2 消息的状态。

要查看 AS2 连接器的详细信息,请参阅 查看 AS2 连接器详细信息。有关创建 AS2 连接器的更多信息,请参阅 配置 AS2 连接器

文件名和位置

本部分讨论 AS2 传输的文件命名约定。

对于入站文件传输,需要注意以下方面:

  • 您可以在协议中指定基本目录。基本目录是 Amazon S3 存储桶名称和前缀(如果有)的组合。例如,/DOC-EXAMPLE-BUCKET/AS2-folder

  • 如果成功处理了传入的文件,则该文件(以及相应的 JSON 文件)将保存至该/processed文件夹。例如,/DOC-EXAMPLE-BUCKET/AS2-folder/processed

    JSON 文件包含以下字段:

    • agreement-id

    • as2-from

    • as2-to

    • as2-message-id

    • transfer-id

    • client-ip

    • connector-id

    • failure-message

    • file-path

    • message-subject

    • mdn-message-id

    • mdn-subject

    • requester-file-name

    • requester-content-type

    • server-id

    • status-code

    • failure-code

    • transfer-size

  • 如果无法成功处理传入文件,则该文件(以及相应的 JSON 文件)将保存至该/failed文件夹。例如,/DOC-EXAMPLE-BUCKET/AS2-folder/failed

  • 传输的文件存储在processed文件夹中,名为original_filename.messageId.original_extension。也就是说,传输的消息 ID 会附加到文件名之后,在文件的原始扩展名之前。

  • 已创建 JSON 文件并将其另存为original_filename.messageId.original_extension.json。除了要添加的消息 ID 外,还会在传输的文件名后面附加该字符串.json

  • 消息处置通知 (MDN) 文件已创建并另存为original_filename.messageId.original_extension.mdn。除了要添加的消息 ID 外,还会在传输的文件名后面附加该字符串.mdn

  • 如果存在名为ExampleFileInS3Payload.dat的入站文件,则会创建以下文件:

    • FileExampleFileInS3Payload.c4d6b6c7-23ea-4b8c-9ada-0cb811dc8b35@44313c54b0a46a36.dat

    • JSONExampleFileInS3Payload.c4d6b6c7-23ea-4b8c-9ada-0cb811dc8b35@44313c54b0a46a36.dat.json

    • MDNExampleFileInS3Payload.c4d6b6c7-23ea-4b8c-9ada-0cb811dc8b35@44313c54b0a46a36.dat.mdn

对于出站传输,命名类似,不同之处在于没有传入的消息文件,而且,已传输消息的传输 ID 会添加到文件名中。传输 ID 由StartFileTransfer API 操作返回(或者当其他流程或脚本调用此操作时)。

  • transfer-id是与文件传输关联的标识符。作为StartFileTransfer调用一部分的所有请求共享transfer-id

  • 基本目录与您用于源文件的路径相同。也就是说,基目录是您在 StartFileTransfer API 操作或start-file-transfer Amazon CLI 命令中指定的路径。例如:

    aws transfer start-file-transfer --send-file-paths /DOC-EXAMPLE-BUCKET/AS2-folder/file-to-send.txt

    如果运行此命令,MDN 和 JSON 文件将保存在/DOC-EXAMPLE-BUCKET/AS2-folder/processed中(对于成功传输)或/DOC-EXAMPLE-BUCKET/AS2-folder/failed(对于不成功传输)。

  • 已创建 JSON 文件并将其另存为original_filename.transferId.messageId.original_extension.json

  • 已创建 MDN 文件并将其另存为original_filename.transferId.messageId.original_extension.mdn

  • 如果存在名为ExampleFileOutTestOutboundSyncMdn.dat的出站文件,则会创建以下文件:

    • JSONExampleFileOutTestOutboundSyncMdn.dedf4601-4e90-4043-b16b-579af35e0d83.fbe18db8-7361-42ff-8ab6-49ec1e435f34@c9c705f0baaaabaa.dat.json

    • MDNExampleFileOutTestOutboundSyncMdn.dedf4601-4e90-4043-b16b-579af35e0d83.fbe18db8-7361-42ff-8ab6-49ec1e435f34@c9c705f0baaaabaa.dat.mdn

您还可以查看 CloudWatch 日志以查看转账的详细信息,包括任何失败的转账。

状态代码

下表列出了您或您的合作伙伴发送 AS2 消息时可以记录到 CloudWatch 日志中的所有状态代码。不同的消息处理步骤适用于不同的消息类型,并且仅用于监控。“已完成” 和 “失败” 状态表示处理的最后一步,在 JSON 文件中可见。

代码 描述 处理完成了吗?
处理 该消息正在转换为其最终格式。例如,解压缩和解密步骤都具有此状态。
MDN_TRANSM 消息处理正在发送 MDN 响应。
MDN_RECEIVE 消息处理正在收到 MDN 响应。
COMPLETED 消息处理已成功完成。此状态包括为入站消息或出站消息的 MDN 验证发送 MDN 的时间。
FAILED 消息处理失败。有关错误代码的列表,请参阅AS2 错误代码

示例 JSON 文件

本部分列出了入站和出站传输的示例 JSON 文件,包括传输成功和传输失败的示例文件。

传输成功的示例出站文件:

{ "requester-content-type": "application/octet-stream", "mesage-subject": "File xyzTest from MyCompany_OID to partner YourCompany", "requester-file-name": "TestOutboundSyncMdn-9lmCr79hV.dat", "as2-from": "MyCompany_OID", "connector-id": "c-c21c63ceaaf34d99b", "status-code": "COMPLETED", "disposition": "automatic-action/MDN-sent-automatically; processed", "transfer-size": 3198, "mdn-message-id": "OPENAS2-11072022063009+0000-df865189-1450-435b-9b8d-d8bc0cee97fd@PartnerA_OID_MyCompany_OID", "mdn-subject": "Message be18db8-7361-42ff-8ab6-49ec1e435f34@c9c705f0baaaabaa has been accepted", "as2-to": "PartnerA_OID", "transfer-id": "dedf4601-4e90-4043-b16b-579af35e0d83", "file-path": "/DOC-EXAMPLE-BUCKET/as2testcell0000/openAs2/TestOutboundSyncMdn-9lmCr79hV.dat", "as2-message-id": "fbe18db8-7361-42ff-8ab6-49ec1e435f34@c9c705f0baaaabaa", "timestamp": "2022-07-11T06:30:10.791274Z" }

传输失败的示例出站文件:

{ "failure-code": "HTTP_ERROR_RESPONSE_FROM_PARTNER", "status-code": "FAILED", "requester-content-type": "application/octet-stream", "subject": "Test run from Id da86e74d6e57464aae1a55b8596bad0a to partner 9f8474d7714e476e8a46ce8c93a48c6c", "transfer-size": 3198, "requester-file-name": "openAs2TestOutboundWrongAs2Ids-necco-3VYn5n8wE.dat", "as2-message-id": "9a9cc9ab-7893-4cb6-992a-5ed8b90775ff@718de4cec1374598", "failure-message": "http://Test123456789.us-east-1.elb.amazonaws.com:10080 returned status 500 for message with ID 9a9cc9ab-7893-4cb6-992a-5ed8b90775ff@718de4cec1374598", "transfer-id": "07bd3e07-a652-4cc6-9412-73ffdb97ab92", "connector-id": "c-056e15cc851f4b2e9", "file-path": "/testbucket-4c1tq6ohjt9y/as2IntegCell0002/openAs2/openAs2TestOutboundWrongAs2Ids-necco-3VYn5n8wE.dat", "timestamp": "2022-07-11T21:17:24.802378Z" }

传输成功的示例进站文件:

{ "requester-content-type": "application/EDI-X12", "subject": "File openAs2TestInboundAsyncMdn-necco-5Ab6bTfCO.dat sent from MyCompany to PartnerA", "client-ip": "10.0.109.105", "requester-file-name": "openAs2TestInboundAsyncMdn-necco-5Ab6bTfCO.dat", "as2-from": "MyCompany_OID", "status-code": "COMPLETED", "disposition": "automatic-action/MDN-sent-automatically; processed", "transfer-size": 1050, "mdn-subject": "Message Disposition Notification", "as2-message-id": "OPENAS2-11072022233606+0000-5dab0452-0ca1-4f9b-b622-fba84effff3c@MyCompany_OID_PartnerA_OID", "as2-to": "PartnerA_OID", "agreement-id": "a-f5c5cbea5f7741988", "file-path": "processed/openAs2TestInboundAsyncMdn-necco-5Ab6bTfCO.OPENAS2-11072022233606+0000-5dab0452-0ca1-4f9b-b622-fba84effff3c@MyCompany_OID_PartnerA_OID.dat", "server-id": "s-5f7422b04c2447ef9", "timestamp": "2022-07-11T23:36:36.105030Z" }

传输失败的示例进站文件:

{ "failure-code": "INVALID_REQUEST", "status-code": "FAILED", "subject": "Sending a request from InboundHttpClientTests", "client-ip": "10.0.117.27", "as2-message-id": "testFailedLogs-TestRunConfig-Default-inbound-direct-integ-0c97ee55-af56-4988-b7b4-a3e0576f8f9c@necco", "as2-to": "0beff6af56c548f28b0e78841dce44f9", "failure-message": "Unsupported date format: 2022/123/456T", "agreement-id": "a-0ceec8ca0a3348d6a", "as2-from": "ab91a398aed0422d9dd1362710213880", "file-path": "failed/01187f15-523c-43ac-9fd6-51b5ad2b08f3.testFailedLogs-TestRunConfig-Default-inbound-direct-integ-0c97ee55-af56-4988-b7b4-a3e0576f8f9c@necco", "server-id": "s-0582af12e44540b9b", "timestamp": "2022-07-11T06:30:03.662939Z" }