CN115941178A - 一种支持加密模式的opc ua反向代理服务器的实现方法 - Google Patents
一种支持加密模式的opc ua反向代理服务器的实现方法 Download PDFInfo
- Publication number
- CN115941178A CN115941178A CN202211650623.4A CN202211650623A CN115941178A CN 115941178 A CN115941178 A CN 115941178A CN 202211650623 A CN202211650623 A CN 202211650623A CN 115941178 A CN115941178 A CN 115941178A
- Authority
- CN
- China
- Prior art keywords
- message
- client
- server
- structured
- proxy server
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开一种支持加密模式的OPCUA反向代理服务器的实现方法。本发明用TCP服务器模拟源服务器终端,用映射客户端模拟真实客户端。OPCUA反向代理服务器接收真实客户端消息,通过其协议栈中的消息解析模块得到结构化消息;通过映射客户端协议栈中的消息替换模块、消息封装模块对结构化消息进行信息替换,重新封装成二进制数据,通过映射客户端的socket转发给源服务器。映射客户端接收源服务器消息,通过其协议栈中消息解析模块得到结构化消息,通过反向代理端协议栈中的消息替换模块、消息封装模块对结构化消息进行必要的信息替换,重新封装成二进制数据,通过反向代理器的socket转发给真实客户端。本发明流程精简效率高,且能够实现加密模式的代理转发。
Description
技术领域
本发明属于工业互联网领域,涉及一种OPC UA反向代理服务器的实现方法,特别是支持在加密模式进行反向代理。
背景技术
OPC UA作为工业4.0的通信标准,在信息安全的保密性和完整性上已经做了完备的实现,但在可用性上却没有提供完善的解决方案,一些通用的解决方法仅能够通过检测流量的突变来判断攻击,并不能深入识别OPC UA层级的信息,对于某些特殊的攻击手段,比如耗尽资源的拒绝服务攻击无能为力反向代理服务器去解决。反向代理服务器作用于服务器端,可以对客户端的消息进行分析,控制,起到安全防护的作用。目前还没有专门针对OPCUA协议的代理方案,一些通用的应用层之下的代理服务器,搭配防火墙拦截获取数据包,然后再转发给目标服务器,实现非加密模式下的代理转发,而分析数据包则需要引入OPC UA解析模块,整个流程复杂且耗时;且在加密模式下,通用代理服务器无法获取密钥派生所需的全部信息,也就无法分析数据内容,无法完成代理。
发明内容
本发明提供一种支持加密模式的OPC UA反向代理服务器的实现方法,该方法实现的是OPC UA层面的代理服务器,依赖更少外部装置的同时能够实现加密模式的代理转发,解决了OPC UA通信代理难度大以及加密模式下无法代理的技术问题。
本发明解决其技术问题所采用的技术方案包括如下步骤:
步骤1、根据配置的证书和获取的终端描述初始化该OPC UA反向代理服务器;
步骤2、该OPC UA反向代理服务器接收真实客户端的连接请求,与真实客户端建立socket连接,同时创建映射客户端,映射客户端通过socket连接到对应地址的源服务器终端上;
步骤3、该OPC UA反向代理服务器接收真实客户端消息,通过反向代理服务端协议栈中的消息解析模块得到结构化消息,先后通过映射客户端协议栈中的消息替换模块、消息封装模块对结构化消息进行必要的信息替换,重新封装成二进制数据,通过映射客户端的socket转发给源服务器;如果通信设置成非None模式,则还涉及密钥的派生以及消息的加密与解密;
步骤4、映射客户端接收源服务器消息,通过映射客户端协议栈中消息解析模块得到结构化消息,先后通过反向代理端协议栈中的消息替换模块、消息封装模块对结构化消息进行必要的信息替换,重新封装成二进制数据,通过反向代理器的socket转发给真实客户端;如果通信设置成非None模式,则还涉及密钥的派生以及消息的加密与解密。
进一步的,所述的OPC UA协议栈实现模块包括:
消息解析模块用于统一处理所有类型的消息,实现二进制数据编译为结构化消息;
消息替换模块用于根据消息类型进行替换操作;
消息封装模块用于统一封装所有类型的消息,实现结构化消息编译为二进制数据;
所述的替换操作主要是读取结构化消息中的ExpandedNodeId属性,判断该消息类型:
①对于请求消息:
若是OPN请求消息,替换结构化消息中的客户端证书为映射客户端的证书;
若是Discovery服务集的请求消息,替换结构化消息请求体中的endpointUrl为源服务器上对应的终端地址;
若是CreateSession请求消息,替换结构化消息请求体中的clientDescription,clientCertificate为映射客户端的信息,替换endpointUrl为源服务器上的对应的终端地址;
若是ActiveSession请求消息,根据定义计算clientSignature,替换结构化消息请求体中的clientSignature;
②对于回复消息:
若是Discovery服务集的回复消息,替换结构化消息的消息内容中终端描述列表中每一项的服务器证书和终端地址为代理服务器上对应的数据;
若是CreateSession回复消息,替换结构化消息的消息内容中服务器证书,终端描述为代理服务器上对应的数据。
进一步的,所述的密钥的派生方法如下:
步骤(1)、真实客户端通过GetEndpoints服务获取源服务器的终端描述;
步骤(2)、真实客户端向选择的终端描述发送OpenSecureChannel(OPN)请求消息;
步骤(3)、反向代理服务器接收请求并转发;
步骤(4)、反向服务器接收源服务器的回复消息并转发;
所述的步骤(1)中源服务器终端描述中提供有客户端建立socket连接的url、服务器证书以及加密与签名的套件,获取终端描述的过程为非加密的模式;真实客户端通过GetEndpoints服务获取源服务器终端描述的步骤包括:
1-1.真实客户端在没有服务器证书的情况下,通过非加密的方式和反向代理服务器建立连接;
1-2.真实客户端在非加密连接的基础上发送GetEndpoints请求消息,代理服务器接收请求消息后,解析得到结构化消息,替换其中的终端地址为源服务器上对应的真实地址,封装修改替换后的结构化消息,通过映射客户端转发封装后的二进制数据;
1-3.源服务器返回包含终端描述列表的消息给映射客户端,映射客户端修改协议栈解析得到结构化消息,代理服务器修改协议栈替换结构化消息的列表中每条描述的终端地址和服务器证书,封装修改的结构化消息,通过对应socket转发封装后的二进制数据。
进一步的,于所述的步骤(2)具体实现方法如下:
真实客户端准备的消息内容中携带有真实客户端本次通信的随机数以及真实客户端证书,消息内容使用刚才保存的反向代理服务器证书中的公钥加密,使用真实客户端私钥进行签名,真实客户端向反向代理服务器发送OPN请求消息。
进一步的,步骤(3)具体实现方法如下:
反向代理服务器接收到加密的OPN请求消息后,消息解析模块使用本服务器证书对应的私钥解密消息内容,使用真实客户端证书验证签名,得到OPN请求消息的结构化消息;从结构化消息的消息内容中取出客户端随机数,将其更新到反向代理服务端的消息解析模块以及映射客户端的消息解析模块的配置中;替换结构化消息中的客户端证书为映射客户端的证书,将修改替换的结构化消息使用映射客户端的消息封装模块封装,使用映射客户端私钥签名,源服务器证书公钥加密,通过映射客户端转发该OPN请求消息。
进一步的,所述的步骤(4)具体实现方法如下:
映射客户端接收源服务器的OPN回复消息,由于之前做了替换客户端证书操作,源服务器是使用映射客户端的公钥加密的,所以映射客户端的消息解析模块使用映射客户端私钥解密,使用源服务器证书公钥验证签名,得到OPN回复消息的结构化消息,从中取出源服务器本次通讯的随机数,回复内容不做处理,反向代理服务器的消息封装模块使用真实客户端证书公钥签名,反向代理服务器证书私钥加密,将经过封装后的二进制数据转发给真实客户端;此时代理服务器获取了双方的随机数以及加密套件,客户端、反向代理服务器以及源服务器都能推算出相同的两套派生密钥,将客户端派生密钥中的信息保存到反向代理服务器解析模块和映射客户端封装模块的配置中,将服务端派生密钥中的信息保存到反向代理服务器的消息封装模块和映射客户端的消息解析模块的配置中,用于之后对称加密的通信。
本发明有益效果如下:
本发明提出的支持加密模式的OPC UA反向代理服务器的实现方法,使用TCP服务器模拟源服务器终端,使用映射客户端模拟真实客户端,接收真实客户端与源服务器的消息,通过修改的协议栈进行解析、替换、封装,从而完成透明地转发。反向代理服务器不会主动响应各种OPC UA消息,也没有能力提供各种OPC UA服务。它只是按照既定的规则解析和封装各类信息,给某些特征信息进行必要的替换,以确保数据能够通过OPC UA自带的安全机制,实现客户端与源服务器之间的透明转发,同时在证书替换以及随机数算法计算的过程中,完成了密钥的派生,获得了加密模式下的解析数据的能力。相比于应用层以下的通用代理服务器,本发明提出的支持加密模式的OPC UA反向代理服务器的实现方法依赖的外部装置更少,流程更加精简,效率更高,且能够实现加密模式的代理转发。
附图说明
图1是OPC UA反向代理器实现方法的原理图;
图2是初始化OPC UA反向代理器的结果图;
图3是OPC UA反向代理器实现方法的流程图;
图4是OPC UA反向代理器在加密模式下派生密钥的流程图;
具体实施方式
图1是本发明其中实施例中OPC UA反向代理器实现方法的原理图。如图1所示,本发明申请的OPC UA反向代理服务器工作在OPC UA层面,底层通过socket和真实客户端连接。OPC UA在基础的socket连接上,封装了多个通信层级,包括transport_tcp,SecureChannel,Session。如图1所示,不同层级有不同的数据格式,在向上传递的过程中,一些底层消息会被过滤。比如OPC UA建立连接时双方发送的HEL/ACK消息,在SecureChannel和Session层级监控不到,而HEL/ACK泛洪是OPC UA拒绝服务攻击的主要手段,无法处理某些消息意味着安全防护能力的缺失;如果在通信底层转发,组装消息以及识别消息内容的难度将大大增加,选在socket层面进行代理转发能够处理所有信息,搭配修改的OPC UA协议栈可以很灵活地实现一些必要的处理,减少不必要的处理延时,所以选在socket层面进行代理转发是合适的。
反向代理服务器对外暴露TCP服务器,接收客户端的连接请求。当反向代理服务器收到客户端消息后,由于服务器与服务器之间不能直接通讯,所以需要一个额外的客户端来进行转发。反向代理服务器与一个真实客户端创建socket1连接的同时,也会创建一个映射客户端以及映射客户端与源服务器之间的socket2连接,这样从socket1接收的真实客户端消息可以从socket2转发给源服务器。但是简单地转发消息内容将会导致通信失败,因为OPC UA通信的过程中,通信栈会反复检查通信双方的身份,包括两端应用实例证书的检验,终端url的检验,应用名称的检验以及随机签名的检验。如果某一个检验不通过,连接就会被强制关闭。一个可能的场景是,真实客户端发送的消息中,终端url是反向代理服务器所在的url,如果直接将该消息转发给源服务器,显然OPC UA协议栈将会报错并终止本次通信。所以,修改的协议栈需要在特定类型的消息中做一些检验信息的替换的工作,以通过OPC UA协议栈的检验,保证代理转发的透明性。
从socket中获取的数据是OPC UA协议包的二进制格式,无法直接被识别,也无法直接修改,同时这些数据也可能被加密,所以修改的协议栈需要实现消息解析模块,用于将二进制数据转换成可识别的消息内容,本发明中称为结构化消息。这将涉及到消息的解密,密钥的派生以及消息的组装。OPC UA消息是在一次完整的通信过程中发送的数据,OPC UA消息包括用于配置连接的简单消息,类型有三种:HEL/ACK/ERR,也包括不同的请求与回复,较长的该类消息还会拆分成多个协议包发送。不同于原协议栈的过滤底层消息的处理,反向代理服务器转发所有消息,将统一解析HEL/ACK/ERR类型以及请求/回复类型的消息,仅以客户端消息和服务器消息做区分。
结构化消息的具体形式还要考虑到消息封装功能。在解析得到结构化消息后,消息替换模块可以进行必要的信息替换,而替换后的结构化消息必须经过消息封装模块才能被原OPC UA协议栈识别。一个OPC UA协议包可能出现的属性如下,由于反向代理服务器不会维护复杂的安全信道,无法提供某些必要的信息,而这些信息又直接出现在原消息中,所以可以将这些信息继承下来,将下表中所有可以继承的属性组合起来,就得到了结构化消息的具体形式(一条消息可能不包含下表中的某些属性,所以解析该消息得到的结构化消息也可能只包含下表中部分可继承的属性)
所以,不管是从真实客户端还是从源服务器接收到的消息,都需要经过消息解析→消息替换→消息封装三个必要步骤。更加具体来说,客户端的消息需要服务端来解析,转发到另一个服务器之前,又需要客户端来封装。通过真实客户端接收的消息将进入服务端的消息解析模块,得到真实客户端结构化消息,通过映射客户端的修改协议栈进一步处理客户端消息,包括消息替换以及消息封装,将封装好的二进制数据包通过映射客户端转发给源服务器;服务端的消息需要客户端来解析,转发到另一个客户端之前,又需要服务端来封装。通过源服务端接收的消息将进入映射客户端的消息解析模块,得到源服务端结构化消息,通过反向代理服务端的修改的协议栈进一步处理源服务端消息,包括消息替换以及消息封装,将封装好的二进制数据包通过反向代理服务器转发给真实客户端。如图1所示,反向代理服务器在多个端口上等待客户端建立socket连接,它可以运行在多个客户端对一个源服务器的模式,也可以运行在多个客户端对多个源服务器的模式,并不仅限于图片所示的一对一模式,使用一对一模式仅仅是为了方便说明原理。
图2是本发明一实施例中初始化OPC UA反向代理器的结果图。如图2所示,为了不依赖于防火墙的拦截,该OPC UA反向代理服务器对外表现为一个正常的OPC UA服务器,可以接收连接请求和消息,也能正常回复OPC UA语义的消息。OPC UA客户端直连的是该OPCUA反向代理服务器对外暴露它的地址和端口,这样才能隐藏源服务器的地址和端口。在OPCUA服务器上,每个终端都是一台监听某个端口的TCP服务器,接收客户端的连接。从OPC UA层面来说,一个终端可以通过多种终端描述来连接,例如同一个终端的加密模式和非加密模式就是两个不同的终端描述,而OPC UA客户端通过选择某一个终端描述,使用其中的安全信息和该终端建立连接,从底层来看也就是和该TCP服务器建立socket连接,在socket连接上构建Transport和SecureChannel。反向代理服务器并不需要详细模拟终端配置,维护多个终端信息,它只需要按照源服务器的配置,构建相同数量的TCP服务器,以模拟源服务器在不同终端上接收不同配置的连接。保存反向代理服务器上的每个TCP服务器与源服务器地址的对应关系,这样每当有真实客户端和某个TCP服务器建立时,新建映射客户端才知道与哪个地址建立socket连接。
图3是OPC UA反向代理器实现方法的流程图,该OPC UA反向代理器实现方法包括如下步骤S101至S104:
S101、根据配置的证书和获取的终端描述初始化该OPC UA反向代理服务器。在其中一个实施例中,配置的证书应当向源服务器的PKI或者客户端信任的CA申请,以防止代理服务器的应用实例证书无法通过客户端的验证;有效的代理服务器证书是后续对称密钥派生成功的关键;源服务器终端描述的获取发生在映射客户端建立之前,反向代理服务器需要在运行初期建立一个初始化的客户端,向源服务器发起GetEndpoints服务调用,得到一个包括所有终端的终端描述的扁平数组。由于每一个终端都是一个监听某个端口的TCP服务器,可以根据终端描述中的端口信息来判断不同的终端描述是否属于同一个终端,最终获得源服务器上终端的数量,此时反向代理服务器通过构建相同数量的TCP服务器来模拟源服务器所有的终端,接收客户端的连接请求,保存反向代理服务器的TCP服务器和源服务器的终端地址之间的映射关系,使得新连接到来时,反向代理服务器能够创建映射客户端连接正确的源服务器地址,从而完成转发。
S102、该OPC UA反向代理服务器接收客户端的连接请求,与客户端建立socket连接,同时创建映射客户端,映射客户端通过socket连接到对应地址的源服务器终端上。
在其中一个实施例中,反向代理服务器和真实客户端以及源服务器建立socket连接的方法包括:
监听反向代理服务器上所有TCP服务器的连接事件,在每个TCP服务器建立新连接事件的回调中新建映射客户端,选择与该TCP服务器对应的源服务器终端地址,建立映射客户端与该对应地址socket连接。
监听真实客户端和反向代理服务器socket、映射客户端与源服务器终端socket的生命周期,在其中一个socket意外关闭后,强制关闭另外一个socket连接,保证两个对应的socket连接生命周期的一致性,防止出现网络故障或者其他非正常断连问题导致转发异常的问题。
保存真实客户端与映射客户端之间的映射关系,这样在接收到真实客户端消息时能够准确找到映射客户端进行转发,在接收到源服务器消息时,也能通过对应连接转发给真实客户端。
S103、该OPC UA反向代理服务器接收真实客户端消息,通过反向代理服务端协议栈中的消息解析模块得到结构化消息,先后通过映射客户端协议栈中的消息替换模块、消息封装模块对结构化消息进行必要的信息替换,重新封装成二进制数据包,通过映射客户端的socket转发给源服务器。如果通信设置成非None模式,则还涉及密钥的派生以及消息的加密与解密。
在其中一个实施例中,代理服务器接收真实客户端消息并转发的方法包括:通过反向代理服务端的修改协议栈中的消息解析模块将真实客户端消息从二进制数据包编译成结构化消息;
通过映射客户端的修改协议栈的消息替换模块,根据请求类型对上一步得到的结构化消息进行特定的信息替换操作;
通过映射客户端的修改协议栈的消息封装模块,对上一步得到的修改的结构化消息进行封装,得到符合OPC UA规范的二进制数据包;
通过映射客户端的socket转发上一步得到的二进制数据包。
所述二进制流编译成结构化消息包括:1.建立一个空白的结构化对象,在下列步骤中解析出的信息都会保存到该对象中,解析完成后,会根据继承规则过滤掉不需要继承的信息,则该处理后的对象就是解析模块的结果:结构化消息。
2.在待处理的二进制流头部获取所属OPC UA数据包的类型,结束标志,长度。这三个信息在每种消息中都存在,且大小和位置都固定。根据长度信息计算出数据包的结束位置,可从待处理的二进制流开头截取到结束位置,得到指定长度的OPC UA二进制流;
3.进一步解析该二进制流中的消息内容,根据类型信息决定解析的步骤。
3.1如果类型为HEL,则剩余未解析的二进制流全都是消息内容;
3.2如果类型为其他,则先从二进制流中解析4B的数据为channelId。
3.2.1进一步解析安全头信息
3.2.1.1如果类型为OPN,按照非对称安全头的解析方式解析二进制流,得到非对称安全头的发送方证书,安全策略,接收方证书指纹信息,根据安全策略可以得到本次解析的解密以及验签方法,反向代理服务器私钥作为解密密钥,发送方证书中的公钥作为验签密钥,使用以上信息更新反向代理服务器解析模块和映射客户端封装模块的配置。
3.2.1.2如果类型为其他,按照对称安全头的解析方式解析二进制流,得到对称安全头的tokenId,取出tokenId对应的派生密钥,使用派生密钥中的解密和验签方法,解密密钥和验签密钥更新反向代理服务器解析模块和映射客户端封装模块的配置。
3.2.2进行可能的解密与验签操作,得到明文二进制流。首先检查解析模块配置中的安全模式
3.2.2.1如果处于未加密,则跳过该步;
3.2.2.2如果处于签名状态,则使用解析模块配置中的验签方法和验签密钥进行验证,完成之后移除二进制流中的签名
3.2.2.3如果处于签名且加密状态,则使用解析模块配置中的解密方法和解密密钥进行解密,完成之后移除二进制流中的padding,然后使用解析模块配置中的验签方法和验签密钥进行验证,完成之后移除二进制流中的签名。
3.2.3解析明文二进制流头部的序列号以及requestId,如果该序列号比解析模块配置中最后一个序列号大一,则继续解析,否则丢弃该数据包。
3.2.4如果结束标志为F,则剩余的明文二进制流为完整的消息内容;如果结束标志为C,则暂存剩余的明文二进制流到一个数组中,重复前面的所有步骤,得到该消息内容的所有二进制流,按存入顺序拼接即可得到完整的消息内容。
4.根据类型信息使用特定方法解析得到的完整消息内容,如果类型为HEL,则使用该类的构造函数解析;如果类型为其他,则进一步解析完整消息内容的头部,得到ExpandedNodeId信息,该信息解释了该完整消息内容属于哪种具体类型,使用ExpandedNodeId对应的构造函数解析剩余的消息内容。
5.解析结束,根据继承规则过滤结构化对象,得到结构化消息,并将其传入客户端的消息替换模块。
6.根据结构化消息内容更新配置。
6.1更新反向代理服务器解析模块配置中的最后一个序列号为本消息的序列号;
6.2如果消息类型为HEL,同时更新以下配置至反向代理服务器的解析模块与封装模块以及映射客户端的解析模块与封装模块:sendBufferSize、receiveBufferSize、maxMessageSize、maxMessageSize。
6.3如果消息类型为OPN,读取结构化消息的消息内容中的安全模式,将其更新至反向代理服务器的解析模块与封装模块以及映射客户端的解析模块与封装模块的配置中。所述根据消息类型进行替换操作包括:
读取结构化消息中的ExpandedNodeId属性,判断该消息类型:
若是OPN请求消息,替换结构化消息中的客户端证书为映射客户端的证书;
若是Discovery服务集的请求消息,替换结构化消息中的endpointUrl为源服务器上对应的终端地址;
若是CreateSession请求消息,替换结构化消息中的clientDescription,clientCertificate为映射客户端的信息,替换endpointUrl为源服务器上的对应的终端地址;
若是ActiveSession请求消息,根据定义计算clientSignature,替换结构化消息中的clientSignature;
所述将结构化消息封装成二进制数据包括:
1.根据结构化消息的类型自动更新映射客户端封装模块的配置如下:如果是OPN类型,则根据结构化消息中安全策略指定的加密和签名方法,以映射客户端私钥作为加密密钥,以源服务器证书中的公钥作为签名密钥,更新封装模块的对应配置;
如果是MSG类型,则根据结构化消息中的tokenId,从反向代理服务器的解析模块配置中取出保存的对应派生密钥,使用派生密钥中的加密和签名方法,真实客户端的对称加密密钥和签名密钥,更新封装模块的对应配置。
2.从结构化消息中获取消息内容以及可能存在的ExpandedNodeId,将完整的消息内容编译进二进制流中,等待封装。
3.按照映射客户端封装模块的配置计算出maxBodySize,拆分完整消息内容的二进制流为多个数据包的内容,不足maxBodySize的作为一个数据包内容。接下来就是封装所有的数据包内容。
4.根据映射客户端封装模块的配置中的安全模式决定是否加密和签名,调用配置中相应的方法和密钥进行。
5.添加头部信息,所有能够在结构化消息中找到的信息都应该直接继承过来,而不是由客户端封装模块生成,其余不可继承的信息都应该由客户端封装模块根据配置生成。
6.将封装好的所有数据包以二进制流的形式通过映射客户端的socket转发至源服务器。
S104、映射客户端接收源服务器消息,通过映射客户端协议栈中消息解析模块得到结构化消息,先后通过反向代理端协议栈中的消息替换模块、消息封装模块对结构化消息进行必要的信息替换,重新封装成二进制数据包,通过反向代理器的socket转发给真实客户端。如果通信设置成非None模式,则还涉及对称密钥的派生以及消息的加密与解密。
在其中一个实施例中,反向代理服务器接收源服务器消息并转发的方法包括:
通过映射客户端的修改协议栈中的消息解析模块将源服务器消息从二进制数据编译成结构化消息;
通过反向代理服务器的修改协议栈的消息替换模块,根据请求类型对上一步得到的结构化消息进行特定的信息替换操作;
通过反向代理服务器的修改协议栈的消息封装模块,对上一步得到的修改的结构化消息进行封装,得到符合OPC UA规范的二进制流;
通过反向代理服务器的对应socket转发上一步得到的二进制流。
图4是OPC UA反向代理器在加密模式下派生密钥的流程图。OPC UA的加密通信采用混合加密的方式,密钥协商阶段采用非对称加密,双方使用各自证书中的公钥进行加密,协商的目的是为了交换本次通讯的随机数,双方交换随机数完成之后,就可以通过伪随机数算法,传入服务端随机数,客户端随机数和商定的加密套件得到真实客户端消息的派生密钥,交换两个随机数位置再调用伪随机数算法,就可以得到另一套用于源服务端消息的派生密钥。派生密钥包括了加密和签名的算法,对称加密密钥以及签名密钥,还有一些其他验证信息。在通讯的过程中,客户端消息和服务端消息使用的不是同一套密钥,所以客户端和服务器都要保存两套密钥。在密钥的有效期内,通信的保密性都使用该派生密钥实现。由于代理服务器无法拿到客户端的私钥,也就无法解密服务器回复的随机数,所以其必须通过中间人的方式,与通信双方各自建立加密通信。OPC UA代理服务器派生密钥,实现加密模式下的解析与转发步骤如下:
步骤(1)、真实客户端通过GetEndpoints服务获取源服务器的终端描述;
所述的步骤(1)中源服务器终端描述中提供有客户端建立socket连接的url、服务器证书以及加密与签名的套件,获取终端描述的过程为非加密的模式;真实客户端通过GetEndpoints服务获取源服务器终端描述的步骤包括:
1-1.真实客户端在没有服务器证书的情况下,通过非加密的方式和反向代理服务器建立连接;
1-2.真实客户端在非加密连接的基础上发送GetEndpoints请求消息,代理服务器接收请求消息后,解析得到结构化消息,替换其中的终端地址为源服务器上对应的真实地址,封装修改替换后的结构化消息,通过映射客户端转发封装后的二进制数据;
1-3.源服务器返回包含终端描述列表的消息给映射客户端,映射客户端修改协议栈解析得到结构化消息,代理服务器修改协议栈替换结构化消息的列表中每条描述的终端地址和服务器证书,封装修改的结构化消息,通过对应socket转发封装后的二进制数据。
步骤(2)、真实客户端向选择的终端描述发送OpenSecureChannel(OPN)请求消息;
真实客户端准备的消息内容中携带有真实客户端本次通信的随机数以及真实客户端证书,消息内容使用刚才保存的反向代理服务器证书中的公钥加密,使用真实客户端私钥进行签名,真实客户端向反向代理服务器发送OPN请求消息。
步骤(3)、反向代理服务器接收请求并转发;
反向代理服务器接收到加密的OPN请求消息后,消息解析模块使用本服务器证书对应的私钥解密消息内容,使用真实客户端证书验证签名,得到OPN请求消息的结构化消息;从结构化消息的消息内容中取出客户端随机数,将其更新到反向代理服务端的消息解析模块以及映射客户端的消息解析模块的配置中;替换结构化消息中的客户端证书为映射客户端的证书,将修改替换的结构化消息使用映射客户端的消息封装模块封装,使用映射客户端私钥签名,源服务器证书公钥加密,通过映射客户端转发该OPN请求消息。
步骤(4)、反向服务器接收源服务器的回复消息并转发;
映射客户端接收源服务器的OPN回复消息,由于之前做了替换客户端证书操作,源服务器是使用映射客户端的公钥加密的,所以映射客户端的消息解析模块使用映射客户端私钥解密,使用源服务器证书公钥验证签名,得到OPN回复消息的结构化消息,从中取出源服务器本次通讯的随机数,回复内容不做处理,反向代理服务器的消息封装模块使用真实客户端证书公钥签名,反向代理服务器证书私钥加密,将经过封装后的二进制数据转发给真实客户端;此时代理服务器获取了双方的随机数以及加密套件,客户端、反向代理服务器以及源服务器都能推算出相同的两套派生密钥,将客户端派生密钥中的信息保存到反向代理服务器解析模块和映射客户端封装模块的配置中,将服务端派生密钥中的信息保存到反向代理服务器的消息封装模块和映射客户端的消息解析模块的配置中,用于之后对称加密的通信。
Claims (6)
1.一种支持加密模式的OPC UA反向代理服务器的实现方法,其特征在于:该方法实现的是OPC UA层面的代理服务器,依赖更少外部装置的同时能够实现加密模式的代理转发,具体包括以下步骤:
步骤1、根据配置的证书和获取的终端描述初始化该OPC UA反向代理服务器;
步骤2、该OPC UA反向代理服务器接收真实客户端的连接请求,与真实客户端建立socket连接,同时创建映射客户端,映射客户端通过socket连接到对应地址的源服务器终端上;
步骤3、该OPC UA反向代理服务器接收真实客户端消息,通过反向代理服务端协议栈中的消息解析模块得到结构化消息,先后通过映射客户端协议栈中的消息替换模块、消息封装模块对结构化消息进行必要的信息替换,重新封装成二进制数据,通过映射客户端的socket转发给源服务器;如果通信设置成非None模式,则还涉及密钥的派生以及消息的加密与解密;
步骤4、映射客户端接收源服务器消息,通过映射客户端协议栈中消息解析模块得到结构化消息,先后通过反向代理端协议栈中的消息替换模块、消息封装模块对结构化消息进行必要的信息替换,重新封装成二进制数据,通过反向代理器的socket转发给真实客户端;如果通信设置成非None模式,则还涉及密钥的派生以及消息的加密与解密。
2.根据权利要求1所述的支持加密模式的OPC UA反向代理服务器的实现方法,其特征在于所述的OPC UA协议栈实现模块包括:
消息解析模块用于统一处理所有类型的消息,实现二进制数据编译为结构化消息;
消息替换模块用于根据消息类型进行替换操作;
消息封装模块用于统一封装所有类型的消息,实现结构化消息编译为二进制数据;
所述的替换操作主要是读取结构化消息中的ExpandedNodeId属性,判断该消息类型:
①对于请求消息:
若是OPN请求消息,替换结构化消息中的客户端证书为映射客户端的证书;
若是Discovery服务集的请求消息,替换结构化消息请求体中的endpointUrl为源服务器上对应的终端地址;
若是CreateSession请求消息,替换结构化消息请求体中的clientDescription,clientCertificate为映射客户端的信息,替换endpointUrl为源服务器上的对应的终端地址;
若是ActiveSession请求消息,根据定义计算clientSignature,替换结构化消息请求体中的clientSignature;
②对于回复消息:
若是Discovery服务集的回复消息,替换结构化消息的消息内容中终端描述列表中每一项的服务器证书和终端地址为代理服务器上对应的数据;
若是CreateSession回复消息,替换结构化消息的消息内容中服务器证书,终端描述为代理服务器上对应的数据。
3.根据权利要求1所述的支持加密模式的OPC UA反向代理服务器的实现方法,其特征在于所述的密钥的派生方法如下:
步骤(1)、真实客户端通过GetEndpoints服务获取源服务器的终端描述;
步骤(2)、真实客户端向选择的终端描述发送OpenSecureChannel(OPN)请求消息;
步骤(3)、反向代理服务器接收请求并转发;
步骤(4)、反向服务器接收源服务器的回复消息并转发;
所述的步骤(1)中源服务器终端描述中提供有客户端建立socket连接的url、服务器证书以及加密与签名的套件,获取终端描述的过程为非加密的模式;真实客户端通过GetEndpoints服务获取源服务器终端描述的步骤包括:
1-1.真实客户端在没有服务器证书的情况下,通过非加密的方式和反向代理服务器建立连接;
1-2.真实客户端在非加密连接的基础上发送GetEndpoints请求消息,代理服务器接收请求消息后,解析得到结构化消息,替换其中的终端地址为源服务器上对应的真实地址,封装修改替换后的结构化消息,通过映射客户端转发封装后的二进制数据;
1-3.源服务器返回包含终端描述列表的消息给映射客户端,映射客户端修改协议栈解析得到结构化消息,代理服务器修改协议栈替换结构化消息的列表中每条描述的终端地址和服务器证书,封装修改的结构化消息,通过对应socket转发封装后的二进制数据。
4.根据权利要求3所述的支持加密模式的OPC UA反向代理服务器的实现方法,其特征在于所述的步骤(2)具体实现方法如下:
真实客户端准备的消息内容中携带有真实客户端本次通信的随机数以及真实客户端证书,消息内容使用刚才保存的反向代理服务器证书中的公钥加密,使用真实客户端私钥进行签名,真实客户端向反向代理服务器发送OPN请求消息。
5.根据权利要求3或4所述的支持加密模式的OPC UA反向代理服务器的实现方法,其特征在于所述的步骤(3)具体实现方法如下:
反向代理服务器接收到加密的OPN请求消息后,消息解析模块使用本服务器证书对应的私钥解密消息内容,使用真实客户端证书验证签名,得到OPN请求消息的结构化消息;从结构化消息的消息内容中取出客户端随机数,将其更新到反向代理服务端的消息解析模块以及映射客户端的消息解析模块的配置中;替换结构化消息中的客户端证书为映射客户端的证书,将修改替换的结构化消息使用映射客户端的消息封装模块封装,使用映射客户端私钥签名,源服务器证书公钥加密,通过映射客户端转发该OPN请求消息。
6.根据权利要求5所述的支持加密模式的OPC UA反向代理服务器的实现方法,其特征在于所述的步骤(4)具体实现方法如下:
映射客户端接收源服务器的OPN回复消息,由于之前做了替换客户端证书操作,源服务器是使用映射客户端的公钥加密的,所以映射客户端的消息解析模块使用映射客户端私钥解密,使用源服务器证书公钥验证签名,得到OPN回复消息的结构化消息,从中取出源服务器本次通讯的随机数,回复内容不做处理,反向代理服务器的消息封装模块使用真实客户端证书公钥签名,反向代理服务器证书私钥加密,将经过封装后的二进制数据转发给真实客户端;此时代理服务器获取了双方的随机数以及加密套件,客户端、反向代理服务器以及源服务器都能推算出相同的两套派生密钥,将客户端派生密钥中的信息保存到反向代理服务器解析模块和映射客户端封装模块的配置中,将服务端派生密钥中的信息保存到反向代理服务器的消息封装模块和映射客户端的消息解析模块的配置中,用于之后对称加密的通信。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211650623.4A CN115941178A (zh) | 2022-12-21 | 2022-12-21 | 一种支持加密模式的opc ua反向代理服务器的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211650623.4A CN115941178A (zh) | 2022-12-21 | 2022-12-21 | 一种支持加密模式的opc ua反向代理服务器的实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115941178A true CN115941178A (zh) | 2023-04-07 |
Family
ID=86552125
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211650623.4A Pending CN115941178A (zh) | 2022-12-21 | 2022-12-21 | 一种支持加密模式的opc ua反向代理服务器的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115941178A (zh) |
-
2022
- 2022-12-21 CN CN202211650623.4A patent/CN115941178A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11122018B2 (en) | Secure end-to-end transport through intermediary nodes | |
CN107018134B (zh) | 一种配电终端安全接入平台及其实现方法 | |
US7036010B2 (en) | Method and apparatus for a secure communications session with a remote system via an access-controlling intermediate system | |
RU2554532C2 (ru) | Способ и устройство для безопасной передачи данных | |
CN111447276B (zh) | 一种具有密钥协商功能的加密续传方法 | |
JP5640226B2 (ja) | 第1ドメインのクライアントと第2ドメインのサーバとの間でセキュアな通信チャネルを確立するための装置、方法およびプログラム | |
CN111756529B (zh) | 一种量子会话密钥分发方法及系统 | |
WO2019178942A1 (zh) | 一种进行ssl握手的方法和系统 | |
CN113904809B (zh) | 一种通信方法、装置、电子设备及存储介质 | |
CN112422560A (zh) | 基于安全套接层的轻量级变电站安全通信方法及系统 | |
CN112929166B (zh) | 一种基于Modbus-TCP协议的主站、从站及数据传输系统 | |
CN115567209A (zh) | 采用透明代理和量子密钥预充注实现VoIP加解密方法 | |
CN115834026A (zh) | 一种基于工业协议的安全加密方法 | |
CN114142995A (zh) | 面向区块链中继通信网络的密钥安全分发方法及装置 | |
KR20140091221A (ko) | 웹 보안 프로토콜에 따른 암호화 데이터를 복호화하는 보안 장치 및 그것의 동작 방법 | |
CN110892695A (zh) | 在建立连接期间检查受密码保护的通信连接的连接参数的方法、设备和计算机程序产品 | |
CN115941178A (zh) | 一种支持加密模式的opc ua反向代理服务器的实现方法 | |
CN113765900A (zh) | 协议交互信息输出传输方法、适配器装置及存储介质 | |
CN115567195A (zh) | 安全通信方法、客户端、服务器、终端和网络侧设备 | |
CN111614688A (zh) | 区块链的通用协议 | |
CN118250016B (zh) | 一种物联网设备的tcp私有协议通信认证方法 | |
CN115001705B (zh) | 一种基于加密设备的网络协议安全提升方法 | |
CN115967717B (zh) | 基于中继集群的通信方法和装置 | |
CN116827692B (zh) | 安全通信方法和安全通信系统 | |
Mackinnon et al. | Overview of internet protocol security |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |