OPEN AS2使用入門

AS2協議(Applicability Statement 2)是在互聯網上安全可靠地傳輸數據的標準規範。它經過使用數字證書、加密機制保障傳輸數據的安全性。算法

OpenAS2 是用 Java 實現 AS2 的開源項目, 基於FreeBSD開源協議,OpenAS2 使您可以在交易夥伴之間傳送和接收 EDI-X十二、EDIFACT、XML 或二進制形式的 AS2 消息。sql

1.下載安裝

Open AS2 下載地址:sourceforge.net/projects/op…shell

下載解壓,無需安裝便可運行,目錄結構以下:數據庫

.
├── OpenAS2HowTo.pdf
├── RELEASE-NOTES.md
├── bin
├── changes.txt
├── config
├── lib
└── resources
複製代碼

2.啓動測試

在執行腳本以前,須要確認的是系統中已經設置了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

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目錄,其中各個文件有不一樣做用tcp

  • 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目錄,filenamepassword的屬性值須要改爲咱們的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-01OpenAS2-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-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傳輸文件測試下來也沒有問題。

6.總結

到目前位置,關於OPEN AS2基本的使用上面以及都有說起,但OPEN AS2的功能遠不止這些,如日誌、數據庫記錄、郵件服務等細節問題還須要根據實際項目須要進一步實踐。

相關文章
相關標籤/搜索