1. gzyueqian
      18529173453
      首頁 > 新聞中心 > > 正文

      基于MatrixSSL的嵌入式系統(tǒng)中SSL協(xié)議實現(xiàn)

      更新時間: 2007-06-06 13:59:24來源: 粵嵌教育瀏覽量:675

        摘  要:MatrixSSL是針對小型應(yīng)用程序和設(shè)備設(shè)計的嵌入式、開放源碼SSL協(xié)議棧,通過它可在嵌入式環(huán)境中實現(xiàn)可訂制的嵌入式SSL安全解決方案。

        關(guān)鍵字:安全套接字;MatrixSSL;嵌入式系統(tǒng)

      1引言

        在過去幾年里Internet和嵌入式技術(shù)發(fā)展迅速,Internet在服務(wù)器、桌面機(jī)和包括PDA和小型電話的便攜式電腦上應(yīng)用迅速增長。隨著更簡單、資源更受限制連接到WEB的設(shè)備(探測器、家居設(shè)備、個人醫(yī)療設(shè)備)數(shù)量增長,這種趨勢將會繼續(xù)。具有傳感和通信功能的嵌入式設(shè)備將計算機(jī)技術(shù)應(yīng)用于今天不尋常的設(shè)備(現(xiàn)場監(jiān)控,醫(yī)療緊急響應(yīng)、戰(zhàn)場管理和家居自動化)中變成可能。這些嵌入式應(yīng)用都具有安全需要,沒有足夠的安全,攻擊者可以控制這些嵌入式設(shè)備并引發(fā)災(zāi)難性的反應(yīng)。

        SSL[1]是今天在Internet上的安全協(xié)議,它內(nèi)建于很多流行的應(yīng)用程序里,包括所有的WEB瀏覽器,并且廣泛被信任用于加強(qiáng)敏感信息傳輸包括:在線銀行,證券交易和電子商務(wù)。SSL 采用數(shù)字證書、對稱/ 非對稱密鑰加密、消息摘要和數(shù)字簽名等技術(shù)提供身份認(rèn)證、數(shù)據(jù)保密、數(shù)據(jù)完整性三大安全服務(wù),可以為嵌入式系統(tǒng)提供一個完善的安全解決方案。但現(xiàn)有大多數(shù)SSL協(xié)議實現(xiàn)都沒有針對嵌入式系統(tǒng),不適合于嵌入式Internet要求。

        MatrixSSL[3]是針對小型應(yīng)用程序和設(shè)備設(shè)計的嵌入式、開放源碼SSLv3協(xié)議棧(商業(yè)版支持TLS協(xié)議)。它減少了將SSL整合進(jìn)嵌入式工程的復(fù)雜性,使用一個簡單的API和安全層,用戶可以很容易地將MatrixSSL整合到它們的應(yīng)用程序。Matrixssl使用工業(yè)界標(biāo)準(zhǔn)的加密算法(RC4、DES3、AES、RSA)和協(xié)議,它確保用戶獲得一個編譯不到50K(Openssl[2]需要1M左右)的提供強(qiáng)大和可靠安全解決方案的庫函數(shù),并具有可插拔密碼套件、算法和可移植性強(qiáng)等特點,可以方便定制密碼套件和算法以及平滑地向多平臺移植,非常適合在資源受限的嵌入式環(huán)境中使用。

      2 MatrixSSL程序流程

        MatrixSSL庫函數(shù)沒有針對某一具體的傳輸協(xié)議,它采用公共API方式可以非常理想的保護(hù)傳輸于任何虛擬通信通道上的數(shù)據(jù),不但可用在TCP/IP上也可用于串口通信上,但主要的MatrixSSL整合用于保護(hù)在TCP套接字上計算機(jī)系統(tǒng)間的數(shù)據(jù)。由于MatrixSSL庫函數(shù)沒有專門針對TCP/IP,在使用時需要對公共API進(jìn)行封裝以滿足在具體傳輸層上的需要。MatrixSSL提供了對公共API封裝的一個套接字實例(可根據(jù)需要自行對公共API進(jìn)行封裝),通過調(diào)用封裝的套接字API接口可以非常容易地實現(xiàn)SSL協(xié)議。下面將按照封裝API套接字在應(yīng)用程序中整合點來分析它們:

        1)初始化MatrixSSL庫函數(shù)

        在使用Matrixssl前需要對協(xié)議進(jìn)行初始化,調(diào)用公共API實現(xiàn)對庫函數(shù)初始化:
        int matrixSslOpen();//初始化庫函數(shù)數(shù)據(jù)結(jié)構(gòu)
        int matrixSslReadKeys(sslKeys_t **keys, char *certFile, char *privFile,
        char *privPass, char *trustedCAcertFiles);// 加載相關(guān)的證書和私鑰文件

        2)創(chuàng)建SSL會話連接

        在初始完畢后,就可以創(chuàng)建會話和握手過程,Matrixssl將這兩個功能在客戶端和服務(wù)器端的一個封裝函數(shù)中完成??蛻舳耸褂胹slConnect替代原始的Connect完成SSL握手過程,并制定對服務(wù)器端證書的驗證方式:
        int sslConnect(sslConn_t **cp, SOCKET fd, sslKeys_t *keys, sslSessionId_t *id,
        short cipherSuite, int (*certValidator)(sslCertInfo_t *t, void *arg));

        服務(wù)器端用sslAccept函數(shù)代替?zhèn)鹘y(tǒng)的Accept函數(shù)完成握手過程,并制定對客戶端證書的驗證方式:
        int sslAccept(sslConn_t **cp, SOCKET fd, sslKeys_t *keys,int (*certValidator)(sslCertInfo_t *t, void *arg), int flags);

        3)進(jìn)行數(shù)據(jù)傳輸

        在握手完成后,就可以進(jìn)行安全的數(shù)據(jù)傳輸了。在數(shù)據(jù)傳輸階段,需要使用sslRead和sslWrite函數(shù)代替?zhèn)鹘y(tǒng)的read()和write()函數(shù),完成對套接字的讀寫操作:
        int sslRead(sslConn_t *cp, char *buf, int len, int *status);
        int sslWrite(sslConn_t *cp, char *buf, int len, int *status);

        4)結(jié)束SSL通信

        當(dāng)客戶機(jī)和服務(wù)器之間完成數(shù)據(jù)通信后,調(diào)用下面函數(shù)來釋放SSL資源:
        void sslWriteClosureAlert(sslConn_t *cp);//發(fā)出關(guān)閉連接的警告
        void sslFreeConnection(sslConn_t **cpp)//關(guān)閉由握手過程中打開的會話并釋放緩沖區(qū)
        void matrixSslFreeKeys(sslKeys_t *keys); // 釋放創(chuàng)建的密鑰
        void matrixSslClose();//清除Matrixssl庫函數(shù)

        MatrixSSL對普通網(wǎng)絡(luò)編程接口也進(jìn)行了封裝,方便了編程調(diào)用,以下是封裝的普通網(wǎng)絡(luò)編程接口(也可直接調(diào)用網(wǎng)絡(luò)編程接口而不封裝):
        SOCKET socketListen(short port,int *err) // 創(chuàng)建一個新的套接字并綁定到給定端口
        SOCKET socketAccept(SOCKET listenfd, int *err);// 為到來的請求創(chuàng)建一個套接字
        SOCKET socketConnect(char *ip, short port, int *err);// 創(chuàng)建一個新的套接字并且連接到給定IP和端口的監(jiān)聽套接字
        Void socketShutdown(SOCKET sock);// 關(guān)閉一個套接字
        void setSocketBlock(SOCKET sock);// 設(shè)置一個套接字為阻塞模式
        void setSocketNonblock(SOCKET sock);// 設(shè)置一個套接字為非阻塞模式
        void setSocketNodelay(SOCKET sock);//在套接字上設(shè)置NO_DELAY選項,禁止Nagle 算法

      3 MatrixSSL實例程序

        1證書的生成

        與普通的網(wǎng)絡(luò)通信應(yīng)用程序不同,基于Matrixssl的程序運行時需要相應(yīng)的證書和私鑰文件實現(xiàn)對客戶端和服務(wù)器端的身份驗證。Matrixssl提供對Openssl格式證書的支持,證書和私鑰可以由Openssl應(yīng)用程序生成。以下是一個證書的生成過程:

        1) 創(chuàng)建一個CA證書的私鑰和自簽署CA證書
        生成由DES3加密的RSA私鑰文件:OpenSSL genrsa -des3 -out CA.key 1024
        使用CA的私鑰創(chuàng)建一個自簽署的CA證書:OpenSSL req -new -x509 -days 365 -key CA.key -out CA.crt
        2)為服務(wù)器端創(chuàng)建由CA簽署的證書
        生成服務(wù)器的RSA私鑰文件:OpenSSL genrsa -des3 -out server.key 1024
        生成服務(wù)器的證書請求文件:OpenSSL req -new -key server.key -out server_auth.csr
        生成由CA簽署的服務(wù)器證書文件:OpenSSL x509 -req -days 365 -in server_auth.csr -CA CA.crt -CAkey CA.key -CAcreateserial -out server_auth.cert
        3)為客戶端創(chuàng)建由CA簽署的證書
        創(chuàng)建過程與服務(wù)器證書生成過程同。

        2 應(yīng)用程序?qū)嵗?br />
        以下是一個簡單的基于MatrixSSL的應(yīng)用程序,說明如何使用封裝的套接字在嵌入式系統(tǒng)中實現(xiàn)一個安全的WEB服務(wù)器,該程序使用MatrixSSL1.2.4庫函數(shù)。在Linux下實現(xiàn)過程為:
        #include <stdlib.h>
        #include <stdio.h>
        #include <string.h>
        #include sslSocket.h
        #define HTTPS_PORT 8001
        static char keyfile[] = server.key;
        static char certfile[] = server_auth.cert;
        static char CAfile[] = CA.crt;
        static const char page[] = HTTP/1.0 200 OK
          Content-type: text/html
        
          <html><head><title>this is MicroComputer information</title></head>
                <body>This is MicroComputer information</body></html> ;
        int main(int argc, char **argv)
        {
         sslConn_t  *cp;
         sslKeys_t  *keys;
         SOCKET   listenfd, fd;
         unsigned char buf[1024];
         int ret,status,err,flags;
         flags = 0;
            char *password;
         password=immortalluo;
         cp = NULL;
        if (matrixSslOpen() < 0) {
          fprintf(stderr, matrixSslOpen failed, exiting...);
         }  //初始化庫函數(shù)
         if (matrixSslReadKeys(&keys, certfile, keyfile, password, CAfile) < 0)  {
          exit(0);
         }  //從磁盤文件中讀取證書和相關(guān)的密鑰資料,并使用密碼對加密的私鑰解密
          if ((listenfd = socketListen(HTTPS_PORT, &err)) == INVALID_SOCKET) {
          exit(1);
         }  //在特定的端口上監(jiān)聽客戶端的請求
              setSocketBlock(listenfd);   //將套接字設(shè)置為阻塞模式
          while(1){
        if ((fd = socketAccept(listenfd, &err)) == INVALID_SOCKET) {    continue;  } //接受一個客戶端的請求
         if ((ret = sslAccept(&cp, fd, keys, NULL, flags)) != 0) {
           socketShutdown(fd);
           continue;  }//完成握手過程
         ret = sslRead(cp, buf, 1024, &status); //讀取客戶端的請求
         if (ret < 0 || status == SSLSOCKET_EOF ||status == SSLSOCKET_CLOSE_NOTIFY){
                 socketShutdown(cp->fd);
                 sslFreeConnection(&cp);
                 continue;  }    //判斷客戶端是否請求關(guān)閉
            ret = sslWrite(cp, page,(int)strlen(page), &status);  //向客戶端發(fā)送靜態(tài)網(wǎng)頁
         if (ret < 0) {
         socketShutdown(cp->fd);
         sslFreeConnection(&cp);
         continue;}
         sslWriteClosureAlert(cp); //向客戶端發(fā)送關(guān)閉警告
         socketShutdown(cp->fd);
         sslFreeConnection(&cp);
           }
         socketShutdown(listenfd);
         matrixSslFreeKeys(keys);
         matrixSslClose();
        }

      4 結(jié)束語

        Matrixssl是一個可定制的小型SSL函數(shù)庫,具有可移植、可擴(kuò)展、可裁減的特點,充分滿足了嵌入式環(huán)境小、特、專、精的特點非常適合在嵌入式系統(tǒng)中提供安全解決方案;但是Matrixssl只支持RSA共鑰加密,考慮到效率因素,可在Matrixssl中實現(xiàn)更適合嵌入式環(huán)境的ECC公鑰加密體制,這是下一步研究目標(biāo)。

      參考文獻(xiàn):

      1 SSL 3.0 Specification[EB/OL]. http://wp.netscape.com/eng/ssl3/
      2 OpenSSL. The Open Source Toolkit for SSL-TLS[EB/OL]. http://www.openssl.org/
      3 PeerSec Networks,“MatrixSSL-Open Source EmbeddedSSL”[EB/OL], http://www.matrixssl.org/

      免費預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 偷怕自怕视频在线观看 | 在线观看午夜福利院视频 | 亚洲欧美日本在线观看 | 亚洲中文字幕在线观看视频 | 最新国产自产视频在线观看 | 中国精品久久久久国产 |