一、前言
上一篇給大家介紹了關於標准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>