AS2协议(Applicability Statement 2)是在互联网上安全可靠地传输数据的标准规范。它通过使用数字证书、加密机制保障传输数据的安全性。
OpenAS2 是用 Java 实现 AS2 的开源项目, 基于FreeBSD开源协议,OpenAS2 使您能够在交易伙伴之间传送和接收 EDI-X12、EDIFACT、XML 或二进制形式的 AS2 消息。
1.下载安装
Open AS2 下载地址:https://sourceforge.net/projects/openas2
下载解压,无需安装即可运行,目录结构如下:
.
├── 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.com, 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
存储在文件 中的证书
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节点中定义了一些属性值,这些属性值可以在其他地方以变量方式使用。
例如使用storageBaseDir
这个属性值:
>
4.1.2 证书配置
%home%
表示当前目录,也就是config目录,filename
和password
的属性值需要改成我们的keystore文件和密码。
4.1.3 伙伴关系文件配置
这里仅仅定义了伙伴关系文件的位置,详细的配置信息在这个文件中。
4.1.4 发送文件配置
OPEN AS2会轮询扫描指定的目录,寻找发送给伙伴的文件。目录扫描器会在两个连续周期检查发现的文件大小是否发生变化,如果没有变化则会将此文件加入发送队列中。
用于存放发送文件的目录可以是一个伙伴的专有目录,也可以是一个通用目录。如果使用通用目录,则通过解析文件名确定伙伴的身份。
以下是发送文件相关的关键属性:
outboxdir
- 发送文件的扫描目录
errordir
- 发送文件出错后存放文件的目录
interval
- 扫描目录的周期(秒)
sendfilename
- 发送给远程伙伴的消息是否必须包含文件名
mimetype
- 指定发送消息中文件的扩展类型
- 通用发送目录配置
- 专有发送目录配置
其中,“defaults”属性指定了目录中所有文件的发送方和接收方的AS2 ID。
此外,还可以限制发送文件的扩展名,fileextensionfilter
指定了通过的文件扩展名,fileextensionexcludefilter
指定了忽略的文件扩展名。
fileextensionfilter="doc, docx, txt, edi"
fileextensionexcludefilter="tmp"
4.1.5 消息跟踪
从2.1.0版本开始,OPEN AS2会跟踪消息传输和接收过程,并将消息状态写入内嵌的H2数据库中。
以下是默认配置:
除了使用内嵌的H2数据库,还可以使用任何有JDBC驱动的数据库(如Oracle, MySql or Postgresql等)。使用外部数据库时需要将JDBC驱动放入lib
目录,同时将use_embedded_db
属性值设为"false",还要修改其它部分属性值。
下面的配置以Postgresql为例:(用户名、密码根据实际情况填写)
4.1.6 重试配置
如果消息传输出错,系统会自动无限重试,但可以配置重试次数。
config.xml
中的配置的重试次数会被partnerships.xml
中配置的重试次数覆盖。
4.1.7 其它配置
另外还有一些其它配置,如文件名解析、代理服务器、健康检查等,可以查看OPEN AS2的使用说明 OpenAS2HowTo.pdf。
4.2 partnerships.xml伙伴配置
partnerships.xml
中配置了信息交换伙伴的所有信息
4.2.1
定义了信息交换的贸易伙伴信息
name:贸易伙伴的名称;
as2_id:贸易伙伴之间确认身份的标识,同时也被通用发送文件轮询模块用来解析文件名;
x509_alias:证书别名,需要与密钥证书设置的别名一致。
4.2.2
定义了2个贸易伙伴之间的关系
sender
:需要与发送方
receive
:需要与接收方
sign
:AS2报文签名算法,支持md2, md5, sha1, sha224, sha256, sha384, sha512
encrypt
:AS2报文加密算法,支持3des, cast5, rc2_cbc, aes128, aes192, aes256
4.2.3 伙伴关系配置示例
下面的示例是自己公司和2个交易伙伴配置:
有一点需要说明的是:即使数据传输是单向的,也要配置双向的
。
4.2.4 AS2 Message ID
Message ID用于唯一标识发送给伙伴的消息,默认格式为
OPENAS2-$date.ddMMyyyyHHmmssZ$-$rand.UUID$@$msg.sender.as2_id$_$msg.receiver.as2_id$
在config.xml中可以通过as2_message_id_format
属性全局设置Message ID,在partnership.xml中的设置将会覆盖全局设置。
4.2.5 内容传输编码
默认的内容传输编码是binary
,可以使用partenership.xml中的content_transfer_encoding
属性覆盖默认值。
4.2.6 消息压缩
OPEN AS2自动支持入站消息压缩,如果要开启出站消息压缩,需要在partenership.xml中设置compression_type
属性,唯一支持的压缩/解压格式是ZLIB
,默认是不启用压缩的。
5.传输测试
partener: CLINFLASH、CDEE2B
这里我们在同一台机器上部署两个OPEN AS2实例,为了使配置互不影响,我们将OPEN AS2的程序目录拷贝2份,分别为OpenAS2-01
、OpenAS2-02
。
5.1 Partener 1 - CLINFLASH
进入OpenAS2-02,在config目录下生成密钥clinflash-pv.p12(keystore)、clinflash-pv.cer(public key).
../bin/gen_p12_key_par.sh clinflash-pv clinflash-pv SHA256 \
"CN=www.clinflash.com, OU=Clinflash, O=Clinflash, L=Shanghai, S=Shanghai, C=CN"
config.xml
修改证书路径及密码
发送轮询目录配置仅保留一条
其它配置无需修改。
partenership.xml
其中,as2_url需要与接收方AS2接收消息的host、port一致,如果接收方也是OPEN AS2,配置在config.xml中的AS2ReceiverModule模块。
5.2 Partener 2 - CDEE2B
进入OpenAS2-02,在config目录下生成密钥cdee2b.p12(keystore)、cdee2b.cer(public key)
../bin/gen_p12_key_par.sh cdee2b cdee2b SHA256 \
"CN=www.cde.org.cn, OU=CDE, O=CDE, L=Beijing, S=Beijing, C=CN"
config.xml
修改证书路径及密码
发送轮询目录配置仅保留一条
其它配置无需修改。
partenership.xml
交换密钥
互相将公钥发送给对方,并导入到密钥库。
导入公钥的命令如下
cert import
OPEN AS2也提供了快捷的脚本import_public_cert.sh
,使用方法如下
import_public_cert.sh
测试
分别启动OpenAS2-01、OpenAS2-02,但启动第二个实例发现连接数据库所用的9092端口被占用了,这时将其中一个的config.xml中的9092改为其它端口即可。
在OpenAS2-01/data/toCDEE2B/目录下添加任意文件
echo "test openas2..." > test.xml
马上会看到Message sent and MDN received successfully
提示发送成功并接收到回执。
此时进入OpenAS2-02/data/CLINFLASH-CDEE2B/inbox目,发现刚才接收到的文件test.xml-OPENAS2-28062019002300+0800-5bf115dd-b9f6-4fd2-b5ce-c6db19d2b435@CLINFLASH_CDEE2B
。
至此,从CLINFLASH向CDEE2B传输测试成功;同样的,CDEE2B向CLINFLASH传输文件测试下来也没有问题。
6.总结
到目前位置,关于OPEN AS2基本的使用上面已经都有提及,但OPEN AS2的功能远不止这些,如日志、数据库记录、邮件服务等细节问题还需要根据实际项目需要进一步实践。
本文转自我个人的掘金博客,但由于掘金没有文章目录、分类功能,管理文章非常不方便,不打算继续使用了。