国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

如何在SSL內加密任意TCP連接
2005-12-01   

大多數有網絡意識的程序都應該使用密碼術保護數據,以免數據被偷窺,但許多程序都沒有這樣做,可能是因為程序本身是舊應用程序,或者因為安全套接字層(Secure Sockets Layer,SSL)很難加入到應用程序中。Stunnel 是一種程序,使程序員和系統管理員可以很輕松地對任意 TCP 會話加密。您可以很輕松地在客戶機和服務器上啟用 SSL — 而且這樣做不會影響程序源代碼。
SSL 挑戰
在大多數開發環境中,并不是在產品的整個生命周期中都考慮安全性而是在出現安全性問題后才采取補救措施。從傳統的觀點來看,這是壞事 — 事后亡羊補牢很困難,就象向一個寫得馬馬虎虎的軟件添加一個可靠性模塊來除去錯誤一樣困難。
象這些亡羊補牢技術從安全性立場來看好像是可行的,但實際上不太可靠。例如,您可以寫一段代碼,建立網絡連接,然后連接到一個庫 — 該庫用執行加密和認證的版本代替所有的傳統網絡調用。
實際上,這種集成的容易性是安全套接字層,或稱為 SSL(用于 secure HTTP 連接的協議)的最初目的之一。SSL 的幾種實現已經在試圖順便替代標準 Berkeley UNIX socket API,或者帶有盡可能相似接口的庫。
OpenSSL 庫(請參閱參考資料)是嘗試后一種方法的一個很好的示例。在 OpenSSL 庫中,相似的 API 模仿傳統的套接字調用,使用 SSL 上下文對象代替文件描述符。例如,傳統的寫入套接字的調用具有以下特征:
/* Returns the number of characters successfully written */
size_t write(int file_descriptor, void *buf, size_t len)
OpenSSL 更改每個參數的類型,但每個參數的語義不變:
/* Returns the number of characters successfully written */
int SSL_write(SSL *socket_info, char *buf, int len)
實際上,除 SSL 對象之外,其它所有的類型與初始調用都是兼容的。理想情況下,開發者能夠對程序進行較小的修改,只需添加一些代碼從文件描述符初始化 SSL 上下文即可。
而事實上,SSL 庫都不容易使用。例如,開發者要寫許多附加代碼才能使 OpenSSL 在多線程環境下工作。實際上,為將這個庫集成到代碼中去,大多數開發組織花費的精力都比他們預計的要多的多,而結果還常常是一片混亂。
Stunnel
幸運的是,有一種方法可以將加密功能無縫添加到網絡連接中,而不會將您原來的代碼段基址搞亂。Stunnel 是一個程序,可以使用 OpenSSL 庫對任意 TCP 會話進行加密。它作為服務器運行在程序外部。Stunnel 服務器主要執行兩個功能:一,首先,接收未加密的數據流,進行 SSL 加密,然后將其通過網絡發送;二,對已進行 SSL 加密的數據流進行解密,并將其通過網絡發送給另一個程序(該程序通常駐留在同一機器上,以避免本地網絡上的窺探攻擊)。
這樣,在必要時,您就可以很容易地運行未加密的程序,當您想要“嗅探”網絡,看看到底有什么東西正在通過網絡時,這一點很有用。
即使您是一個系統管理員,而不是一個開發者,Stunnel 對您來說也是一個強大的武器,因為它可以向不啟用 SSL 的服務器端軟件添加 SSL。例如,我已經使用 Stunnel 來保護 POP、SMTP 和 IMAP 服務器。唯一不太盡人意的地方是要使用這些服務器的安全版本,客戶機必須是可識別 SSL 的。
Stunnel 要求已經安裝了 OpenSSL。它已被移植到了 Windows,以及大多數 UNIX 平臺。
一旦安裝了 Stunnel,用它來保護服務器就很輕松。例如,您可以通過將常規服務綁定到本地主機使 IMAP 服務器啟用 SSL,然后在外部 IP 地址(假設 IMAP 服務器已經在運行,且外部地址為 192.168.100.1)運行 Stunnel:
stunnel -d 192.168.100.1:imap2 -r 127.0.0.1:imap2
-d 標志指定我們希望用來運行自己的安全服務的端口。imap2 字符串指定使用標準 IMAP 端口;我們也可以將其設為 143。Stunnel 檢查 "/etc/services" 文件以便將符號名映射到端口號。并非所有的機器都擁有這個文件(有些機器并不列出所有的標準服務),所以使用數字比使用服務名更方便。
-r 標志指定未加密的 IMAP 服務器運行所在的端口。
這個解決方案要求您的 IMAP 服務器只在回送(loopback)接口上偵聽。如果 IMAP 服務器綁定到 IP 地址“0.0.0.0”,那么它將偵聽機器上每個 IP 地址上的信息,包括 192.168.100.1;這會導致出現一條出錯消息,指出我們的安全服務端口已在使用中。大多數服務都可以配置為只綁定到一個接口。不然的話,可能要更改一行代碼。
另外,您可以將一個未加密的服務器設在一個非標準端口上。例如,您可以在端口 1143 上運行 IMAP,然后將安全的 IMAP 數據流轉發到該端口。一般情況下,您不希望其它機器上的用戶訪問您未加密的服務。運行服務的機器上的個人防火墻可以加強這種策略。
使用 Stunnel 來保護如 IMAP 等服務面臨的一個問題是服務器只接收來自我們提供的 Stunnel 服務器的連接。因此,所有的連接都看起來好象是來自本地機器。在 Linux 上,可以通過傳遞 -T 標志避開這個問題,傳遞 -T 標志可以使 Stunnel 服務器透明地代理信息包,這樣真正的服務器就可以得到接收到的所有信息包中的正確的源地址。
用于客戶機的 Stunnel
還可以使用客戶機的 Stunnel 與服務器連接,不過要多做一些工作。首先,必須生成 Stunnel 作為外部進程。在基于 UNIX 的系統上,執行這個操作的最好方法是 fork() 客戶機,并讓子進程 execv() stunnel。父進程必須準備兩套文件描述符用來與子進程通信 — 一對用于從 Stunnel 進程讀取數據,另一對用于通過網絡發送數據。這個工作量不小。實現這項功能的示例代碼,提供一個簡單的函數調用 run_cmd,掩蓋潛在的復雜性;run_cmd 使用一個字符串指出要運行的命令,并返回一個 PIPE 對象,該對象有一個文件描述符,套接字使用該文件描述符進行讀寫操作:
pipe.h:
#ifndef POPEN_H__
#define POPEN_H__
#include
#include
#define EXITVAL 127
typedef struct pipe_st {
FILE *read_ptr;
FILE *write_ptr;
pid_t pid;
} PIPE;
PIPE *run_cmd(char *cmd);
int pipe_close(PIPE *p);
#endif POPEN_H__
pipe.c:
#include
#include
#include
#include
#include
#include
#include "pipe.h"
/* We allow double quotes and \ to escape spaces.
* All backslashes are "processed", despite the value
* of the next character. (Though \\ -> \).
* We don't care if there's a missing trailing quote,
* even if it should really be a syntax error.
*/
static char **
to_words(char *arg) {
char **arr;
char *p = arg;
int nw = 1;
int slc = 0;
int slm = 0;
char c;
short quote = 0;
char *cur;
/* Build a rough approximation of the number of words,
* simply so we don't malloc too low.
*/
while((c = *p++)) {
if(c == '"' || c == ' ') {
nw++;
if(slm < slc) slm = slc;
slc = 0;
}
}
arr = (char **)malloc(sizeof(char *)*(nw+1));
quote = nw = slc = 0;
p = arg;
cur = (char *)malloc(sizeof(char)*(slm+1));
arr[nw++] = cur;
while((c = *p++)) {
switch(c) {
case '"':
quote = !quote;
continue;
case ' ':
if(quote) {
*cur++ = c;
slc++;
continue;
} else {
if(!slc) continue;
*cur = 0;
cur = (char *)malloc(sizeof(char)*(slm+1));
arr[nw++] = cur;
slc = 0;
continue;
}
case '\\':
if(*p) {
*cur++ = *p++;
slc++;
continue;
}
default:
*cur++ = c;
slc++;
continue;
}
}
*cur = 0;
arr[nw] = 0;
return arr;
}
PIPE *
run_cmd(char *cmd) {
int prpd[2];
int pwpd[2];
pid_t pid;
char **args;
PIPE *ret;
args = to_words(cmd);
if(pipe(prpd) < 0 || pipe(pwpd) < 0) {
return 0; /* Pipe failed. */
}
pid = fork();
switch(pid) {
case -1:
close(prpd[STDIN_FILENO]);
close(prpd[STDOUT_FILENO]);
close(pwpd[STDIN_FILENO]);
close(pwpd[STDOUT_FILENO]);
return 0; /* Fork failed. */
/* Here we can only exit on error. */
case 0:
/* Child... */
if(dup2(pwpd[STDIN_FILENO], STDIN_FILENO) < 0) {
exit(EXITVAL);
}
if(dup2(prpd[STDOUT_FILENO], STDOUT_FILENO) < 0) {
exit(EXITVAL);
}
close(pwpd[STDIN_FILENO]);
close(pwpd[STDOUT_FILENO]);
close(prpd[STDIN_FILENO]);
close(prpd[STDOUT_FILENO]);
execv(args[0], args);
exit(EXITVAL);
default:
ret = (PIPE *)malloc(sizeof(PIPE));
ret->read_ptr = ret->write_ptr = 0;
ret->pid = pid;
close(pwpd[0]);
fcntl(pwpd[1], F_SETFD, FD_CLOEXEC);
ret->write_ptr = fdopen(pwpd[1], "wb");
if(!ret->write_ptr) {
int old = errno;
kill(pid, SIGKILL);
close(pwpd[1]);
waitpid(pid, 0, 0);
errno = old;
free(ret);
return 0;
}
close(prpd[1]);
fcntl(prpd[0], F_SETFD, FD_CLOEXEC);
ret->read_ptr = fdopen(prpd[0], "rb");
if(!ret->read_ptr) {
int old = errno;
kill(pid, SIGKILL);
close(prpd[0]);
waitpid(pid, 0, 0);
errno = old;
free(ret);
return 0;
}
return ret;
}
}
int
pipe_close(PIPE *p) {
int status;
if(!(p->read_ptr || p->write_ptr)) {
return -1;
}
if(p->read_ptr && fclose(p->read_ptr)) {
return -1;
}
if(p->write_ptr && fclose(p->write_ptr)) {
return -1;
}
if(waitpid(p->pid, &status, 0) != p->pid) {
return -1;
}
p->read_ptr = p->write_ptr = 0;
return status;
}
例如,要使用此函數建立一個連接到上面啟用 SSL 的 IMAP 服務器的客戶機,我們可以編寫如下代碼:
PIPE *p;
p = run_cmd("stunnel -c -r 192.168.100.1:imap2 -A /etc/ca_certs -v 3");
在上面的代碼中,我們這樣調用 Stunnel:
stunnel -c -r 192.168.100.1:imap2 -A /etc/ca_certs -v 3
最后兩個選項并非必需;客戶機可以不考慮這兩個選項進行連接。但是,如果我們省去了這兩個選項,客戶機將無法對服務器證書進行充分的驗證,會使客戶機隨時可能遭到 man-in-the-middle 攻擊。在這種攻擊中,有人創建了一個虛假服務器,使客戶機把它當作真正的服務器,而與之進行通信。虛假服務器代理到真正的服務器的連接,讀取所有的數據。使用現成的工具如 Dsniff(請參閱參考資料)很容易發動這種攻擊。
v 參數指定驗證級別。缺省值為 0,適用于使用其它方法驗證客戶機的服務器,也是如此。但級別 1 和級別 2 更好一些。級別 1 檢查(非強制地)服務器證書是否有效,但可與無證書的服務器連接。級別 2 要求有效的服務器證書,但并不檢查證書是否由權威認證中心如 VeriSign 簽署。
A 參數指定一個必須包含可信證書列表的文件。一個服務器證書要被接受,它必須是在 A 參數指定的文件內,或者是一個用于簽署推薦證書(通常是來自權威認證中心,或稱 CA,如 VeriSign 的證書)的證書,該證書必須在指定的文件內。在參考資料部分,您會找到幾個主要認證中心的當前有效證書的鏈接,您可以將它作為必需內容放在這個文件中。
在使用大型 CA 時,甚至這種方法也會出現問題。例如,確保某個特定的證書是由 VeriSign 簽署的是不錯的。但您如何確保證書是來自您想要連接的站點呢?
不幸的是,在寫這篇文章的時候,Stunnel 還不能使調用程序訪問驗證過的證書的信息。因此,您無法確定服務器正在使用的是誰的證書。例如,您可能如愿以償被連接到 Amazon,或者可能被連接到一個服務器,該服務器使用的是偷來的(但有效的)Microsoft 證書。
由于這種局限性,您只能局限于下面四個選擇:
希望沒有人發動 man-in-the-middle 攻擊(不正確的想法)。
在客戶機端對每個可能的服務器證書進行硬編碼(Hardcode)。
運行自己的認證中心,這樣可以動態地添加可信的服務器。
在應用程序中使用 SSL 代替外部的通道,這樣可以通過編程檢查。
即使這些解決方案都可使用,也沒有一個理想的。
結論
安全性問題要比我們想象的困難的多。理想情況是,我們單擊一下按鈕就可保證自己的應用程序安全。在對網絡連接加密時,值得稱贊的是 Stunnel 接近了“單擊 — 安全”的理想境界,允許我們向在其它方面已經完整的應用程序添加安全性。
不幸的是,Stunnel 有一些局限性。在服務器端,它當前只能夠透明地代理 Linux 客戶機。在客戶機端,不容易執行充分的證書驗證。
盡管如此,Stunnel 仍是實用價值很高的實用程序,應該成為程序員,同樣也是系統管理員的看家法寶。如果您正在開發自己的軟件,應該能夠很容易地將 Stunnel 集成到程序中。服務器代碼不需修改,使用本文中提供的框架通常可以很容易地對客戶機代碼進行改寫。
參考資料
OpenSSL Project 依靠大家的共同努力旨在開發一個健壯的、商務級的、全功能的開放源代碼工具箱,用來實現安全套接字層(SSL v2/v3)和傳輸層安全(TLS v1)協議以及功能強大的通用加密庫。
可從 http://www.stunnel.org/ 獲取 Stunnel。
要獲取 CA 證書列表,請訪問 http://www.columbia.edu/~ariel/good-certs/ns45/。
這里有用來導出 Netscape 的 CA 證書的 Perl 腳本。
您可以在 monkey.org 找到 Dug Song 的 dsniff 2.3 發行版。
Larry Loeb 的關于 dsniff 的 developerWorks 系列(分兩部分)向您展示了最近的更新是怎樣增加 man-in-the-middle 攻擊風險的。第 1 部分介紹了這個網絡探測工具的原理,以及如何識別是否有人在“嗅探”您。第 2 部分提供對抗嗅探器的工具和策略。
參閱 IBM's Managed Security Services 可以幫助您識別和解決使用證實過的連續管理進程帶來的實時安全性風險。
查找最新的 IBM security news。
Intel Common Data Security Architecture 可通過減少上市時間和提供測試過性能的互操作性提高您的提供加強安全性解決方案的能力。

熱詞搜索:

上一篇:Linux系統中的虛擬機可能會削弱安全性
下一篇:瀏覽器中SSL加密缺陷

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
中文字幕第一页久久| 五月婷婷综合在线| 亚洲一二三四区不卡| 欧美系列日韩一区| 亚洲午夜激情网页| 日韩欧美色综合| 波多野结衣在线aⅴ中文字幕不卡| 欧美经典一区二区三区| 97se亚洲国产综合自在线| 亚洲精品国产无天堂网2021| 欧美日韩中文国产| 国产九九视频一区二区三区| 亚洲色图视频网| 欧美一区二区福利在线| 国产精一品亚洲二区在线视频| 国产精品国产精品国产专区不蜜| 欧美无砖专区一中文字| 国产麻豆成人传媒免费观看| 亚洲人成影院在线观看| 欧美videossexotv100| 91亚洲精品久久久蜜桃网站 | 日韩欧美视频一区| 91在线观看高清| 久久爱www久久做| 亚洲综合一区在线| 国产精品无码永久免费888| 91精品国产高清一区二区三区| 国产精品一区二区在线播放 | 欧美成人欧美edvon| 一本一道波多野结衣一区二区| 麻豆精品视频在线观看| 天天综合色天天综合色h| 中文字幕欧美一| 久久蜜桃av一区精品变态类天堂 | 97久久超碰精品国产| 国产在线视视频有精品| 日本不卡1234视频| 亚洲综合色视频| 一区二区三区在线观看视频 | 中文天堂在线一区| 欧美变态口味重另类| 欧美在线免费观看视频| 97久久超碰国产精品| 成人国产电影网| 欧美激情资源网| 欧美精品高清视频| 成人动漫一区二区| 韩国三级电影一区二区| 五月天亚洲婷婷| 亚洲成人免费视| 亚洲国产aⅴ天堂久久| 国产精品美女久久久久久 | 亚洲欧美国产高清| 国产精品久久一卡二卡| 国产精品美女久久久久久久久| 国产丝袜在线精品| 亚洲欧洲三级电影| 亚洲欧美日韩国产综合| 一区二区三区在线免费| 亚洲成人黄色影院| 美国欧美日韩国产在线播放| 美腿丝袜亚洲综合| 国产成人8x视频一区二区| 国产高清不卡二三区| 国产xxx精品视频大全| a亚洲天堂av| 欧美日韩综合色| 欧美成va人片在线观看| 国产亚洲精品超碰| 国产精品不卡在线| 午夜精品一区在线观看| 乱中年女人伦av一区二区| 国产精品一区二区在线观看网站| 粉嫩一区二区三区在线看| 色综合久久久久网| 欧美一区二区日韩| 国产精品三级视频| 五月天激情综合| 国产福利一区二区| 欧美在线综合视频| 26uuu精品一区二区三区四区在线| 国产农村妇女毛片精品久久麻豆 | 亚洲成a人v欧美综合天堂下载| 午夜视频在线观看一区二区三区| 久久电影国产免费久久电影| 成人性色生活片| 这里是久久伊人| 亚洲欧美一区二区三区孕妇| 日韩高清欧美激情| av成人免费在线| 日韩三级伦理片妻子的秘密按摩| 中文字幕第一区二区| 日韩精品一级中文字幕精品视频免费观看 | 97精品电影院| 日韩午夜精品电影| 亚洲免费电影在线| 国产福利精品一区二区| 欧美精品第一页| 中文字幕一区二区三区不卡在线| 午夜精品久久久久久久久久| 成人一区二区三区视频在线观看| 51精品秘密在线观看| 国产精品久久国产精麻豆99网站| 免费成人在线观看视频| 91蝌蚪porny| 欧美极品另类videosde| 久久精品国产一区二区三区免费看| 日本伦理一区二区| 久久精品日韩一区二区三区| 日本aⅴ精品一区二区三区 | 国产成人99久久亚洲综合精品| 欧美精品色综合| 亚洲欧美偷拍另类a∨色屁股| 国产毛片精品视频| 欧美变态口味重另类| 日韩电影在线免费观看| 欧美撒尿777hd撒尿| 亚洲你懂的在线视频| 成人性生交大片免费看视频在线| 久久综合九色欧美综合狠狠| 蜜桃av噜噜一区| 欧美一二三在线| 美女网站在线免费欧美精品| 欧美日本一区二区三区| 亚洲二区在线视频| 欧美日韩一区二区三区高清| 亚洲电影视频在线| 欧美美女一区二区| 奇米影视一区二区三区小说| 91精品国产综合久久小美女| 日本美女视频一区二区| 日韩女优毛片在线| 国产精品一区不卡| 国产视频一区在线播放| 成人美女在线观看| 亚洲欧美国产77777| 欧美影院精品一区| 首页国产丝袜综合| 欧美r级电影在线观看| 国产一区二区福利视频| 亚洲国产精华液网站w| 91啪亚洲精品| 午夜国产精品影院在线观看| 日韩欧美资源站| 国产成人自拍在线| 亚洲精品乱码久久久久| 91精品国产综合久久香蕉麻豆| 精品制服美女丁香| 中文字幕日本乱码精品影院| 精品视频在线免费| 九九在线精品视频| 中文字幕一区二区三区四区不卡 | 欧美高清hd18日本| 精品一区二区三区影院在线午夜| 久久综合色之久久综合| 91小视频免费观看| 三级亚洲高清视频| 日本一区二区在线不卡| 欧美午夜精品理论片a级按摩| 久久99精品久久久久| 国产精品久线观看视频| 欧美一级黄色片| www.欧美.com| 日本欧美在线观看| 国产精品丝袜久久久久久app| 在线视频一区二区三| 国模无码大尺度一区二区三区| 亚洲三级久久久| 久久一二三国产| 欧美日韩国产123区| 成人三级伦理片| 日韩激情一区二区| 最新热久久免费视频| 日韩欧美国产一区二区三区 | 日韩精品亚洲一区| 国产精品久久一卡二卡| 欧美一级电影网站| 色一情一伦一子一伦一区| 国内国产精品久久| 日韩制服丝袜av| 亚洲综合视频在线| 中文字幕亚洲欧美在线不卡| 日韩欧美区一区二| 欧美丰满美乳xxx高潮www| 99久久99久久精品国产片果冻| 免费视频一区二区| 五月婷婷欧美视频| 亚洲精品乱码久久久久久| 国产精品国产三级国产a| 久久久精品一品道一区| 制服丝袜成人动漫| 欧美日韩三级在线| 欧美午夜精品一区二区蜜桃| 97久久久精品综合88久久| 风流少妇一区二区| 国产乱人伦精品一区二区在线观看| 青娱乐精品视频在线| 五月激情六月综合| 亚洲成人免费看| 日韩黄色在线观看|