Stunnel是一款全局加密傳輸軟件(http://www.stunnel.org/),工做在Unix和Windows平臺上,做爲代理,能夠將應用程序發送的明文TCP流量加密,而無需從新配置應用程序自己。明文數據的例子包括POP三、IMAP、SMTP以及HTTP應用程序生成的任何內容。一旦將stunnel配置爲加密數據通道,經過該端口發送的任何內容都將使用SSL加密。兩端都須要安裝Stunnel,以便在傳遞到適當的應用程序以前將流量返回到明文。html
我將Stunnel的官方英文文檔翻譯以下,但願有更多的人認識和使用這款軟件,將你的明文流量加密,以便安全地在因特網上傳輸。算法
既然是說明文檔,就沒有那麼多實用性的例子,這方面你能夠在搜索引擎裏查找,本文再也不贅述。sql
名稱api
stunnel - TLS 卸載和負載平衡代理緩存
將TLS加密通訊功能交由STUNNEL完成。安全
簡介
Unix系統:
stunnel [FILE] | -fd N | -help | -version | -sockets | -options服務器
WIN32:網絡
Stunnel[[-install |-uninstall |-start |-stop |-reload |-reopen |-exit[-quiet][FILE]]|-help |-version |-sockets |-optionssession
描述app
stunnel程序旨在用做遠程客戶端與本地(inetd-startable)、或與遠程服務器之間的TLS加密封裝。其概念是,在系統上運行不支持TLS的守護程序,您能夠輕鬆地將其設置爲經過安全TLS通道與客戶端進行通訊。
stunnel能夠爲經常使用的Inetd守護進程添加TLS功能,如POP-二、POP-3和IMAP服務器,也能夠爲獨立的守護進程如NNTP、SMTP和HTTP添加TLS功能,還能夠在不改變源代碼的狀況下經過網絡套接字創建PPP隧道。
該產品還包括由Eric Young編寫的加密軟件(eay@cryptsoft.com)
OPTIONS
FILE
使用指定的配置文件
-fd N (Unix only)
從指定的文件描述符讀取配置文件
-help
顯示stunnel幫助菜單
-version
顯示stunnel版本號和編譯時的默認值
-sockets
顯示默認的socket選項
-options
顯示支持的TLS選項
-install (Windows NT and later only)
安裝NT服務
-uninstall (Windows NT and later only)
卸載NT服務
-start (Windows NT and later only)
開始NT服務
-stop (Windows NT and later only)
中止NT服務
-reload (Windows NT and later only)
reload運行中的NT服務的配置文件
-reopen (Windows NT and later only)
Reopen運行中的NT服務的log文件
-exit (Win32 only)
退出已啓動的stunnel
-quiet (Win32 only)
不顯示任何消息框
配置文件
配置文件的每一行能夠是:
● 空行(忽略)
● 以;開頭的註釋(忽略)
● 「option_name=option_value」對
● 「 [service_name]」表示服務定義的開始
選項的地址參數能夠是:
● 端口號
● 端口號
● 以冒號分隔的一對IP地址(IPv四、IPv6或域名)和端口號。
● Unix套接字路徑(Unix only)。
全局選項
chroot = DIRECTORY (Unix only)
chroot stunnel進程的目錄
chroot將stunnel保存在chrooted jail。CApath, CRLpath, pid and exec都位於chrooted jail。
patches必須與chroot指定的目錄相關。
操做系統的一些功能還須要將其文件放在chroot jail中,例如:
Delayed resolver一般須要 /etc/nsswitch.conf and /etc/resolv.conf
log文件中的本地時間須要 /etc/timezone
其餘一些功能可能須要設備,例如 /dev/zero or /dev/null
compression = deflate | zlib
選擇數據壓縮算法,缺省是無壓縮。
Deflate是RFC 1951中描述的標準壓縮方法。
debug = [FACILITY.]LEVEL
調試級別
Level是syslog級別的名稱或數字中的一個,即 emerg (0),alert (1), crit (2),err (3),warning (4),notice (5),info (6)或debug (7)。全部指定級別的日誌,以及全部數值小於該級別的日誌將被顯示。使用debug = debug或debug = 7來得到最大的調試輸出。默認值是notice (5)。
除非提供了設施名稱,不然將使用syslog設施「daemon」(Win32不支持這些功能)。
對於設施和級別都會忽略大小寫。
EGD = EGD_PATH (Unix only)
Entropy Gathering Daemon socket的路徑,用於饋送給OpenSSL隨機數生成器。
engine = auto | ENGINE_ID
選擇硬件或軟件加密引擎,缺省是純軟件加密。
關於使用加密設備中的證書,以及相應的私鑰的引擎配置,請參閱示例部分。
engineCtrl = COMMAND[:PARAMETER]
控制硬件引擎。
engineDefault = TASK_LIST
設置委派給當前引擎的OpenSSL任務,參數是以逗號分隔的任務列表。
若是引擎支持,如下任務可能可用:ALL、RSA、DSA、ECDH、ECDSA、DH、RAND、CIPHERS、DIGESTS、PKEY、PKEY_CRYPTO、PKEY_ASN1。
fips = yes | no
啓用或禁用FIPS 140-2模式。
若是使用FIPS 140-2編譯了stunnel,此選項容許您禁用進入FIPS模式。默認值:否(從5.00版起)
foreground = yes | quiet | no (Unix only)
前臺模式。留在前臺(不要分叉)。
使用yes參數,除了使用syslog和output指定的目標以外,還記錄到stderr。默認值:後臺駐留程序
iconActive = ICON_FILE (GUI only)
創建鏈接後將顯示GUI圖標
在Windows平臺上,參數應該是一個包含16x16像素圖像的.ico文件。
iconError = ICON_FILE (GUI only)
加載無效配置時顯示的GUI圖標。在Windows平臺上,參數應該是一個包含16x16像素圖像的.ico文件。
iconIdle = ICON_FILE (GUI only)
未創建鏈接時顯示的GUI圖標。
在Windows平臺上,參數應該是一個包含16x16像素圖像的.ico文件。
log = append | overwrite
日誌文件處理。
容許你選擇在open(打開)或re-open(從新打開)時,是追加仍是覆蓋日誌文件(使用「output」選項指定)。
默認值:sppend(追加)。
output = FILE
追加日誌信息到文件中。
/dev/stdout設備能夠用來發送日誌信息到標準輸出(例如用daemontools splogger記錄日誌消息)。
pid = FILE (Unix only)
pid文件位置。若是該參數爲空,則不會建立任何pid文件。
若是指定了pid路徑,則該路徑是相對於chroot目錄的。
RNDbytes = BYTES
從隨機種子文件讀取的字節數。
RNDfile = FILE
種子數據的路徑。OpenSSL庫會首先使用該文件中的數據做爲隨機數生成器的種子。
RNDoverwrite = yes | no
用新的隨機數據覆蓋隨機種子文件,默認值:是。
service = SERVICE (Unix only)
stunnel服務名稱
指定的服務名用於syslog,並用做TCP封裝程序的inetd模式服務名稱。雖然此選項在技術上能夠在service sections中指定,但它僅在全局選項中有用。
默認值:stunnel
syslog = yes | no (Unix only)
經過syslog啓用日誌記錄,默認值:是
taskbar = yes | no (WIN32 only)
啓用任務欄圖標,默認值:是
SERVICE-LEVEL OPTIONS
每一個 configuration section以方括號中的服務名稱開始。服務名稱用於libwrap (TCP Wrappers) 訪問控制,並容許你在日誌文件中區分stunnel服務。
請注意,若是你想在inetd模式下運行stunnel(在inetd模式下,由inetd、xinetd或tcpserver等服務器提供網絡套接字),那麼你應該閱讀下面的INETD MODE部分。
accept = [HOST:]PORT
接受指定地址上的鏈接
若是未指定主機,則默認爲本地主機的全部IPv4地址。
要偵聽全部IPv6地址,請使用:
accept = :::PORT
CApath = DIRECTORY
CA文件的目錄
這是stunnel在使用verifyChain或verifyPeer選項時查找證書的目錄。注意,這個目錄下的證書應該命名爲XXXXXXX.0,其中XXXXXXX是證書的DER編碼subject(主題)的哈希值。
OpenSSL 1.0.0中的哈希算法已經改變,從OpenSSL 0.x.x升級到OpenSSL 1.x.x時,須要對該目錄進行c_rehash。
若是指定了CApath路徑,它是相對於chroot目錄的。
CAfile = CA_FILE
CA文件名。此文件包含多個CA證書,將與verifyChain和verifyPeer選項一塊兒使用。
cert = CERT_FILE
證書鏈文件名。
該文件用於stunne對遠程客戶端或服務器進行身份驗證。它應該包含整個證書鏈,從實際的服務器/客戶端
證書開始,到自簽名的根CA證書結束,必須是PEM或P12格式。
在服務器模式下須要證書鏈,而在客戶端模式下則是可選的。
當啓用硬件引擎時,該參數也被用做 certificate identifier(證書標識符)。
checkEmail = EMAIL
對端證書的郵件地址。
在一個service section中容許有多個checkEmail選項。
若是沒有指定subject checks(主題檢查),或者對等證書的電子郵件地址與checkEmail中指定的任何一個電
子郵件地址相匹配,則接受證書。該選項須要OpenSSL 1.0.2或更高的版本。
checkHost = HOST
對等證書的主機。
在一個service section中容許使用多個checkHost選項。若是沒有指定subject checks(主題檢查),或者對等
證書的主機名稱與checkHost指定的任何主機相匹配,則接受證書。該選項須要OpenSSL 1.0.2或更高的版本。
checkIP = IP
對等證書subject(主題)的IP地址。
在一個service section中容許有多個checkIP選項。 若是未指定subject checks(主題檢查),或者對等證書
的IP地址與用checkIP指定的任何IP地址匹配,則接受證書。此選項須要OpenSSL 1.0.2或更高版本。
ciphers = CIPHER_LIST
擇容許的TLSciphers (TLSv1.2及如下)
此選項不影響TLSv1.3密碼套件。
TLS鏈接中容許使用的以冒號分隔的加密算法列表,例如DES-CBC3-SHA:IDEA-CBC-MD5。
ciphersuites = CIPHERSUITES_LIST
選擇容許的TLSv1.3密碼套件。
以冒號分隔的TLSv1.3密碼套件名稱列表,按優先順序排列。此選項須要OpenSSL 1.1.1或更高版本。
默認值:TLS_cha20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
client = yes | no
客戶端模式(遠程服務器使用TLS),默認值:否(服務器模式)
config = COMMAND[:PARAMETER]
OpenSSL配置命令
使用指定的參數執行OpenSSL配置命令,這容許從statnel配置文件中調用任何配置命令。支持的命令在SSL_CONF_cmd(3ssl)手冊頁面上有描述。
可使用幾個config行來指定多個配置命令。該選項須要OpenSSL 1.0.2或更高版本.
connect = [HOST:]PORT
鏈接到遠程地址。若是未指定主機,則該主機默認爲localhost。
單個service section中容許多個鏈接選項。
若是主機解析爲多個地址和/或指定了多個鏈接選項,則使用循環算法選擇遠程地址。
CRLpath = DIRECTORY
存放證書吊銷列表的目錄。
這是stunnel在使用verifyChain和verifyPeer選項時查找crl的目錄。請注意,此目錄中的CRL應命名爲xxxxxxx.r0,其中xxxxxxx是CRL的哈希值。
OpenSSL 1.0.0中的哈希算法已更改。從OpenSSL 0.x.x升級到OpenSSL 1.x.x時須要對該目錄進行c_rehash。
若是指定了CRLpath路徑,則是相對於chroot目錄的。
CRLfile = CRL_FILE
證書吊銷列表文件。此文件包含多個CRL,與verifyChain和verifyPeer選項一塊兒使用。
curves = list
「:」分隔的ECDH曲線
對於早於1.1.0的OpenSSL,只容許使用一個曲線名稱。
要獲取支持曲線的列表,請使用:
openssl ecparam -list_curves
違約:
X25519:P-256:X448:P-521:P-384(OpenSSL 1.1.1或更高版本)
prime256v1(OpenSSL早於1.1.1)
logId = TYPE
鏈接標識符類型。此標識符容許您區分爲每一個鏈接生成日誌條目。
當前支持的類型:
sequential
數字順序標識符僅在單個通道實例中是惟一的,但很是緊湊。 它對於手動日誌分析最有用。
unique
該字母數字標識符是全局惟一的,但比序列號長。 它對於自動日誌分析最有用。
thread
操做系統線程標識符既不是惟一的(即便在一個stunnel實例內),也不是很短。它對調試軟件或配置問題最
有用。操做系統進程標識符(PID)在inetd模式下可能頗有用。
默認值:sequential
debug = LEVEL
調試級別。
LEVEL(級別)是系統日誌級別名稱或數字 emerg (0)、alert (1)、crit (2)、err (3)、warning (4)、notice (5)、
info (6)或 debug (7)中的一個。指定級別的全部日誌,以及數值小於該級別的全部日誌都將被顯示。使用debug= debug或debug = 7 以得到最大的調試輸出。默認值是notice (5)。
delay = yes | no
延遲connect option的DNS查找。
此選項對於動態DNS或在stunnel啓動期間DNS不可用(road warrior ***,撥號配置)很是有用。
若是stunnel啓動時沒法解析服務的任何鏈接目標,將自動啓用延遲解析程序模式。
默認:no
engineId = ENGINE_ID
選擇服務的引擎ID。
engineNum = ENGINE_NUMBER
選擇服務的engine numbe。
engines從1開始編號。
exec = EXECUTABLE_PATH
執行本地inetd類型程序
exec path是相對於chroot目錄的(若是指定)。
在Unix平臺上設置瞭如下環境變量:REMOTE_HOST,REMOTE_PORT,SSL_CLIENT_DN,SSL_CLIENT_I_DN。
execArgs = $0 $1 $2 ...
exec的參數,包括program name ($0)
目前不支持引用。參數之間用任意數量的空格分隔。
failover = rr | prio
多個 "connect" 目標的故障轉移策略。
rr
循環-公平負載分配。
prio
優先級 - 使用配置文件中指定的順序
default: prio
ident = USERNAME
使用IDENT(RFC 1413)檢查username(用戶名)。
include = DIRECTORY
包括全部位於DIRECTORY中的配置文件部分。
文件按其名稱的升序排列。建議使用的文件名慣例是:
對於全局選項:
00-global.conf
對於local service-level options:
01-service.conf
02-service.conf
key = KEY_FILE
cert選項指定的證書的私鑰。
須要一個私鑰來驗證證書全部者的身份。因爲這個文件應該是保密的,因此只有它的擁有者才能夠讀取。
在Unix系統中,你可使用如下命令。
chmod 600 keyfile
當啓用硬件引擎時,該參數也被用做私鑰標識符。
默認:cert選項的值。
libwrap = yes | no
啓用或禁用 /etc/hosts.allow and /etc/hosts.deny.
默認:no (自5.00版本起)
local = HOST
默認狀況下,出站接口的IP地址用做遠程鏈接的源。使用此選項能夠綁定本地靜態IP地址。
OCSP = URL
選擇OCSP響應者進行證書驗證。
OCSPaia = yes | no
與AIA OCSP響應者一塊兒驗證證書
此選項使stunnel使用從AIA(Authority Information Access受權信息訪問)擴展獲取的OCSP響應者URL列表
來驗證證書。
OCSPflag = OCSP_FLAG
指定OCSP響應者標誌。多個OCSPflag可用於指定多個標誌。
當前受支持的標誌:NOCERTS,NOINTERN,NOSIGS,NOCHAIN,NOVERIFY,NOEXPLICIT,NOCASIGN,NODELEGATED,
NOCHECKS,TRUSTOTHER,RESPID_KEY,NOTIME
OCSPnonce = yes | no
發送並驗證OCSP nonce擴展。
該選項能夠保護OCSP協議免受重放***。因爲計算開銷,nonce擴展一般只支持內部(例如公司)響應者,
而不支持公共OCSP響應者。
options = SSL_OPTIONS
OpenSSL library options
參數是SSL_CTX_set_options(3ssl)手冊中描述的OpenSSL選項名稱,但沒有SSL_OP_ prefix。stunnel -options列
出了stunnel,和用於構建stunnel的OpenSSL庫的當前組合中容許的選項。
可使用多個行指定多個選項,選項名稱前面能夠加上短劃線(「-」)以禁用該選項。
例如,爲了與錯誤的Eudora TLS實現兼容,可使用如下選項。
options = DONT_INSERT_EMPTY_FRAGMENTS
默認狀況下:
options = NO_SSLv2
options = NO_SSLv3
使用OpenSSL 1.1.0或更高版本進行編譯時,請使用sslVersionMax或sslVersionMin選項,而不是禁用特定的TLS協議版本。
protocol = PROTO
能協商TLS的應用程序協議。
這個選項能夠實現TLS加密的初始化、特定協議的協商。本選項不該與單獨端口上的TLS加密一塊兒使用。
當前支持的協議:
cifs
在Samba中實現的CIFS協議的專有(undocummented)擴展。在Samba 3.0.0中取消了對該擴展的支持。
connect
基於RFC 2817 - 在HTTP/1.1中升級到TLS,第5.2節 - 使用CONNECT請求隧道。
僅在客戶端模式下支持此協議。
imap
於RFC 2595-將TLS與IMAP,POP3和ACAP結合使用。
nntp
基於RFC 4642-使用傳輸層安全(TLS)和網絡新聞傳輸協議(NNTP)。
僅在客戶端模式下支持此協議。
pgsql
基於:http://www.postgresql.org/docs/8.3/static/protocol-flow.html#AEN73982
pop3
基於RFC 2449-POP3擴展機制。
proxy
使用HAProxy代理協議版本1傳遞原始客戶端IP:
https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt
smtp
基於RFC 2487:Secure SMTP over TLS的SMTP服務擴展。
基於socks
支持SOCKS 四、4a和5版本。SOCKS協議自己被封裝在TLS加密層中,以保護最終目的地址。
http://www.openssh.com/txt/socks4.protocol
http://www.openssh.com/txt/socks4a.protocol
不支持SOCKS協議的BIND命令,忽略USERID參數。
有關基於SOCKS加密虛擬專用網的示例配置文件,請參見示例部分。
protocolAuthentication = AUTHENTICATION
協議協商的認證類型。
目前,這個選項只在客戶端的「connect」和「smtp」協議中被支持。
「connect "協議支持的身份認證類型是 "basic "或 "ntlm";默認的 "connect "身份認證類型是 "basic "。
」smtp "協議支持的認證類型是 "plain "或 "login",默認的 "smtp "認證類型是 "basic "或 "ntlm",
默認的「smtp」認證類型是「plain」。
protocolDomain = DOMAIN
協議協商的域。目前,此選項僅在客戶端「connect」協議中受支持。
protocolHost = HOST:PORT
協議協商的目的地址。
protocolHost指定要經過代理鏈接的最終TLS服務器,而不是經過stunnel直接鏈接的代理服務器。
代理服務器應使用「鏈接」選項指定。
當前,協議目標地址僅適用於「connect "協議。
protocolPassword = PASSWORD
協議協商的密碼。
目前,此選項僅在客戶端「connect」和「smtp」協議中受支持。
protocolUsername = USERNAME
協議協商的用戶名。
當前,僅在客戶端「connect」和「 smtp」協議中支持此選項。
PSKidentity = IDENTITY
PSK客戶端的PSK標識。
PSK identity能夠在stunnel客戶端上使用,以選擇用於身份驗證的PSK標識,server sections忽略此選項。
默認值:PSKsecrets文件中指定的第一個標識。
PSKsecrets = FILE
具備PSK標識和相應密鑰的文件
文件的每一行格式以下:
IDENTITY:KEY
十六進制密鑰自動轉換爲二進制形式。密鑰至少要有16個字節長,這意味着十六進制密鑰至少要有32個字
符。文件既不該該是全局可讀的,也不該該是全局可寫的。
pty = yes | no (Unix only)
爲「exec」選項分配一個僞終端。
redirect = [HOST:]PORT
在基於證書的身份驗證失敗時重定向TLS客戶端鏈接。
此選項僅在服務器模式下工做。一些協議協商也與redirect選項不兼容。
renegotiation = yes | no
支持TLS從新協商。
TLS從新協商的應用程序包括某些身份驗證方案,或從新設置持久鏈接的密鑰。
另外一方面,此功能能夠觸發CPU耗盡DoS***。
http://vincent.bernat.im/en/blog/2011-ssl-dos-mitigation.html
請注意,禁用TLS從新協商並不能徹底緩解這個問題。
默認:yes(若是OpenSSL支持)
reset = yes | no
嘗試使用TCP RST標誌指示錯誤,在某些平臺上不支持此選項。
默認: yes
retry = yes | no
斷開鏈接後從新鏈接:connect+exec section
默認: no
requireCert = yes | no
須要客戶端證書來驗證Chain或verifyPeer。
若是requireCert設置爲no,stunnel服務器將接受未提供證書的客戶端鏈接。
verifyChain = yes和verifyPeer = yes都意味着requireCert = yes。
默認: no
setgid = GROUP (Unix only)
Unix group id
做爲全局選項:在守護模式下,設置setgid()爲指定的組,並清除全部其餘組。
做爲service-level選項:設置用"accept"指定的Unix套接字組。
setuid = USER (Unix only)
Unix user id
做爲全局選項:在守護程序模式下將setgid()設置爲指定的組,而後清除全部其餘組。
做爲服務級選項:設置用「accept」指定的Unix socket組。
sessionCacheSize = NUM_ENTRIES
會話緩存大小
sessionCacheSize指定內部會話緩存條目的最大數量。
值爲0時可用於無限大小。因爲存在內存耗盡DoS ***的風險,不建議在生產中使用。
sessionCacheTimeout = TIMEOUT
會話緩存超時。這是保留緩存的TLS會話的秒數。
sessiond = HOST:PORT
Sessiond TLS緩存服務器的地址。
sni = SERVICE_NAME:SERVER_NAME_PATTERN (server mode)
將該服務用做從屬服務(基於名稱的虛擬服務器),用於服務器名稱指示TLS擴展(RFC 3546)。
SERVICE_NAME指定使用accept選項接受客戶端鏈接的主服務。SERVER_NAME_PATTERN指定要重定向的
主機名。模式能夠以'*'字符開頭,例如*.example.com。
一般爲單個主服務指定多個從服務,也能夠在單個從屬服務中屢次指定sni選項。
該服務以及主服務可能沒法在客戶端模式下配置。
當指定connect 選項時,從屬服務的connect選項會被忽略,由於協議會在TLS握手以前鏈接到遠程主機。
Libwrap檢查(僅限Unix)會執行兩次:在接受TCP鏈接後檢查主服務名稱,在TLS握手期間檢查從服務名稱。
sni選項僅在使用OpenSSL 1.0.0及更高版本進行編譯時纔可用。
sni = SERVER_NAME (client mode)
使用該參數做爲TLS服務器名稱指示(RFC 3546)擴展的值。
空的SERVER_NAME將禁用發送SNI擴展。
sni選項僅在使用OpenSSL 1.0.0及更高版本進行編譯時纔可用。
socket = a|l|r:OPTION=VALUE[:VALUE]
在accept/local/remote套接字上設置一個選項。
linger選項的值是l_onof:l_linger。時間值是tv_sec:tv_usec。
例子:
socket = l:SO_LINGER=1:60
設置一分鐘超時以關閉本地套接字
socket = r:SO_OOBINLINE=yes
將帶外數據直接放入
接收遠程套接字數據流
socket = a:SO_REUSEADDR=no
禁用地址重用(默認狀況下已啓用)。
socket = a:SO_BINDTODEVICE=lo
只接受環回接口的鏈接
sslVersion = SSL_VERSION
選擇TLS協議版本.
支持的版本:all,SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2,TLSv1.3。
特定協議的可用性取決於所連接的OpenSSL庫。舊版本的OpenSSL不支持TLSv1.一、TLSv1.2和TLSv1.3。
較新版本的OpenSSL不支持SSLv2。
已過期的SSLv2和SSLv3目前默認爲禁用。
Setting the option
sslVersion = SSL_VERSION
is equivalent to options
sslVersionMax = SSL_VERSION
sslVersionMin = SSL_VERSION
當用OpenSSL 1.1.0和更高版本編譯時。
sslVersionMax = SSL_VERSION
支持的最高協議版本。
支持的版本:all、SSLv三、TLSv一、TLSv1.一、TLSv1.二、TLSv1.3
全部啓用的協議版本都不超過連接的OpenSSL庫支持的最高版本。
特定協議的可用性取決於連接的OpenSSL庫。
本選項僅在使用OpenSSL 1.1.0和更高版本編譯時可用。
默認: all
sslVersionMin = SSL_VERSION
最低支持的協議版本。
支持的版本:all,SSLv3,TLSv1,TLSv1.1,TLSv1.2,TLSv1.3。
全部啓用的協議版本都是連接的OpenSSL庫所支持的最低版本。
特定協議的可用性取決於所連接的OpenSSL庫。
sslVersionMin選項只有在使用OpenSSL 1.1.0及更高版本編譯時纔可用。
默認: TLSv1
stack = BYTES (except for FORK model)
建立線程的CPU堆棧大小。
線程堆棧大小過大會增長虛擬內存的使用量。反之不足可能會致使應用程序崩潰。
默認值:65536字節(對咱們測試的全部平臺來講都足夠了)。
ticketKeySecret = SECRET
十六進制對稱密鑰,用於會話票據的機密性保護。
RFC 5077中定義的會話票據提供了一種加強的會話恢復能力,在這種狀況下,服務器端緩存不須要維護每一個
會話狀態。
結合 ticketKeySecret和ticketMacSecret選項,能夠在其餘集羣節點上恢復協商的會話,或者在服務器重啓後恢復協商的會話。
密鑰的長度要求爲16或32字節,這意味着正好是32或64個十六進制數字。 能夠選擇在兩個字符的十六進制字節之間使用冒號。
該選項只適用於服務器模式。
ticketKeySecret選項只有在使用OpenSSL 1.0.0或更高版本編譯時才能使用。
對於早於1.1.1的OpenSSL的票證支持,須要禁用NO_TICKET選項,但請注意,此選項與redirect選項不兼容。
ticketMacSecret = SECRET
十六進制對稱密鑰,用於會話票據的完整性保護。
密鑰的長度要求爲16或32字節,這意味着正好是32或64個十六進制數字。能夠選擇在兩個字符的十六進制字節之間使用冒號。
該選項只適用於服務器模式。
ticketMacSecret 選項只有在使用 OpenSSL 1.0.0 或更高版本編譯時纔可用。
TIMEOUTbusy = SECONDS
等待預期數據的時間
TIMEOUTclose = SECONDS
等待close_notify的時間(對於有問題的MSIE,設置爲0)。
TIMEOUTconnect = SECONDS
等待鏈接到遠程主機的時間
TIMEOUTidle = SECONDS
保持空閒鏈接的時間
transparent = none | source | destination | both (Unix only)
在選定平臺上啓用透明代理支持。
支持的值:
none
禁用透明代理支持。這是默認的。
source
重寫地址,使其看起來就像被封裝的守護進程從TLS客戶端鏈接,而不是從運行stunnel的機器鏈接。
該選項目前在如下狀況下可用:
Linux>=2.6.28上的遠程模式(connect選項)。
此配置要求stunnel以根用戶身份執行沒有setuid選項。
此配置要求對iptables和路由進行如下設置(可能在/etc/rc.local或等效文件中):
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
echo 0 >/proc/sys/net/ipv4/conf/lo/rp_filter
stunnel也必須以root身份執行且不使用setuid選項。
Linux 2.2.x上的遠程模式(鏈接選項)
此配置要求使用透明代理選項編譯內核。鏈接的服務必須安裝在單獨的主機上。路由到客戶端必須經過stunnel box。
stunnel還必須以root身份執行且沒有setuid選項。
FreeBSD >=8.0上的遠程模式(connect選項)
本配置須要額外的防火牆和路由設置。stunnel也必須以root身份執行且不使用setuid選項。
本地模式 (exec選項)
本配置是經過預加載libstunnel.so共享庫來實現的,在Tru64上使用_RLD_LIST環境變量,在其餘平臺上使用LD_PRELOAD變量。
destination
使用原始目的地而不是connect選項。
透明目的地的service section可能以下所示:
[transparent]
client = yes
accept = <stunnel_port>
transparent = destination
此配置須要在/etc/rc.local或等效文件中進行iptables設置才行。
對於安裝在同一主機上的鏈接目標:
/sbin/iptables -t nat -I OUTPUT -p tcp --dport <redirected_port> \
-m ! --uid-owner <stunnel_user_id> \
-j DNAT --to-destination <local_ip>:<stunnel_port>
對於安裝在遠程主機上的鏈接目標:
/sbin/iptables -I INPUT -i eth0 -p tcp --dport <stunnel_port> -j ACCEPT
/sbin/iptables -t nat -I PREROUTING -p tcp --dport <redirected_port> \
-i eth0 -j DNAT --to-destination <local_ip>:<stunnel_port>
目前僅在Linux上支持transparent destination選項.
both
同時使用源和目的透明代理。
爲了向後兼容,還支持兩個傳統選項:
yes
此選項已更名爲source。
no
此選項已經更名爲none。
verify = LEVEL
驗證對端證書。該選項已過期,應替換爲verifyChain和verifyPeer選項。
level 0
請求證書但不驗證證書。
level 1
若是存在證書就驗證。
level 2
驗證對端證書。
level 3
根據本地安裝的證書驗證對等方。
level 4
忽略證書鏈,只驗證對端的證書。
默認:不驗證。
verifyChain = yes | no
驗證從根CA開始的對端證書鏈。
對於服務器證書的驗證,還須要用checkHost或checkIP來要求特定的證書。
自簽名的根CA證書須要存儲在CAfile指定的文件中,或者是CApath指定的目錄中。
默認:no
verifyPeer = yes | no
驗證對端證書。
對端證書須要存儲在CAfile指定的文件中或CApath指定的目錄中。
默認值:no
返回值
stunnel成功時返回0,錯誤時返回非0。
信號
SIGHUP
強制從新加載配置文件。
某些全局選項將不會從新加載:
● chroot
● foreground
● pid
● setgid
● setuid
使用'setuid'選項還能夠防止在重載配置期間將stunnel綁定到特權(<1024)端口。
當使用'chroot'選項時,stunnel將在chroot jail中查找全部文件(包括配置文件、證書、log文件和pid文件)。
SIGUSR1
關閉並從新打開隧道日誌文件。 此功能可用於日誌輪換。
SIGUSR2
記錄活動鏈接列表。
SIGTERM, SIGQUIT, SIGINT
關閉stunnel。
向服務器發送的任何其餘信號未定義。
例子
爲了向您的本地imapd服務提供TLS封裝,請使用:
[imapd]
accept = 993
exec = /usr/sbin/imapd
execArgs = imapd
或在遠程模式下:
[imapd]
accept = 993
connect = 143
爲了讓本地電子郵件客戶端鏈接到另外一臺啓用了TLS的imapd服務器,請將電子郵件客戶端配置爲鏈接到端口119上的本地主機,並使用:
[imap]
client = yes
accept = 143
connect = servername:993
若是要在端口2020上爲pppd守護進程提供隧道,請使用:
[V.P.N]
accept = 2020
exec = /usr/sbin/pppd
execArgs = pppd local
pty = yes
若是要在inetd模式下使用stunnel啓動imapd進程,可使用stunnel.conf格式。注意不能有[service_name]
這一部分:
exec = /usr/sbin/imapd
execArgs = imapd
要設置SOCKS ***,請配置如下客戶端服務:
[socks_client]
client = yes
accept = 127.0.0.1:1080
connect = ***_server:9080
verifyPeer = yes
CAfile = stunnel.pem
The corresponding configuration on the ***_server host:
[socks_server]
protocol = socks
accept = 9080
cert = stunnel.pem
key = stunnel.key
***服務器主機上的相應配置:
curl --socks4a localhost http://www.example.com/
服務器模式SNI配置示例:
[virtual]
; master service
accept = 443
cert = default.pem
connect = default.internal.mydomain.com:8080
[sni1]
; slave service 1
sni = virtual:server1.mydomain.com
cert = server1.pem
connect = server1.internal.mydomain.com:8081
[sni2]
; slave service 2
sni = virtual:server2.mydomain.com
cert = server2.pem
connect = server2.internal.mydomain.com:8082
verifyPeer = yes
CAfile = server2-allowed-clients.pem
高級引擎配置的示例容許使用Windows證書存儲區(僅Windows)中存儲的私鑰進行身份驗證。使用CAPI引擎,您無需手動選擇要使用的客戶端密鑰。根據服務器信任的CA列表自動選擇客戶端密鑰。
engine = capi
[service]
engineId = capi
client = yes
accept = 127.0.0.1:8080
connect = example.com:8443
一個高級引擎配置的例子,可使用pkcs11引擎的證書和相應的私鑰:
engine = pkcs11
engineCtrl = MODULE_PATH:opensc-pkcs11.so
engineCtrl = PIN:123456
[service]
engineId = pkcs11
client = yes
accept = 127.0.0.1:8080
connect = example.com:843
cert = pkcs11:token=MyToken;object=MyCert
key = pkcs11:token=MyToken;object=MyKey
一個高級引擎配置的例子,使用SoftHSM令牌中的證書和相應的私鑰。
engine = pkcs11
engineCtrl = MODULE_PATH:softhsm2.dll
engineCtrl = PIN:12345
[service]
engineId = pkcs11
client = yes
accept = 127.0.0.1:8080
connect = example.com:843
cert = pkcs11:token=MyToken;object=KeyCert
限制條件
stunnel不能用於FTP守護進程,由於FTP協議的本質是使用多個端口進行數據傳輸。但FTP和telnet守護進程也有一些啓用了TLS的版本。
INETD MODE
stunnel最多見的用途是監聽一個網絡端口,並經過connect選項與一個新的端口創建通訊,或經過exec選項與一個新的程序創建通訊。可是,若是但願其餘程序接受傳入鏈接並啓動stunnel,例如使用inetd、xinetd或tcpserver,則有一種特殊狀況。
例如,若是你在inetd.conf中有如下一行:
imaps stream tcp nowait root /usr/local/bin/stunnel stunnel /usr/local/etc/stunnel/imaps.conf
在這些狀況下,inetd-style程序負責綁定一個網絡套接字(上面的imaps),並在收到鏈接時將其傳遞給stunnel。所以你不但願 stunnel 有任何 accept 選項。全部的 Service Level 選項都應該放在全局選項部分,而不會出現[service_name]部分。參見例子部分的配置示例。
證書
每一個啓用TLS的守護進程都須要向對等方提供有效的X.509證書。它還須要一個私鑰來解密傳入的數據。獲取證書和私鑰的最簡單方法是使用免費的OpenSSL軟件包生成它們。您能夠在下面列出的頁面上找到更多的關於證書生成的信息。
.pem文件應包含未加密的私鑰和已簽名的證書(不是證書請求)。因此文件應該是這樣的:
-----BEGIN RSA PRIVATE KEY-----
[encoded key]
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
[encoded certificate]
-----END CERTIFICATE-----
隨機性
爲了讓TLS使用良好的隨機性,stunnel須要將PRNG(僞隨機數生成器)種子化。
依次加載如下源,直到收集到足夠的隨機數據爲止:
● 用RNDfile標誌指定的文件。
● 由RANDFILE環境變量指定的文件(若是已設置)。
● 若是未設置RANDFILE,則返回主目錄中的file.rnd。
● 編譯時用'--with random'指定的文件。
● 若是在Windows上運行,則屏幕的內容。
● 用EGD標誌指定的EGD套接字。
● 編譯時用「--with-egd sock」指定的EGD套接字。
● /dev/urandom設備。
請注意,在沒有控制檯用戶交互(鼠標移動、建立窗口等)的Windows計算機上,屏幕內容的可變性不能知足須要,你應該提供一個隨機文件以供RNDfile標誌使用。
注意,用RNDfile標誌指定的文件應該包含隨機數據——也就是說每次運行stunnel時,它應該包含不一樣的信息。除非使用RNDoverwrite標誌,不然會自動處理這個文件。若是你想手動更新這個文件,最新OpenSSL版本中的openssl rand命令會頗有用。
重要提示:若是/dev/urandom可用,那麼OpenSSL一般會在檢查隨機狀態時將PRNG隨其種子化。
在具備/ dev /urandom的系統上,即便OpenSSL位於上面列表的最底部,也可能會使用它,這是OpenSSL的行爲,而不是stunnel的行爲。
DH 參數
stunnel 4.40及更高版本包了含硬編碼的2048位DH參數。從stunnel 5.18開始,這些硬編碼的DH參數每24小時被自動生成的臨時DH參數取代,DH參數生成可能須要幾分鐘的時間。
另外,能夠在證書文件中指定靜態DH參數,這將禁用生成臨時DH參數:
openssl dhparam 2048 >> stunnel.pem
文件
/usr/local/etc/stunnel/stunnel.conf
stunnel 配置文件
BUGS
execArgs選項和Win32命令行不支持引號。
另見:
互聯網服務的訪問控制設施。
internet 'super-server'
http://www.stunnel.org/
stunnel 主頁
http://www.openssl.org/
OpenSSL項目站點
做者
Michał Trojnara
<Michal.Trojnara@stunnel.org>