本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
发送和接收 AS2 消息
本节介绍发送和接收 AS2 消息的过程。它还提供了与 AS2 消息相关的文件名和位置的详细信息。
下表列出了 AS2 消息的可用加密算法以及何时可以使用这些算法。
加密算法 | HTTP | HTTPS | 注意 |
---|---|---|---|
AES128_CBC | 是 | 是 | |
AES192_CBC | 是 | 是 | |
AES256_CBC | 是 | 是 | |
DES_EDE3_CBC | 是 | 是 | 只有在必须支持需要此算法的旧版客户端时才使用此算法,因为它是一种弱加密算法。 |
NONE | 否 | 是 | 如果您要向 Transfer Family 服务器发送消息,则只能选择NONE 是否使用应用程序负载均衡器 (ALB)。 |
发送 AS2 消息流程
出站进程定义为从 Amazon 外部客户端或服务发送的消息或文件。出站消息的顺序如下:
-
管理员调用
start-file-transfer
Amazon Command Line Interface (Amazon CLI) 命令或StartFileTransfer
API 操作。此操作引用connector
配置。 -
Transfer Family 检测到新的文件请求并定位该文件。文件经过压缩、签名和加密。
-
传输 HTTP 客户端执行 HTTP POST 请求,将有效负载传输到合作伙伴的 AS2 服务器。
-
该流程返回已签名的 MDN 响应,该响应与 HTTP 响应(同步 MDN)内联。
-
当文件在不同的传输阶段之间移动时,该流程会向客户提供 MDN 响应接收和处理详细信息。
-
远程 AS2 服务器将解密并经过验证的文件提供给合作伙伴管理员。
![该图显示了出站消息的处理顺序。](images/as2-architecture-outbound.png)
AS2 处理支持许多 RFC 4130 协议,重点关注常见使用案例并与启用 AS2 的现有服务器实现集成。有关支持的配置详细信息,请参阅AS2 支持的配置。
接收 AS2 消息流程
入站流程定义为正在传输到 Amazon Transfer Family 服务器的消息或文件。入站消息的顺序如下:
管理员或自动流程在合作伙伴的远程 AS2 服务器上启动 AS2 文件传输。
合作伙伴的远程 AS2 服务器对文件内容进行签名和加密,然后向 Transfer Family 上托管的 AS2 入站端点发送 HTTP POST 请求。
-
Transfer Family 使用服务器、合作伙伴、证书和协议的配置值,解密并验证 AS2 有效负载。文件内容存储在已配置的 Amazon S3 文件存储中。
-
已签名的 MDN 响应应与 HTTP 响应内联返回,或者通过单独的 HTTP POST 请求异步返回原始服务器。
审计记录已写入Amazon, CloudWatch 其中包含有关交易所的详细信息。
解密后的文件位于名为
inbox/processed
的文件夹中。
![该图显示了入站消息的处理顺序。](images/as2-architecture-inbound.png)
通过 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 所需的 |
TLS/SSL 终止 | 支持 TLS/SSL 终止 | 支持 TLS/SSL 终止 |
双向 TLS (mTLS) | Transfer Family 目前不支持将 NLB 用于 mTL | 对 mTLS 的 Support |
设置负载均衡器后,客户端通过自定义端口侦听器与负载均衡器进行通信。然后,负载均衡器通过端口 5080 与服务器通信。
创建目标组
-
在前面的过程中选择创建目标组后,您将进入新目标组的指定组详细信息页面。
-
在基本配置部分,输入以下信息。
-
在选择目标类型中,选择 IP 地址。
-
对于目标组名称,输入目标组的名称。
-
对于协议,选择 TCP。
-
对于端口,输入
5080
。 -
在 IP 地址类型中,选择 IPv4。
-
对于 VPC,选择已为 Transfer Family AS2 服务器创建的 VPC。
-
-
在运行状况检查部分,选择 TCP 作为运行状况检查协议。
-
选择下一步。
-
在注册目标页面,输入以下信息:
-
对于网络,请确认已指定您为 Transfer Family AS2 服务器创建的 VPC。
-
对于 IPv4 地址,请输入 Transfer Family AS2 服务器端点的私有 IPv4 地址。
如果您的服务器有多个端点,请选择添加 IPv4 地址以添加另一行,用于输入另一个 IPv4 地址。重复此过程,直到输入服务器所有端点的私有 IP 地址。
-
确保端口设置为
5080
。 -
选择包含如下待处理事项,将您的条目添加到审核目标部分。
-
-
在查看目标部分,查看您的 IP 目标。
-
选择创建目标组,然后返回之前创建 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
文件夹中,名为
。也就是说,传输的消息 ID 会附加到文件名之后,在文件的原始扩展名之前。original_filename
.messageId
.original_extension
-
已创建 JSON 文件并将其另存为
。除了要添加的消息 ID 外,还会在传输的文件名后面附加该字符串original_filename
.messageId
.original_extension
.json.json
。 -
消息处置通知 (MDN) 文件已创建并另存为
。除了要添加的消息 ID 外,还会在传输的文件名后面附加该字符串original_filename
.messageId
.original_extension
.mdn.mdn
。 -
如果存在名为
ExampleFileInS3Payload.dat
的入站文件,则会创建以下文件:-
File —
ExampleFileInS3Payload.c4d6b6c7-23ea-4b8c-9ada-0cb811dc8b35@44313c54b0a46a36.dat
-
JSON —
ExampleFileInS3Payload.c4d6b6c7-23ea-4b8c-9ada-0cb811dc8b35@44313c54b0a46a36.dat.json
-
MDN —
ExampleFileInS3Payload.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
的出站文件,则会创建以下文件:-
JSON —
ExampleFileOutTestOutboundSyncMdn.dedf4601-4e90-4043-b16b-579af35e0d83.fbe18db8-7361-42ff-8ab6-49ec1e435f34@c9c705f0baaaabaa.dat.json
-
MDN —
ExampleFileOutTestOutboundSyncMdn.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" }