關於標准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 name="MyCompany-to-PartnerB"> <sender name="MyCompany"/> <receiver name="PartnerB"/> <attribute name="protocol" value="as2"/> <attribute name="content_transfer_encoding" value="8bit"/> <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="https://as2.partnerb.com:8443"/> <attribute name="as2_mdn_to" value="edi@myCompany.org"/> <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="SHA1"/> <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="PartnerB-to-MyCompany"> <sender name="PartnerB"/> <receiver name="MyCompany"/> </partnership> </partnerships>

有一點需要說明的是:即使數據傳輸是單向的,也要配置雙向的 <partnership> 。

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.net, OU=Clinflash, O=Clinflash, L=Shanghai, S=Shanghai, C=CN"

config.xml

修改證書路徑及密碼

<certificates classname="org.openas2.cert.PKCS12CertificateFactory" filename="%home%/clinflash-pv.p12" password="123456" interval="300"/> 復制代碼

發送輪詢目錄配置僅保留一條

<module classname="org.openas2.processor.receiver.AS2DirectoryPollingModule" outboxdir="$properties.storageBaseDir$/toCDEE2B/" errordir="$properties.storageBaseDir$/toCDEE2B/error" interval="5" defaults="sender.as2_id=CLINFLASH, receiver.as2_id=CDEE2B" sendfilename="true" mimetype="application/EDI-X12"/> 

其它配置無需修改。

partenership.xml

其中,as2_url需要與接收方AS2接收消息的host、port一致,如果接收方也是OPEN AS2,配置在config.xml中的AS2ReceiverModule模塊。

<partnerships> <partner name="CLINFLASH" as2_id="CLINFLASH" x509_alias="clinflash-pv" email="xxx@xxx.com"/> <partner name="CDEE2B" as2_id="CDEE2B" x509_alias="cdee2b" email="xxx@xxx.com"/> <partnership name="CLINFLASH-to-CDEE2B"> <sender name="CLINFLASH"/> <receiver name="CDEE2B"/> <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:20080"/> <attribute name="as2_mdn_to" value="any string"/> <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="CDEE2B-to-CLINFLASH"> <sender name="CDEE2B"/> <receiver name="CLINFLASH"/> </partnership> </partnerships>

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

修改證書路徑及密碼

<certificates classname="org.openas2.cert.PKCS12CertificateFactory" filename="%home%/cdee2b.p12" password="123456" interval="300"/>

發送輪詢目錄配置僅保留一條

<module classname="org.openas2.processor.receiver.AS2DirectoryPollingModule" outboxdir="$properties.storageBaseDir$/toCLINFLASH/" errordir="$properties.storageBaseDir$/toCLINFLASH/error" interval="5" defaults="sender.as2_id=CDEE2B, receiver.as2_id=CLINFLASH" sendfilename="true" mimetype="application/EDI-X12"/>

其它配置無需修改。

partenership.xml

<partnerships> <partner name="CDEE2B" as2_id="CDEE2B" x509_alias="cdee2b" email="xxx@xxx.com"/> <partner name="CLINFLASH" as2_id="CLINFLASH" x509_alias="clinflash-pv" email="xxx@xxx.com"/> <partnership name="CDEE2B-to-CLINFLASH"> <sender name="CDEE2B"/> <receiver name="CLINFLASH"/> <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="any string"/> <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="CLINFLASH-to-CDEE2B"> <sender name="CLINFLASH"/> <receiver name="CDEE2B"/> </partnership> </partnerships>

交換密鑰

互相將公鑰發送給對方,並導入到密鑰庫。

導入公鑰的命令如下

cert import <alias> <path+filename> <keystore password> 

OPEN AS2也提供了快捷的腳本 import_public_cert.sh ,使用方法如下

import_public_cert.sh <src certificate> <target keystore> <cert alias> 

測試

分別啟動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的功能遠不止這些,如日志、數據庫記錄、郵件服務等細節問題還需要根據實際項目需要進一步實踐。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM