基于OpenSSL的信息安全RTU的设计与实现

供稿:北京中油瑞飞信息技术有限责任公司

  • 关键词:OpenSSL,RTU
  • 摘要:文中给出了一种基于OpenSSL的信息安全RTU的设计与实现。首先介绍了SSL和OpenSSL,然后给出了基于OpenSSL的信息安全RTU的总体设计方案,并结合自身项目,详细介绍了其设计与实现过程,该RTU可以达到相对较高的安全通信要求。

基于OpenSSL的信息安全RTU的设计与实现

摘要:随着信息化程度的快速发展,工业现场的安全通信越来越受到重视,文中给出了一种基于OpenSSL的信息安全RTU的设计与实现。首先介绍了SSL和OpenSSL,然后给出了基于OpenSSL的信息安全RTU的总体设计方案,并结合自身项目,详细介绍了其设计与实现过程,该RTU可以达到相对较高的安全通信要求。

关键字:OpenSSL;嵌入式系统;RTU;安全

1        引言

随着计算机应用的不断深入,特别是信息化与工业化深度融合及物联网技术的快速发展,许多嵌入式网络设备诸如RTU正被一批批的开发出来。

RTU英文全称Remote Terminal Unit,中文全称为远程终端单元,通过自身的软件系统,实现调度系统对生产现场的遥测、遥控、遥调和遥信等功能;是组成工业控制数据采集与监视控制系统的细胞单元,在工业控制领域有着非常广泛的应用。

随着网络技术的飞速发展,具备快速的响应能力、开放式的通信协议和平台的网络化RTU已经成为目前市场上的主流工业控制产品之一,而安全性一直是通信网络中最大的问题之一。目前在工业控制现场应用的RTU控制器与SCADA(数据采集与监视控制系统)组态软件之间一般采用明文方式进行数据交互,这种开放式的通信方式存在重大的安全隐患,即传输的通讯报文非常容易被第三方监听、截取和伪造,一旦发生这种情况,对生产效益将会产生不可估量的损失。世界范围内继“震网”病毒事件后又接连发生的几起重大的工业网络安全事件,将工业网络安全推向了一个新的高度。如何防微杜渐,防止工业控制系统安全事件的再次发生,在重点能源企业构筑安全的工业控制系统,已经成为政府和企业关注的热点。

信息安全型RTU控制器不但可以实现对工业控制现场数据的采集及处理功能,同时在数据传输前进行加密,拒绝那些来自未授权用户的访问,从而有效杜绝由于信息泄露或非法侵入导致的工业安全隐患。


图1-1 信息安全RTU与传统RTU对比图

目前密码编码算法按秘钥使用方法分为对称密码算法和非对称密码算法,以及不需要秘钥的信息摘要算法,要实现这些算法及相应的协议,工作量是非常巨大的,作为工程实现,通常采用现存的一些密码算法软件包来实现二次开发。OpenSSL[1]为开发密码安全平台提供了丰富的密码算法接口,可以安全高效的实现信息安全RTU。文章将讨论使用OpenSSL与数字证书,给出信息安全RTU进行远程安全通信的总体设计方案,并详细介绍信息安全RTU的设计及实现过程。

2        SSL与OpenSSL

1    

2    

2.1   SSL协议

SSL协议[1],即 安全套接层 ( Secure Sockets Layer) 协议,是 Netscape公司推出的为网络应用层的通信提供认证、数据保密和数据完整性服务的一种安全通信协议。 SSL协议建立在可靠的TCP 传输控制协议之上,在网络模型中位于应用层和传输层之间,并且与上层协议无关,各种应用层协议( HTTP,FTP,TELNET 等) 都能通过 SSL 协议进行透明传输。SSL 协议分为握手协议和记录协议,握手协议是指在数据传输前,服务器与客户端进行身份鉴别,同时协商决定采用的协议版本、加密算法等。每次连接,握手协议都要建立一个会话,且每次握手中产生的对称秘钥都是独特的,这种每次更换秘钥的方法在更大程度上保证了通信的安全性。记录协议是指对要传输的信息用协商好的对称秘钥加密后,再通过TCP/IP的连接将信息发送出去。

SSL协议提供的安全连接具有以下三个基本特点[2-3]

(1)  连接是保密的:对于每个连接都有一个唯一的会话密钥,采用对称密码体制( 如 DES、RC4等) 来加密数据。

(2)  连接是可靠的:消息的传输采用 MAC 算法( 如MD5、SHA 等) 进行完整性检验。

(3)  双方是可信任的:对端实体的鉴别采用非对称密码体制( 如 RSA、DSS 等) 进行认证。

2.2   OpenSSL

OpenSSL是一个健全的、全开放的和开放源代码的软件包,最早由Eric A. Yang和Tim J.Hudson开发;到目前为止,OpenSSL已经实现了对安全套接层SSLV2.0/ V3.0和传输安全协议TLS V1.0的支持[4]。与其它的一些同类型密码库(如Crypto++、Crypto API等)相比,OpenSSL具有以下优点:

(1)  采用C语言开发,支持多种操作系统(Linux、BSD、Windows、Mac、VMS等),可移植性好。

(2)  功能全面,密码库支持的密码算法丰富,如对称密码算法:AES、DES、CAST、IDEA、RC4等;非对称密码算法:DH算法、RSA算法、DSA算法和椭圆曲线算法;信息摘要算法:MD2、MD5、SHA-1和RIPEMD;另外,OpenSSL软件包还提供了丰富的秘钥和证书管理功能以及用来进行加密模块扩展的引擎机制。

(3)  OpenSSL提供了CA等用于生成各种X.509证书(网络通信中标志服务方实体的身份,含有服务方的公开秘钥)、秘钥文件的命令,方便程序的编写和调试。

(4)  源代码开放,能够根据自己的需要选择不同的软件版本进行修改和移植。

3        基于OpenSSL的信息安全RTU的总体设计

3    

3.1   信息安全RTU硬件平台设计


图3-1 信息安全RTU核板框图

本文采用的系统硬件平台是由北京中油瑞飞信息技术有限责任公司自主研发的一款RTU产品,分为核板和底板两个部分。核板采用Atmel AT91SAM9X25为微处理器,并采用专业稳定的内核电源芯片和外部看门狗复位芯片来保证系统运行的稳定性,CPU主频为400MHz,采用128M的DDR2作为内存设备,RTU的Flash存储为128M的Nand Flash,RTU核板资源框图如图3-1所示。

底板接口和资源方面:1路10/100M以太网RJ-45接口,4路串行接口,1路CAN接口,1路ZigBee无线接口,8路AI和DI接口,4路AO和DO接口等。RTU底板接口及资源框图如图3-2所示。


图3-2 信息安全RTU底板接口及资源框图

除上述通用资源外,信息安全RTU采用硬件引擎加密机制(一种替换掉OpenSSL的底层加密模块的加密机制)[5],如3-2图所示,硬件加密模块采用工业级带有安全主控芯片的SD卡。加密芯片高速数据总线接口,除了支持国际通用加密算法AES、DES、RSA、SHA外,还支持SM2算法,这就在保证数据吞吐率的同时增强信息加密的强度和灵活性。

3.2   基于OpenSSL的信息安全RTU的系统软件设计

整个安全信息传输系统包括三个部分:服务端,由基于OpenSSL的信息安全RTU充当;客户端,由安装SCADA软件的电脑充当;加密机代理,由安装Linux系统的加密机充当。整个加密系统的构成如图3-3所示:


图3-3 安全信息传输系统组成图

在整个安全信息传输系统中,信息安全RTU和加密机之间采用的是SSL安全连接的信息传输,而SCADA客户端与加密机之间采用的是直连,这是因为RTU与加密机之间的信息处于公网内,明文传输容易被第三方恶意监听、截取和伪造,加密机与SCADA系统处于公司内网中,安全性得到保证。

该系统中,信息安全RTU主要实现加密机代理的身份认证、与代理的信息传输、和底层数据的采集,其中加密机的身份认证和与加密机的信息交互为信息安全RTU实现的重点。

基于OpenSSL的信息安全RTU的软件结构分为以下四个层次:

(1)    引导加载程序Bootloader

Bootloader是嵌入式系统在上电后执行的第一段代码,这段程序在完成CPU和相关硬件的初始化后,再将操作系统映像拷贝到内存中然后跳转到操作系统所在的空间,启动操作系统,本文采用的是bootstrap+uboot作为第一层引导加载程序。

(2)    经剪裁、移植的Linux内核

Linux内核包含着所有操作系统的核心功能和网络协议栈,是Linux操作系统的心脏,本文设计的信息安全RTU采用的是经剪裁的2.6.39版本的Linux内核。

(3)    文件系统

文件系统包括根文件系统和建立于Flash设备上的文件系统。嵌入式Linux启动时,第一个挂载的是根文件系统,根文件系统中包含了特定的目录下不同名称、不同用途的文件。

(4)    用户应用程序

用户自己开发的运行于嵌入式Linux操作系统之上的计算机程序,包括自定义协议栈、web服务器等。信息安全RTU开发的应用程序包括基于OpenSSL的服务端与加密机通信程序、本地模拟量与数字量采集控制程序、串口Modbus程序等。

上述4个层次中,前3个是信息安全RTU平台的搭建,第4个层次是基于OpenSSL的信息安全RTU功能实现的重点。

4        OpenSSL握手、数据传输的具体实现

在整个系统中,信息安全RTU与加密机代理的通信流程如图4-1所示,其中步骤1-13为SSL的握手阶段,完成代理与服务端的双向认证、加密算法的协商、秘钥的确定。这13条消息可以分为4个阶段:

第1阶段是加密机代理向信息安全RTU服务端发送一个连接请求Client Hello,其中包含了加密机的SSL协议版本号、随机数key和准备使用的加密算法。

第2阶段是RTU服务端收到加密机代理的连接请求后向代理发送自己的SSL协议版本号、加密算法的种类,随机数key,自身SD卡硬件证书以及代理的证书请求。

第3阶段是代理收到服务端发送的信息后,会验证服务端的合法性,包括:证书是否过期、发行服务器证书的CA是否可靠、服务器证书上的域名是否和服务器的实际域名相匹配等。如果合法性验证没有通过,通讯将断开,如果合法性验证通过,加密机代理会随机产生一个对称秘钥key,并用提取的服务器公钥对其进行加密,然后产生一个随机数,并数字签名,最后将签名的随机数、代理自己的证书和加密的对称秘钥key发给服务器,并向服务端发出信息,指明后面的数据通讯将采用该对称秘钥作为通信秘钥,同时通知服务端代理握手过程结束。

第4阶段信息安全RTU服务端对代理发送来的证书和签名随机数进行合法性检验,如果检测没有通过,通讯立即中断,如果验证通过,服务端用私钥解密代理发送来的对称秘钥,并向代理发送信息,指明后面的数据通讯使用该对称秘钥,同时通知代理服务端握手过程结束。


图4-1 信息安全RTU与加密机代理通信流程图

握手过程结束后,加密机代理与信息安全RTU端将进行应用数据的传输,直至此次通话结束。

基于OpenSSL的信息安全RTU为实现SSL通信软件各个模块的设计及关系如图4-2所示,信息安全RTU服务端在接收到加密机代理的请求后,会判断该请求是否为已连接且为未断开的请求,如果是,则启用会话重用模块,而不需要重新握手建立连接,这种方式会节省不必要的开销,提高通讯效率;如果该请求是新的连接请求,则需要建立SSL连接。


图4-2 基于OpenSSL的信息安全RTU的SSL通信中各模块关系图

SSL连接过程需要用到三个模块:SSL初始化模块、SSL连接模块和SSL身份验证模块;SSL密码组控制模块用于RTU与加密机通信密码的选择与控制,加密机代理可以通过修改密码来保证通信的安全;SSL通信模块用于RTU与加密机建立SSL连接后双方的数据传输。下面详细介绍SSL初始化、SSL接收连接和数据传输。

1)       SSL初始化

首先要初始化OpenSSL的函数库,通过函数SSL_library_init()来实现,然后调用SSL_load_error_string()函数,可以将错误码转换成字符串。

接着创建SSL上下文, 信息安全RTU采用的是硬件引擎加密机制,首先要初始化硬件加密模块,通过调用ENGINE_load_sdkey()函数实现这一功能,该函数中会完成硬件加密模块SD卡中的加解密算法库替换OpenSSL中的软加解密算法库等一系列工作。然后调用SSL_METHOD *meth=SSLv23_server_method()函数用来初始化SSL支持的版本;SSL_CTX *ctx=SSL_CTX_new(meth)函数用来创建SSL_CTX数据结构,该结构体主要用于准备SSL握手前的环境,包括CA证书、服务端的证书、私钥、协议版本号等,然后通过调用各功能函数实现该数据结构的初始化。

上文提到,RTU服务端需要认证加密机代理,所以需要加入请求代理认证的内容,调用函数SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL)实现,参数SSL_VERIFY_PEER需要进行代理认证,SSL_VERIFY_FAIL_IF_NO_PEER_CERT表示如果客户端不提交证书则SSL连接过程立刻终止。

2)       SSL接受连接

RTU端在收到加密机代理发出的连接请求后,RTU端就会创建SSL对象来对应一条SSL连接,SSL对象并不是直接附加到套接字上,而是通过中间层BIO对象来实现的[6];SSL对象附加到BIO对象上,然后BIO对象实现与套接字实现通信。这样使得SSL对象的实现不仅局限于网络套接字,还可以用于实现串口等。信息安全RTU中实现方法为:ssl = SSL_new(ctx),创建SSL对象;SSL_set_fd(ssl, ucSocket)实现SSL对象与BIO对象以及BIO对象与套接字的绑定;err = SSL_accept(ssl)实现与代理的握手过程,包括双方的互相认证、秘钥的协商等,如果握手成功,返回1,SSL连接成功建立成功,可以开始进行数据传输。如果失败,可以通过检查返回值来确定连接错误的原因。

信息安全RTU端与加密机代理的SSL连接建立成功后,SSL对象和套接字作为一个数据结构保存到会话重用模块中,只要SSL连接不中断,RTU与加密机通信都是通过调用会话重用模块进行通信的。

3)       数据传输

信息安全RTU与加密机代理通信交互时,发送数据用函数SSL_write(ssl,buffer, length),接收函数用函数SSL_read(ssl, buffer, length),与系统函数read和write基本一致,只是第一个参数变为SSL对象。

最后,通信完成后,要终止SSL连接,释放资源,调用SSL_free(ssl)来释放SSL对象,调用SSL_CTX_free (ctx)来释放CTX环境对象。

5        总结

本文从发展迅速的信息化工业现场出发,讨论了当今工业现场中RTU在通信中存在的安全隐患,为解决这一问题,设计并实现了基于OpenSSL的信息安全RTU,并详细介绍了该RTU的总体设计方案及OpenSSL握手、数据通信的具体实现,文中设计的这款信息安全RTU适用于需要安全通信的工业现场。

























参考文献:

[1]    Bruce Schneider. 应用密码学[ M ] .北京:机械工业出版社, 2000

[2]    W.Chou.Accelerating securetransactions.IT Professional,2003,2:37

[3]    Nachiketh, Potlapally,S Ravi.AStudy of the Energy Consumption Characteristics of Cryptographic Algorithms andSecurity Protocols. IEEE TRANSACTIONS ON MOBILE COMPUTION, 2006, 5(2):128

[4]    Dierks T, Allen C. The TLSProtocol Version 1.0[S] IET FRFC2246, 1999.

[5]    齐洪喜,周大水 . 基于 OpenSSL 的安全密码平台的设计与实现[J]. 计算机工程与设计,2007,28(2):314-315,319.

[6]    Rescorla E. SSL与TLS Designing and Building Secure Systems[M] . 崔凯译北京:中国电力出版社, 2002


发布时间:2015年9月14日 11:52  人气:   审核编辑(李晨晖)
相关链接

我有需求