Stunnel官方手册(中文翻译)

        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 = debugdebug = 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命令行不支持引号。

        另见:

tcpd(8)

互联网服务的访问控制设施。

inetd(8)

internet 'super-server'

http://www.stunnel.org/

stunnel 主页

http://www.openssl.org/

OpenSSL项目站点

        做者

Michał Trojnara

<Michal.Trojnara@stunnel.org>

相关文章
相关标签/搜索