商业文件通常需要特殊处理。 Enter 电子文件交换,或 电子数据交换. EDI 不仅仅是使用电子邮件或 http(或 ftp)传输文件,因为这些是订单和发票等文件。 当您发送发票时,您需要确保:
1、去往正确的目的地,不被竞争对手拦截。
2.您的发票不能被第三者伪造。
3. 您的客户不能在法庭上声称他们从未收到发票。
前两个目标可以通过 HTTPS 或带有 S/MIME 的电子邮件来实现,在某些情况下,一个简单的 HTTPS POST 到 Web API 就足够了。 EDI 添加的是最后一部分。
本文不涉及交换文件格式的混乱主题。 即使使用 ANSI 或 EDIFACT 等标准化格式,最终也取决于业务合作伙伴。 业务合作伙伴使用临时 CSV 文件格式的情况并不少见。 这篇文章告诉你如何配置 Fedora 在 EDI 设置中发送和接收。
集中式 EDI
传统的解决方案是使用增值网络,或者 货车. VAN 是在客户之间传输文件的中心枢纽。 最重要的是,它保存了交换文件的安全记录,可用作争议中的证据。 VAN 可以为每个客户使用不同的传输协议
AS 协议和 MDN
AS 协议是用于向电子文档添加具有可选加密的数字签名的规范。 它通过 HTTPS 或 S/MIME 添加的是消息处置通知,或者 MDN. MDN 是一份签名并注明日期的回复,实质上是“我们收到了您的发票”。 它使用安全哈希来识别收到的特定文档。 这在不涉及第三方的情况下解决了第 3 点。
这 AS2 协议 使用 HTTP 或 HTTPS 进行传输。 其他 AS 协议目标 FTP 和 SMTP. 大大小小的公司都使用 AS2 来避免依赖(和支付)VAN。
OpenAS2
OpenAS2 是 AS2 协议的开源 Java 实现。 它可以在 Fedora 自 28 年以来,并安装了:
$ sudo dnf install openas2
$ cd /etc/openas2
配置是使用文本编辑器完成的,配置文件是 XML 格式的。 启动 OpenAS2 之前的第一件事就是更改出厂密码。
编辑 /etc/openas2/config.xml 并搜索 ChangeMe。 更改这些密码。 证书存储区的默认密码是 testas2,但这并不重要,因为任何可以读取证书存储区的人都可以读取 config.xml 并获取密码。
与 AS2 合作伙伴分享的内容
您将与 AS2 对等方交换 3 样东西。
AS2 标识
不要费心查找官方 AS2 标准以获取合法的 AS2 ID。 虽然 OpenAS2 实现了该标准,但您的合作伙伴可能会使用不具备该标准的专有产品。 虽然 AS2 允许更长的 ID,但许多实现会中断超过 16 个字符。 使用其他合法的 AS2 ID 字符(如“:”)在专有操作系统上可能显示为路径分隔符也是一个问题。 将您的 AS2 ID 限制为不超过 16 个字符的大小写字母、数字和“_”。
SSL证书
实际使用时,您需要使用 SHA256 和 RSA 生成证书。 OpenAS2 附带两个工厂证书可供使用。 显然,不要将这些用于任何真实的事情。 证书文件为 PKCS12 格式。 Java 附带了 keytool,它可以维护您的 PKCS12 “密钥库”,正如 Java 所说的那样。 本文跳过使用 openssl 生成密钥和证书。 只需注意 sudo keytool -list -keystore as2_certs.p12 将列出两个工厂实践证书。
AS2 网址
这是一个将访问您的 OpenAS2 实例的 HTTP URL。 HTTPS 也受支持,但它是多余的。 要使用它,您必须取消注释 config.xml 中的 https 模块配置,并提供由公共 CA 签名的证书。 这需要另一篇文章,这里完全没有必要。
默认情况下,OpenAS2 在 10080 上侦听 HTTP,在 10443 上侦听 HTTPS。 OpenAS2 可以与自己对话,因此它附带两个使用 https://localhost:10080 作为 AS2 URL 的伙伴关系。 如果您不认为这是一个令人信服的演示,并且可以安装第二个实例(例如在 VM 上),您可以将私有 IP 用于 AS2 URL。 或者安装 Cjdns 来获取可以在任何地方使用的 IPv6 网状地址,从而产生像 https:// 这样的 AS2 URL[fcbf:fc54:e597:7354:8250:2b2e:95e6:d6ba]:10080。
大多数企业还希望将 IP 列表添加到他们的防火墙中。 这实际上是 坏习惯. AS2 服务器与 Web 服务器具有相同的安全风险,这意味着您应该将其隔离在 VM 或容器中。 此外,随着合作伙伴列表的增加,保持相互更新 IP 列表的难度也越来越大。 AS2 服务器拒绝未由已配置伙伴签名的请求。
OpenAS2 合作伙伴
考虑到这一点,在您的编辑器中打开合作伙伴关系.xml。 顶部是“合作伙伴”列表。 每个合作伙伴都有一个名称(以下合作伙伴将其称为“发送者”或“接收者”)、AS2 ID、证书和电子邮件。 您需要为自己和与您交换文件的人定义合作伙伴。 您可以为自己定义多个合作伙伴。 OpenAS2 附带两个合作伙伴,OpenAS2A 和 OpenAS2B,您将使用它们来发送测试文档。
OpenAS2 合作伙伴
接下来是“伙伴关系”列表,每个方向都有一个。 每个伙伴关系配置都包括发送者、接收者和用于发送文档的 AS2 URL。 默认情况下,合作伙伴使用同步 MDN。 MDN 在同一个 HTTP 事务中返回。 您可以取消注释异步 MDN 的 as2_receipt_option,该选项稍后发送。 尽可能使用同步 MDN,因为跟踪待处理的 MDN 会增加应用程序的复杂性。
其他合作伙伴选项选择加密、签名哈希和其他协议选项。 完全实现的 AS2 接收器可以处理任何选项组合,但 AS2 合作伙伴可能有不完整的实现或策略要求。 为了 example, DES3 是一种比较弱的加密算法,可能无法接受。 这是默认设置,因为它几乎被普遍实施。
如果您为此测试设置了第二台物理机或虚拟机,请将其中一台指定为 OpenAS2A,另一台指定为 OpenAS2B。 修改 OpenAS2A 到 OpenAS2B 伙伴关系上的 as2_url 以使用 OpenAS2B 的 IP(或主机名),反之亦然,用于 OpenAS2B 到 OpenAS2A 伙伴关系。 除非他们使用 FedoraWorkstation 防火墙配置文件,否则在两台机器上您都需要:
# sudo firewall-cmd --zone=public --add-port=10080/tcp
现在启动 openas2 服务(如果需要,在两台机器上):
# sudo systemctl start openas2
重置 MDN 密码
这将使用出厂密码初始化 MDN 日志数据库,而不是您更改的密码。 这是一个打包错误,将在下一个版本中修复。 为避免沮丧,以下是更改 h2 数据库密码的方法:
$ sudo systemctl stop openas2
$ cat >h2passwd <<'DONE'
#!/bin/bash
AS2DIR="/var/lib/openas2"
java -cp "$AS2DIR"/lib/h2* org.h2.tools.Shell
-url jdbc:h2:"$AS2DIR"/db/openas2
-user sa -password "$1" <<EOF
alter user sa set password '$2';
exit
EOF
DONE
$ sudo sh h2passwd ChangeMe yournewpasswordsetabove
$ sudo systemctl start openas2
测试设置
有了这个,让我们发送一个文件。 假设您在 OpenAS2A 机器上:
$ cat >testdoc <<'DONE'
This is not a real EDI format, but is nevertheless a document.
DONE
$ sudo chown openas2 testdoc
$ sudo mv testdoc /var/spool/openas2/toOpenAS2B
$ sudo journalctl -f -u openas2
... log output of sending file, Control-C to stop following log
^C
OpenAS2 不会发送文档,直到它可以被 openas2 用户或组写入。 因此,您的实际业务应用程序将复制或就地生成文档。 然后它会更改组或权限以在途中发送它,以避免发送部分文档。
现在,在 OpenAS2B 机器上,/var/spool/openas2/OpenAS2A_OID-OpenAS2B_OID/inbox 显示收到的消息。 那应该让你开始!
摄影者 比阿特丽斯·佩雷斯·莫亚 在 不飞溅.