AS2協議(Applicability Statement 2)是在互聯網上安全可靠地傳輸數據的標準規範。它經過使用數字證書、加密機制保障傳輸數據的安全性。算法
OpenAS2 是用 Java 實現 AS2 的開源項目, 基於FreeBSD開源協議,OpenAS2 使您可以在交易夥伴之間傳送和接收 EDI-X十二、EDIFACT、XML 或二進制形式的 AS2 消息。sql
Open AS2 下載地址:sourceforge.net/projects/op…shell
下載解壓,無需安裝便可運行,目錄結構以下:數據庫
.
├── OpenAS2HowTo.pdf
├── RELEASE-NOTES.md
├── bin
├── changes.txt
├── config
├── lib
└── resources
複製代碼
在執行腳本以前,須要確認的是系統中已經設置了JAVA_HOME
環境變量。安全
給啓動腳本添加執行權限bash
chmod +x ./bin/start-openas2.sh
複製代碼
啓動OPEN AS2服務器
./bin/start-openas2.sh
複製代碼
若是一切正常的話會看到如下提示app
FINE OpenAS2Server: OpenAS2 Server v2.9.0 started.async
$ ./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
複製代碼
配置文件位於config目錄,其中各個文件有不一樣做用tcp
另外,config.xml文件中的配置若是發生更改須要重啓應用纔會生效,而其它文件配置發生更改會自動刷新。
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">
</>
複製代碼
<certificates classname="org.openas2.cert.PKCS12CertificateFactory" filename="%home%/as2_certs.p12" password="testas2" interval="300"/>
複製代碼
%home%
表示當前目錄,也就是config目錄,filename
和password
的屬性值須要改爲咱們的keystore文件和密碼。
這裏僅僅定義了夥伴關係文件的位置,詳細的配置信息在這個文件中。
<partnerships classname="org.openas2.partner.XMLPartnershipFactory"
filename="%home%/partnerships.xml"
interval="120"/>
複製代碼
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"
複製代碼
從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="'" />
複製代碼
若是消息傳輸出錯,系統會自動無限重試,但能夠配置重試次數。
config.xml
中的配置的重試次數會被partnerships.xml
中配置的重試次數覆蓋。
<module classname="org.openas2.processor.sender.AS2SenderModule" retries="5"/>
<module classname="org.openas2.processor.sender.MDNSenderModule" retries="3"/>
複製代碼
另外還有一些其它配置,如文件名解析、代理服務器、健康檢查等,能夠查看OPEN AS2的使用說明 OpenAS2HowTo.pdf。
partnerships.xml
中配置了信息交換夥伴的全部信息
<partner>
定義了信息交換的貿易伙伴信息<partnership>
定義了2個貿易伙伴之間的關係下面的示例是本身公司和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>
。
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中的設置將會覆蓋全局設置。
默認的內容傳輸編碼是binary
,能夠使用partenership.xml中的content_transfer_encoding
屬性覆蓋默認值。
OPEN AS2自動支持入站消息壓縮,若是要開啓出站消息壓縮,須要在partenership.xml中設置compression_type
屬性,惟一支持的壓縮/解壓格式是ZLIB
,默認是不啓用壓縮的。
partener: CLINFLASH、CDEE2B
這裏咱們在同一臺機器上部署兩個OPEN AS2實例,爲了使配置互不影響,咱們將OPEN AS2的程序目錄拷貝2份,分別爲OpenAS2-01
、OpenAS2-02
。
進入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>
複製代碼
進入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-0一、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傳輸文件測試下來也沒有問題。
到目前位置,關於OPEN AS2基本的使用上面以及都有說起,但OPEN AS2的功能遠不止這些,如日誌、數據庫記錄、郵件服務等細節問題還須要根據實際項目須要進一步實踐。