自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Stunnel:用途廣泛的SSL加密封裝器

安全 數(shù)據(jù)安全
有一種方法可以將加密功能無(wú)縫添加到網(wǎng)絡(luò)連接中,而不會(huì)將您原來(lái)的代碼段基址搞亂。Stunnel 是一個(gè)程序,可以使用 OpenSSL 庫(kù)對(duì)任意 TCP 會(huì)話(huà)進(jìn)行加密。它作為服務(wù)器運(yùn)行在程序外部。

stunnel用來(lái)對(duì)遠(yuǎn)程客戶(hù)端和本地機(jī)(可啟動(dòng)inetd的:inetd-startable)或遠(yuǎn)程服務(wù)器間的SSL加密進(jìn)行封裝。它可以在不修改任何代碼的情況下,為一般的使用inetd daemon的POP2、POP3和IMAP服務(wù)器添加SSL功能。它通過(guò)使用OpenSSL或SSLeay庫(kù)建立SSL連接。

下載鏈接:http://down.51cto.com/data/157863

>>去網(wǎng)絡(luò)安全工具百寶箱看看其它安全工具

有一種方法可以將加密功能無(wú)縫添加到網(wǎng)絡(luò)連接中,而不會(huì)將您原來(lái)的代碼段基址搞亂。Stunnel 是一個(gè)程序,可以使用 OpenSSL 庫(kù)對(duì)任意 TCP 會(huì)話(huà)進(jìn)行加密。它作為服務(wù)器運(yùn)行在程序外部。Stunnel 服務(wù)器主要執(zhí)行兩個(gè)功能:一,首先,接收未加密的數(shù)據(jù)流,進(jìn)行 SSL 加密,然后將其通過(guò)網(wǎng)絡(luò)發(fā)送;二,對(duì)已進(jìn)行 SSL 加密的數(shù)據(jù)流進(jìn)行解密,并將其通過(guò)網(wǎng)絡(luò)發(fā)送給另一個(gè)程序(該程序通常駐留在同一機(jī)器上,以避免本地網(wǎng)絡(luò)上的窺探攻擊)。

這樣,在必要時(shí),您就可以很容易地運(yùn)行未加密的程序,當(dāng)您想要“嗅探”網(wǎng)絡(luò),看看到底有什么東西正在通過(guò)網(wǎng)絡(luò)時(shí),這一點(diǎn)很有用。

即使您是一個(gè)系統(tǒng)管理員,而不是一個(gè)開(kāi)發(fā)者,Stunnel 對(duì)您來(lái)說(shuō)也是一個(gè)強(qiáng)大的武器,因?yàn)樗梢韵虿粏⒂?SSL 的服務(wù)器端軟件添加 SSL。例如,我已經(jīng)使用 Stunnel 來(lái)保護(hù) POP、SMTP 和 IMAP 服務(wù)器。唯一不太盡人意的地方是要使用這些服務(wù)器的安全版本,客戶(hù)機(jī)必須是可識(shí)別 SSL 的。

Stunnel 要求已經(jīng)安裝了 OpenSSL。它已被移植到了 Windows,以及大多數(shù) UNIX 平臺(tái)。

一旦安裝了 Stunnel,用它來(lái)保護(hù)服務(wù)器就很輕松。例如,您可以通過(guò)將常規(guī)服務(wù)綁定到本地主機(jī)使 IMAP 服務(wù)器啟用 SSL,然后在外部 IP 地址(假設(shè) IMAP 服務(wù)器已經(jīng)在運(yùn)行,且外部地址為 192.168.100.1)運(yùn)行 Stunnel:

  1. stunnel -d 192.168.100.1:imap2 -r 127.0.0.1:imap2 

-d 標(biāo)志指定我們希望用來(lái)運(yùn)行自己的安全服務(wù)的端口。 imap2 字符串指定使用標(biāo)準(zhǔn) IMAP 端口;我們也可以將其設(shè)為 143。Stunnel 檢查 "/etc/services" 文件以便將符號(hào)名映射到端口號(hào)。并非所有的機(jī)器都擁有這個(gè)文件(有些機(jī)器并不列出所有的標(biāo)準(zhǔn)服務(wù)),所以使用數(shù)字比使用服務(wù)名更方便。

-r 標(biāo)志指定未加密的 IMAP 服務(wù)器運(yùn)行所在的端口。

這個(gè)解決方案要求您的 IMAP 服務(wù)器只在回送(loopback)接口上偵聽(tīng)。如果 IMAP 服務(wù)器綁定到 IP 地址“0.0.0.0”,那么它將偵聽(tīng)機(jī)器上每個(gè) IP 地址上的信息,包括 192.168.100.1;這會(huì)導(dǎo)致出現(xiàn)一條出錯(cuò)消息,指出我們的安全服務(wù)端口已在使用中。大多數(shù)服務(wù)都可以配置為只綁定到一個(gè)接口。不然的話(huà),可能要更改一行代碼。

另外,您可以將一個(gè)未加密的服務(wù)器設(shè)在一個(gè)非標(biāo)準(zhǔn)端口上。例如,您可以在端口 1143 上運(yùn)行 IMAP,然后將安全的 IMAP 數(shù)據(jù)流轉(zhuǎn)發(fā)到該端口。一般情況下,您不希望其它機(jī)器上的用戶(hù)訪(fǎng)問(wèn)您未加密的服務(wù)。運(yùn)行服務(wù)的機(jī)器上的個(gè)人防火墻可以加強(qiáng)這種策略。

使用 Stunnel 來(lái)保護(hù)如 IMAP 等服務(wù)面臨的一個(gè)問(wèn)題是服務(wù)器只接收來(lái)自我們提供的 Stunnel 服務(wù)器的連接。因此,所有的連接都看起來(lái)好象是來(lái)自本地機(jī)器。在 Linux 上,可以通過(guò)傳遞 -T 標(biāo)志避開(kāi)這個(gè)問(wèn)題,傳遞 -T 標(biāo)志可以使 Stunnel 服務(wù)器透明地代理信息包,這樣真正的服務(wù)器就可以得到接收到的所有信息包中的正確的源地址。#p#

用于客戶(hù)機(jī)的Stunnel

還可以使用客戶(hù)機(jī)的 Stunnel 與服務(wù)器連接,不過(guò)要多做一些工作。首先,必須生成 Stunnel 作為外部進(jìn)程。在基于 UNIX 的系統(tǒng)上,執(zhí)行這個(gè)操作的最好方法是 fork() 客戶(hù)機(jī),并讓子進(jìn)程 execv() stunnel 。父進(jìn)程必須準(zhǔn)備兩套文件描述符用來(lái)與子進(jìn)程通信 ― 一對(duì)用于從 Stunnel 進(jìn)程讀取數(shù)據(jù),另一對(duì)用于通過(guò)網(wǎng)絡(luò)發(fā)送數(shù)據(jù)。這個(gè)工作量不小。實(shí)現(xiàn)這項(xiàng)功能的示例代碼,提供一個(gè)簡(jiǎn)單的函數(shù)調(diào)用 run_cmd ,掩蓋潛在的復(fù)雜性; run_cmd 使用一個(gè)字符串指出要運(yùn)行的命令,并返回一個(gè) PIPE 對(duì)象,該對(duì)象有一個(gè)文件描述符,套接字使用該文件描述符進(jìn)行讀寫(xiě)操作:

  1. pipe.h:  
  2.  
  3. #ifndef POPEN_H__  
  4. #define POPEN_H__  
  5.  
  6. #include <sys/types.h>  
  7. #include <stdio.h>  
  8.  
  9. #define EXITVAL        127  
  10.  
  11. typedef struct pipe_st {  
  12.   FILE           *read_ptr;  
  13.   FILE           *write_ptr;  
  14.   pid_t           pid;  
  15. } PIPE;  
  16.  
  17. PIPE *run_cmd(char *cmd);  
  18. int   pipe_close(PIPE *p);  
  19. #endif POPEN_H__  
  20.  
  21.  
  22.  
  23. pipe.c:  
  24.  
  25. #include <sys/wait.h>  
  26. #include <unistd.h>  
  27. #include <fcntl.h>  
  28. #include <signal.h>  
  29. #include <errno.h>  
  30. #include <stdlib.h>  
  31.  
  32. #include "pipe.h"  
  33.  
  34. /* We allow double quotes and \ to escape spaces.  
  35.  * All backslashes are "processed", despite the value  
  36.  * of the next character. (Though \\ -> \).  
  37.  * We don't care if there's a missing trailing quote,  
  38.  * even if it should really be a syntax error.  
  39.  */ 
  40. static char **  
  41. to_words(char *arg) {  
  42.   char **arr;  
  43.   char  *p = arg;  
  44.   int    nw = 1;  
  45.   int    slc = 0;  
  46.   int    slm = 0;  
  47.   char   c;  
  48.   short  quote = 0;  
  49.   char  *cur;  
  50.  
  51.  
  52.   /* Build a rough approximation of the number of words,  
  53.    * simply so we don't malloc too low.  
  54.    */ 
  55.   while((c = *p++)) {  
  56.     if(c == '"' || c == ' ') {  
  57.       nw++;  
  58.       if(slm < slc) slm = slc;  
  59.       slc = 0;  
  60.     }  
  61.   }  
  62.   arr = (char **)malloc(sizeof(char *)*(nw+1));  
  63.   quote = nw = slc = 0;  
  64.   p = arg;  
  65.   cur = (char *)malloc(sizeof(char)*(slm+1));  
  66.   arr[nw++] = cur;  
  67.   while((c = *p++)) {  
  68.     switch(c) {  
  69.     case '"':  
  70.       quote = !quote;  
  71.       continue;  
  72.     case ' ':  
  73.       if(quote) {  
  74.     *cur++ = c;  
  75.     slc++;  
  76.     continue;  
  77.       } else {  
  78.     if(!slc) continue;  
  79.     *cur = 0;  
  80.     cur = (char *)malloc(sizeof(char)*(slm+1));  
  81.     arr[nw++] = cur;  
  82.     slc = 0;  
  83.     continue;  
  84.       }  
  85.     case '\\':  
  86.       if(*p) {  
  87.     *cur++ = *p++;  
  88.     slc++;  
  89.     continue;  
  90.       }  
  91.     default:  
  92.       *cur++ = c;  
  93.       slc++;  
  94.       continue;  
  95.     }  
  96.   }  
  97.   *cur = 0;  
  98.   arr[nw] = 0;  
  99.   return arr;  
  100. }  
  101.  
  102. PIPE *  
  103. run_cmd(char *cmd) {  
  104.   int    prpd[2];  
  105.   int    pwpd[2];  
  106.   pid_t  pid;  
  107.   char **args;  
  108.   PIPE  *ret;  
  109.  
  110.   args = to_words(cmd);  
  111.  
  112.   if(pipe(prpd) < 0 || pipe(pwpd) < 0) {  
  113.     return 0; /* Pipe failed. */ 
  114.   }  
  115.  
  116.   pid = fork();  
  117.   switch(pid) {  
  118.   case -1:  
  119.     close(prpd[STDIN_FILENO]);  
  120.     close(prpd[STDOUT_FILENO]);  
  121.     close(pwpd[STDIN_FILENO]);  
  122.     close(pwpd[STDOUT_FILENO]);  
  123.     return 0; /* Fork failed. */ 
  124.     /* Here we can only exit on error. */ 
  125.   case 0:  
  126.     /* Child...  */ 
  127.     if(dup2(pwpd[STDIN_FILENO], STDIN_FILENO) < 0) {  
  128.       exit(EXITVAL);  
  129.     }  
  130.     if(dup2(prpd[STDOUT_FILENO], STDOUT_FILENO) < 0) {  
  131.       exit(EXITVAL);  
  132.     }  
  133.  
  134.     close(pwpd[STDIN_FILENO]);  
  135.     close(pwpd[STDOUT_FILENO]);  
  136.     close(prpd[STDIN_FILENO]);  
  137.     close(prpd[STDOUT_FILENO]);  
  138.     execv(args[0], args);  
  139.     exit(EXITVAL);  
  140.   default:  
  141.     ret = (PIPE *)malloc(sizeof(PIPE));  
  142.     ret->read_ptr = ret->write_ptr = 0;  
  143.     ret->pid = pid;  
  144.     close(pwpd[0]);  
  145.     fcntl(pwpd[1], F_SETFD, FD_CLOEXEC);  
  146.     ret->write_ptr = fdopen(pwpd[1], "wb");  
  147.     if(!ret->write_ptr) {  
  148.       int old = errno;  
  149.       kill(pid, SIGKILL);  
  150.       close(pwpd[1]);  
  151.       waitpid(pid, 0, 0);  
  152.       errno = old;  
  153.       free(ret);  
  154.       return 0;  
  155.     }  
  156.     close(prpd[1]);  
  157.     fcntl(prpd[0], F_SETFD, FD_CLOEXEC);  
  158.     ret->read_ptr = fdopen(prpd[0], "rb");  
  159.     if(!ret->read_ptr) {  
  160.       int old = errno;  
  161.       kill(pid, SIGKILL);  
  162.       close(prpd[0]);  
  163.       waitpid(pid, 0, 0);  
  164.       errno = old;  
  165.       free(ret);  
  166.       return 0;  
  167.     }  
  168.     return ret;  
  169.   }  
  170. }  
  171.  
  172.  
  173. int 
  174. pipe_close(PIPE *p) {  
  175.   int status;  
  176.  
  177.   if(!(p->read_ptr || p->write_ptr)) {  
  178.     return -1;  
  179.   }  
  180.   if(p->read_ptr && fclose(p->read_ptr)) {  
  181.     return -1;  
  182.   }  
  183.   if(p->write_ptr && fclose(p->write_ptr)) {  
  184.     return -1;  
  185.   }  
  186.   if(waitpid(p->pid, &status, 0) != p->pid) {  
  187.     return -1;  
  188.   }  
  189.   p->read_ptr = p->write_ptr = 0;  
  190.   return status;  

#p#

例如,要使用此函數(shù)建立一個(gè)連接到上面啟用 SSL 的 IMAP 服務(wù)器的客戶(hù)機(jī),我們可以編寫(xiě)如下代碼:

  1. PIPE *p;  
  2.  
  3. p = run_cmd("stunnel -c -r 192.168.100.1:imap2 -A /etc/ca_certs -v 3"); 

在上面的代碼中,我們這樣調(diào)用 Stunnel:

  1. stunnel -c -r 192.168.100.1:imap2 -A /etc/ca_certs -v 3 

最后兩個(gè)選項(xiàng)并非必需;客戶(hù)機(jī)可以不考慮這兩個(gè)選項(xiàng)進(jìn)行連接。但是,如果我們省去了這兩個(gè)選項(xiàng),客戶(hù)機(jī)將無(wú)法對(duì)服務(wù)器證書(shū)進(jìn)行充分的驗(yàn)證,會(huì)使客戶(hù)機(jī)隨時(shí)可能遭到 man-in-the-middle 攻擊。在這種攻擊中,有人創(chuàng)建了一個(gè)虛假服務(wù)器,使客戶(hù)機(jī)把它當(dāng)作真正的服務(wù)器,而與之進(jìn)行通信。虛假服務(wù)器代理到真正的服務(wù)器的連接,讀取所有的數(shù)據(jù)。使用現(xiàn)成的工具如 Dsniff(請(qǐng)參閱 參考資料)很容易發(fā)動(dòng)這種攻擊。

v 參數(shù)指定驗(yàn)證級(jí)別。缺省值為 0,適用于使用其它方法驗(yàn)證客戶(hù)機(jī)的服務(wù)器,也是如此。但級(jí)別 1 和級(jí)別 2 更好一些。級(jí)別 1 檢查(非強(qiáng)制地)服務(wù)器證書(shū)是否有效,但可與無(wú)證書(shū)的服務(wù)器連接。級(jí)別 2 要求有效的服務(wù)器證書(shū),但并不檢查證書(shū)是否由權(quán)威認(rèn)證中心如 VeriSign 簽署。

A 參數(shù)指定一個(gè)必須包含可信證書(shū)列表的文件。一個(gè)服務(wù)器證書(shū)要被接受,它必須是在 A 參數(shù)指定的文件內(nèi),或者是一個(gè)用于簽署推薦證書(shū)(通常是來(lái)自權(quán)威認(rèn)證中心,或稱(chēng) CA,如 VeriSign 的證書(shū))的證書(shū),該證書(shū)必須在指定的文件內(nèi)。在 參考資料部分,您會(huì)找到幾個(gè)主要認(rèn)證中心的當(dāng)前有效證書(shū)的鏈接,您可以將它作為必需內(nèi)容放在這個(gè)文件中。

在使用大型 CA 時(shí),甚至這種方法也會(huì)出現(xiàn)問(wèn)題。例如,確保某個(gè)特定的證書(shū)是由 VeriSign 簽署的是不錯(cuò)的。但您如何確保證書(shū)是來(lái)自您想要連接的站點(diǎn)呢?

不幸的是,在寫(xiě)這篇文章的時(shí)候,Stunnel 還不能使調(diào)用程序訪(fǎng)問(wèn)驗(yàn)證過(guò)的證書(shū)的信息。因此,您無(wú)法確定服務(wù)器正在使用的是誰(shuí)的證書(shū)。例如,您可能如愿以?xún)敱贿B接到 Amazon,或者可能被連接到一個(gè)服務(wù)器,該服務(wù)器使用的是偷來(lái)的(但有效的)Microsoft 證書(shū)。

由于這種局限性,您只能局限于下面四個(gè)選擇:

希望沒(méi)有人發(fā)動(dòng) man-in-the-middle 攻擊(不正確的想法)。

在客戶(hù)機(jī)端對(duì)每個(gè)可能的服務(wù)器證書(shū)進(jìn)行硬編碼(Hardcode)。

運(yùn)行自己的認(rèn)證中心,這樣可以動(dòng)態(tài)地添加可信的服務(wù)器。

在應(yīng)用程序中使用 SSL 代替外部的通道,這樣可以通過(guò)編程檢查。

即使這些解決方案都可使用,也沒(méi)有一個(gè)理想的。

責(zé)任編輯:佟健 來(lái)源: ibm.com
相關(guān)推薦

2011-01-10 09:47:01

StunnelStunnel設(shè)置Stunnel使用

2019-06-06 15:20:02

stunneltelnetLinux

2010-04-23 14:33:34

郵件服務(wù)器加密

2010-04-22 15:24:36

郵件安全網(wǎng)絡(luò)加密服務(wù)器

2010-12-16 13:59:52

OpenSSL

2014-07-07 10:04:32

2009-08-14 16:09:12

2009-08-14 13:51:05

2013-12-31 13:46:23

ArrayADCSSL

2021-08-02 23:01:26

服務(wù)器安全數(shù)據(jù)

2013-10-21 14:26:04

2014-11-17 10:53:38

SSL加密

2010-02-25 10:44:39

2019-11-20 15:09:25

安全威脅SSL加密

2021-11-01 23:55:09

Java接口密封類(lèi)

2019-11-20 10:11:57

網(wǎng)絡(luò)釣魚(yú)SSL證書(shū)加密

2016-06-13 09:31:40

2015-12-02 11:18:32

2009-04-09 21:56:14

2019-09-11 08:37:16

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)