关于标准EDI/B2B标准的简介(AS2传输模式)
Posted rgzngf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于标准EDI/B2B标准的简介(AS2传输模式)相关的知识,希望对你有一定的参考价值。
一、前言
上一篇给大家介绍了关于标准EDI的一些东西,这一篇呢,给大家介绍一下标准EDI的一个代表性的传输方式AS2传输,由于网上的很多东西都很齐全了,有些都比我自己了解的多,因此,本篇主要引用为主,主要是国内网站,国外也有不少,但是我试着翻译了一下,发现其实差不多少,翻译了一半觉得累了,感觉还是引用吧,下一篇我会讲一下X12标准,主要是X12 订单、DN、出货、发票等
二、AS2协议的原理
AS2协议是目前信息传输安全可靠的传输协议的标准规范,它是基于HTTP&S/MIME的安全传输协议,首先通过证书对传输文件进行加密与签名,加密的数据包通过HTTP/HTTPS进行或者TCP/IP网络进行数据传输与交换。
网上的流程很多,这里我引用的一个,感觉讲个大体吧
https://blog.csdn.net/qq_43295858/article/details/84836662?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
建立AS2传输的基本参数:
AS2 ID:这个可以自定义
URL:AS2的接收地址
数字证书:用来签名和加密的证书
AS2传输流程:
1、准备传输文件:AS2传输不限制传输文件格式,支持EDI、CSV、xlsx、pdf、zip、json等任意格式文件
2、签名加密数据包: 对于传输的文件,首先用发送方私钥证书签名,之后再用接收方公钥证书加密,完成传输文件的安全加密并封装
3、通过HTTP/HTTPS传输数据包
4、解密并验证数据包:接收方网关收到数据包后,首先用接收方私钥证书解密,再用发送方公钥证书验证签名,并解封装
5、接收方处理收到的原始数据
6、回复MDN:接收方通过HTTP/HTTPS回复信息处理通知MDN给发送方
7、验证MDN: 发送方根据接收方回复的MDN信息验证发送成功
三、AS2 Java实现
其实AS2 Java实现网上有一些公开的代码和配置资料,主要有openAS2和AS2 Gateway(这个收费)
什么是OpenAS2?
OpenAS2是AS2标准的基于Java的实现,它支持基于XML文件的配置-用户界面配置尚未实现,但已经在其路线图上
下载地址:https://sourceforge.net/projects/openas2/
什么是AS2Gateway?
AS2Gateway是一个SaaS应用程序,它实现了AS2规范,同时还提供了通过美观而简单的用户界面配置AS2工作站和贸易伙伴的功能。与OpenAS2相比,根据您的AS2要求配置AS2Gateway非常容易-尤其是如果您是没有良好技术背景并且不熟悉没有图形UI的服务器类型应用程序的用户。在阅读此博客时,您将了解其中的区别。由于具有GUI,因此它提供了更多实用程序功能,可满足AS2上的高级要求,例如证书管理,SFTP集成等
下载地址:
https://as2gateway.com/
以下是引用部分:https://www.codercto.com/a/90756.html
下面简单介绍一下OpenAS2的配置与使用
1.下载安装
下载解压,无需安装即可运行,目录结构如下:
.
├── OpenAS2HowTo.pdf
├── RELEASE-NOTES.md
├── bin
├── changes.txt
├── config
├── lib
└── resources
复制代码
2.启动测试
在执行脚本之前,需要确认的是系统中已经设置了 JAVA_HOME
环境变量。
给启动脚本添加执行权限
chmod +x ./bin/start-openas2.sh
启动OPEN AS2
./bin/start-openas2.sh
如果一切正常的话会看到以下提示
FINE OpenAS2Server: OpenAS2 Server v2.9.0 started.
3.生成密钥
$ ./gen_p12_key_par.sh clinflash-pv clinflash-pv SHA256 "CN=www.clinflash.net, OU=Clinflash, O=Clinflash, L=Shanghai, S=Shanghai, C=CN"
Generate a certificate to a PKCS12 key store.
Generating certificate: using alias clinflash-pv to clinflash-pv.p12
Do you wish to execute this request? [Y/N]Y
Enter password for keystore:123456
存储在文件 <clinflash-pv.cer> 中的证书
Generated files:
PKCS12 keystore: clinflash-pv.p12
Public Key File: clinflash-pv.cer
复制代码
4.配置说明
配置文件位于config目录,其中各个文件有不同作用
- config.xml
主要配置文件,包含全局属性、密钥证书、伙伴配置文件、日志、发送文件目录、接收文件目录等许多信息的相关配置。 - partnerships.xml
用于配置EDI伙伴以及伙伴关系。 - as2_certs.p12
用于保护伙伴信息的PKCS12签名文件,这是默认的文件名,可以在config.xml指定自定义的的文件名。 - commands.xml
此文件列出了OPEN AS2支持的命令,一般情况下不要去更改这个文件内容。
另外,config.xml文件中的配置如果发生更改需要重启应用才会生效,而其它文件配置发生更改会自动刷新。
4.1 config.xml应用配置
4.1.1 属性配置
properties节点中定义了一些属性值,这些属性值可以在其他地方以变量方式使用。
<properties
storageBaseDir="%home%/../data"
log_date_format="yyyy-MM-dd HH:mm:ss.SSS"
sql_timestamp_format="yyyy-MM-dd HH:mm:ss.SSS"
as2_message_id_format="OPENAS2-$date.ddMMyyyyHHmmssZ$-$rand.UUID$@$msg.sender.as2_id$_$msg.receiver.as2_id$"
as2_async_mdn_url="http://localhost:10081"/>
例如使用 storageBaseDir
这个属性值:
<processor classname="org.openas2.processor.DefaultProcessor"
pendingMDN="$properties.storageBaseDir$/pendingMDN3"
pendingMDNinfo="$properties.storageBaseDir$/pendinginfoMDN3">
</>
4.1.2 证书配置
<certificates classname="org.openas2.cert.PKCS12CertificateFactory"
filename="%home%/as2_certs.p12"
password="testas2"
interval="300"/>
%home%
表示当前目录,也就是config目录, filename
和 password
的属性值需要改成我们的keystore文件和密码。
4.1.3 伙伴关系文件配置
这里仅仅定义了伙伴关系文件的位置,详细的配置信息在这个文件中。
<partnerships classname="org.openas2.partner.XMLPartnershipFactory"
filename="%home%/partnerships.xml"
interval="120"/>
4.1.4 发送文件配置
OPEN AS2会轮询扫描指定的目录,寻找发送给伙伴的文件。目录扫描器会在两个连续周期检查发现的文件大小是否发生变化,如果没有变化则会将此文件加入发送队列中。
用于存放发送文件的目录可以是一个伙伴的专有目录,也可以是一个通用目录。如果使用通用目录,则通过解析文件名确定伙伴的身份。
以下是发送文件相关的关键属性:
outboxdir
- 发送文件的扫描目录
errordir
- 发送文件出错后存放文件的目录
interval
- 扫描目录的周期(秒)
sendfilename
- 发送给远程伙伴的消息是否必须包含文件名
mimetype
- 指定发送消息中文件的扩展类型
- 通用发送目录配置
<!-- This directory polling module will parse the filename to get a sender, receiver and name of file to send to partner.
For instance, a file named MyComapny_OID-PartnerB_OID-OrderID-745634.edi would be sent from MyCompany to PartnerB.
The name of the file sent to the partner will be "OrderID-745634.edi" -->
<module classname="org.openas2.processor.receiver.AS2DirectoryPollingModule"
outboxdir="$properties.storageBaseDir$/toAny"
errordir="$properties.storageBaseDir$/toAny/error"
interval="5"
delimiters="-"
mergeextratokens="true"
sendfilename="true"
format="sender.as2_id, receiver.as2_id, attributes.filename"
mimetype="application/EDI-X12" />
- 专有发送目录配置
<!-- This directory polling module will is dedicated to sending to partner PartnerA_OID -->
<module classname="org.openas2.processor.receiver.AS2DirectoryPollingModule"
outboxdir="$properties.storageBaseDir$/toPartnerA/"
errordir="$properties.storageBaseDir$/toPartnerA/error"
interval="5"
defaults="sender.as2_id=MyCompany_OID, receiver.as2_id=PartnerA_OID"
sendfilename="true"
mimetype="application/EDI-X12"/>
<!-- This directory polling module will is dedicated to sending to partner PartnerB_OID -->
<module classname="org.openas2.processor.receiver.AS2DirectoryPollingModule"
outboxdir="$properties.storageBaseDir$/toPartnerB"
errordir="$properties.storageBaseDir$/toPartnerB/error"
interval="5"
defaults="sender.as2_id=MyCompany_OID, receiver.as2_id=PartnerB_OID"
sendfilename="true"
mimetype="application/EDI-X12"/>
其中,“defaults”属性指定了目录中所有文件的发送方和接收方的AS2 ID。
此外,还可以限制发送文件的扩展名, fileextensionfilter
指定了通过的文件扩展名,fileextensionexcludefilter
指定了忽略的文件扩展名。
fileextensionfilter="doc, docx, txt, edi"
fileextensionexcludefilter="tmp"
4.1.5 消息跟踪
从2.1.0版本开始,OPEN AS2会跟踪消息传输和接收过程,并将消息状态写入内嵌的H2 数据库中。
以下是默认配置:
<module classname="org.openas2.processor.msgtracking.DbTrackingModule"
use_embedded_db="true"
force_load_jdbc_driver="false"
db_user="sa"
db_pwd="OpenAS2"
db_name="openas2"
table_name="msg_metadata"
db_directory="%home%/DB"
jdbc_driver="org.h2.Driver"
jdbc_connect_string="jdbc:h2:$component.db_directory$/$component.db_name$"
sql_escape_character="‘"
tcp_server_start="true"
tcp_server_port="9092"
tcp_server_password="openas2"
/>
除了使用内嵌的H2数据库,还可以使用任何有JDBC驱动的数据库(如Oracle, mysql or Postgresql等)。使用外部数据库时需要将JDBC驱动放入 lib
目录,同时将 use_embedded_db
属性值设为"false",还要修改其它部分属性值。
下面的配置以 Postgresql 为例:(用户名、密码根据实际情况填写)
<module classname="org.openas2.processor.msgtracking.DbTrackingModule"
use_embedded_db="false"
force_load_jdbc_driver="false"
db_user="sa"
db_pwd="OpenAS2"
db_name="openas2"
db_directory="%home%/DB"
jdbc_driver="org.postgresql.Driver"
jdbc_connect_string="jdbc:postgresql://localhost:5432/$component.db_name$"
sql_escape_character="‘"
/>
4.1.6 重试配置
如果消息传输出错,系统会自动无限重试,但可以配置重试次数。
config.xml
中的配置的重试次数会被 partnerships.xml
中配置的重试次数覆盖。
<module classname="org.openas2.processor.sender.AS2SenderModule" retries="5"/>
<module classname="org.openas2.processor.sender.MDNSenderModule" retries="3"/>
4.1.7 其它配置
另外还有一些其它配置,如文件名解析、代理 服务器 、健康检查等,可以查看OPEN AS2的使用说明 OpenAS2HowTo.pdf 。
4.2 partnerships.xml伙伴配置
partnerships.xml
中配置了信息交换伙伴的所有信息
4.2.1 <partner>
定义了信息交换的贸易伙伴信息
name:贸易伙伴的名称;
as2_id:贸易伙伴之间确认身份的标识,同时也被通用发送文件轮询模块用来解析文件名;
x509_alias:证书别名,需要与密钥证书设置的别名一致。
4.2.2 <partnership>
定义了2个贸易伙伴之间的关系
`sender`:需要与发送方中的name属性值一致
`receive`:需要与接收方中的name属性值一致
`sign`:AS2报文签名算法,支持md2, md5, sha1, sha224, sha256, sha384, sha512
`encrypt`:AS2报文加密算法,支持3des, cast5, rc2_cbc, aes128, aes192, aes256
4.2.3 伙伴关系配置示例
下面的示例是自己公司和2个交易伙伴配置:
<partnerships>
<partner name="MyCompany"
as2_id="MyCompany_OID"
x509_alias="mycompany"
email="as2msgs@openas2.com"/>
<partner name="PartnerA"
as2_id="PartnerA_OID"
x509_alias="partnera"
email="as2msgs@partnera.com"/>
<partner name="PartnerB"
as2_id="PartnerB_OID"
x509_alias="partnerb"
email="as2msgs@partnerb.com"/>
<partnership name="MyCompany-to-PartnerA">
<sender name="MyCompany"/>
<receiver name="PartnerA"/>
<attribute name="protocol" value="as2"/>
<attribute name="content_transfer_encoding" value="binary"/>
<attribute name="compression_type" value="ZLIB"/>
<attribute name="subject" value="File $attributes.filename$ sent from $sender.name$ to $receiver.name$"/>
<attribute name="as2_url" value="http://localhost:10080"/>
<attribute name="as2_mdn_to" value="edi@myCompany.com"/>
<attribute name="as2_mdn_options"
value="signed-receipt-protocol=optional, pkcs7-signature; signed-receipt-micalg=optional, $attribute.sign$"/>
<attribute name="encrypt" value="3DES"/>
<attribute name="sign" value="SHA256"/>
<attribute name="resend_max_retries" value="3"/>
<attribute name="prevent_canonicalization_for_mic" value="false"/>
<attribute name="rename_digest_to_old_name" value="false"/>
<attribute name="remove_cms_algorithm_protection_attrib" value="false"/>
</partnership>
<partnership name="PartnerA-to-MyCompany">
<sender name="PartnerA"/>
<receiver name="MyCompany"/>
</partnership>
<partnership