Spring Integration 是一个非常强大且可扩展的框架,用于集成。但有时如何获取您需要的一些信息并非易事。在我的例子中——用于在 TLS(基于 TLS 的系统日志)连接中进行相互身份验证的证书。您有一个接收 a 的 Java 方法,Message理想情况下您希望获得客户端用来验证自身的证书链(例如,您可能需要提取 CN)。

幸运的是,Spring Integration 很灵活。它可以做到,但它有点令人费解。我将使用 XML 表示法,但同样可以通过 Java 配置来实现。


<bean id="nioConnectionSupport" class="com.yourcompany.util.net.TLSMutualNioConnectionSupport">


<constructor-arg ref="sslContextSupport" />


<constructor-arg value="false" />


</bean>


<bean id="interceptorFactoryChain" class="org.springframework.integration.ip.tcp.connection.TcpConnectionInterceptorFactoryChain">


<property name="interceptors">


<bean class="com.yourcompany.util.net.TLSSyslogInterceptorFactory" />


</property>


</bean>


 


<int-ip:tcp-connection-factory id="tlsConnectionFactory" type="server" port="${tcp.tls.port}"


using-nio="true" nio-connection-support="nioConnectionSupport"


single-use="false" interceptor-factory-chain="interceptorFactoryChain" />


sslContextSupport通常是一个org.springframework.integration.ip.tcp.connection.DefaultTcpSSLContextSupport或自定义实现(例如,如果您想使用“盲”信任存储)

然后你需要这两个类。您可以在它们各自的要点上查看它们:TLSSyslogInterceptorFactoryTLSMutualNioConnectionSupport

这些类有什么作用?TLSSyslogInterceptorFactory为包含客户端证书的消息设置新标头。该类TLSMutualNioConnectionSupport在 SSL 引擎上设置“wantClientAuth”选项。还有另一个选项——“needClientAuth”,用于客户端身份验证,而不仅仅是支持它。根据用例,您可以使用其中一种。

然后,您可以通过以下方式在处理程序方法中获取证书:


Certificate[] certificates = (Certificate[]) message.getHeaders().get(TLSSyslogInterceptorFactory.TLS_CLIENT_CERTIFICATES);


我想分享一个小技巧,以帮助下一个尝试实现这一目标的人。

当提到“公共基础设施”时,人们通常会想到道路、桥梁、铁路、水坝、发电厂、城市灯光。这些都是推动因素,由公共资助/拥有/管理(不一定是所有这些),它们允许更大的公众开展业务并满足基本需求。公共基础设施有时是免费的,但并非总是免费(您支付电费和通行费;当然有人会正确地指出没有什么是免费的,因为我们通过税收支付,但这不是重点)。

https://www.meipian.cn/4ez621lb

在数字时代,我们可以想到一些“公共基础设施”的额外例子。最明显的,具有物理方面的,是光纤电缆。有时它们是公有的(尤其是在农村地区),它们的目标是提供互联网接入,这本身就是商业和日常家庭活动的推动力。越来越多的国家、城市甚至更小的社区投资拥有光纤电缆,以确保平等地访问互联网。但电缆仍然是物理基础设施。

https://movie.douban.com/doulist/152234208/

完全数字化的东西,越来越多地变成公共基础设施,是开放的政府 API。它们并未完全被视为公共基础设施,仅存在于少数政策制定者和 IT 专家的头脑中,但从本质上讲,它们正是如此——政府拥有的基础设施,支持企业和其他活动。

https://www.douban.com/doulist/152234208/

但让我详细说明。开放 API 允许更大的公共访问数据和/或修改由政府机构(中央或地方)收集和/或集中和/或监控的数据。一些例子:

  • 电子医疗基础设施——保加利亚政府正在建立一个集中的健康记录以及集中的电子处方和电子住院。都是 API,私营公司为医院、全科医生、药房、实验室开发软件。其他公司可能会为公民开发应用程序,以帮助他们改善健康或为他们提供营养和运动建议。所有这些都基于开放 API(遵循 FHIR 标准)并允许公平竞争,同时管理对敏感数据、审计日志的访问,最重要的是 - 在集中存储中收集。
  • 收费系统——我们有一个集中的道路收费系统,它提供 API(不幸的是,通过过于复杂的中介模型)支持多个经销商销售通行证(基于时间和基于距离)。这使得电信(通过应用程序)、银行(通过电子银行)、超市、车队管理公司等能够提供更好的用户界面和综合服务。
  • 税务系统——企业将乐于通过其 ERP 自动报告税款,而不是手动导出和上传,或手动填写复杂表格中的数据。
  • 电子交付文件——保加利亚有一个集中系统,用于向公共机构电子交付文件。该系统有一个 API,允许第三方代表公民和组织集成和发送文档作为更复杂服务的一部分。
  • 汽车登记——汽车登记是集中式的,但开放他们的 API 将允许汽车(转售)商通过点击内部系统中的按钮在线代表客户处理所有文书工作。汽车零件所有者可以获取有关每个品牌和型号的注册汽车的数据,以确保有足够的备件库存(基于汽车零件的典型生命周期)。

具有开放 API 的核心系统和中央寄存器是数字公共基础设施,可以实现更加无缝、集成的状态。有很多细节需要考虑——访问管理和身份验证(谁有权读取或写入某些数据)、费用(如果系统被大量使用,拥有机构可能会收取费用)、变更管理和升级、零停机时间、完整性、格式等。

但我一直遵循和倡导的政策很明确——所有政府系统都必须开放 API。如果遵循这一原则,官僚主义和文书工作可能会变得几乎看不见,隐藏在 API 后面。