STUNNEL(8) stunnel TLS Proxy STUNNEL(8)

stunnel.pl - تونل رمزنگاری سراسری TLS/SSL برای سرویس‌های شبکه

  • Unix: stunnel [FILE] | -fd N | -help | -version | -sockets | -options
  • WIN32: stunnel [ [ -install | -uninstall | -start | -stop | -reload | -reopen | -exit ] [-quiet] [FILE] ] | -help | -version | -sockets | -options

برنامه stunnel برای کار به عنوان یک پوشش‌دهنده رمزنگاری TLS بین کلاینت‌های راه دور و سرورهای محلی (قابل راه‌اندازی با inetd) یا سرورهای راه دور طراحی شده است. مفهوم این است که با داشتن دیمن‌های بدون پشتیبانی از TLS روی سیستم خود، می‌توانید به سادگی آن‌ها را به گونه‌ای پیکربندی کنید که با کلاینت‌ها از طریق کانال‌های امن TLS ارتباط برقرار کنند.

stunnel می‌تواند برای افزودن قابلیت TLS به دیمن‌های متداول inetd مانند سرورهای POP-3 و IMAP، به دیمن‌های مستقل مانند NNTP، SMTP و HTTP، و حتی برای تونل کردن PPP روی سوکت‌های شبکه بدون نیاز به تغییر در کد منبع استفاده شود.

•
FILE

استفاده از فایل پیکربندی مشخص‌شده

•
-fd N (فقط یونیکس)

خواندن فایل پیکربندی از توصیف‌گر فایل (file descriptor) مشخص‌شده

•
-help

چاپ منوی راهنمای stunnel

•
-version

چاپ نسخه stunnel و مقادیر پیش‌فرض زمان کامپایل

•
-sockets

چاپ گزینه‌های پیش‌فرض سوکت

•
-options

چاپ گزینه‌های پشتیبانی‌شده TLS

•
-install (فقط Windows NT و جدیدتر)

نصب سرویس NT

•
-uninstall (فقط Windows NT و جدیدتر)

حذف نصب سرویس NT

•
-start (فقط Windows NT و جدیدتر)

شروع سرویس NT

•
-stop (فقط Windows NT و جدیدتر)

توقف سرویس NT

•
-reload (فقط Windows NT و جدیدتر)

بارگذاری مجدد فایل پیکربندی سرویس در حال اجرای NT

•
-reopen (فقط Windows NT و جدیدتر)

باز کردن مجدد لاگ سرویس در حال اجرای NT

•
-exit (فقط Win32)

توقف برنامه در حال اجرا

•
-quiet (فقط Win32)

عدم نمایش پنجره‌های پیام

یک خط در فایل پیکربندی می‌تواند:

  • خالی باشد (نادیده گرفته می‌شود)
  • یک کامنت باشد که با نویسه `;' شروع می‌شود (نادیده گرفته می‌شود)
  • یک جفت `نام_گزینه = مقدار_گزینه' باشد
  • متن `[نام_سرویس]' باشد که نشان‌دهنده شروع تعریف یک سرویس است

پارامتر آدرس می‌تواند به صورت‌های زیر باشد:

  • شماره پورت
  • یک جفت آدرس (IPv4، IPv6 یا نام دامنه) و شماره پورت جدا شده با دو نقطه
  • مسیر سوکت یونیکس (فقط یونیکس)

•
chroot = DIRECTORY (فقط یونیکس)

پوشه ریشه کاری سیستم فایل

این گزینه پوشه‌ای را مشخص می‌کند که فرآیند stunnel بلافاصله پس از مقداردهی اولیه و قبل از شروع پذیرش اتصالات، در آن محبوس (chroot) می‌شود. مسیرهای مشخص‌شده در گزینه‌های CApath، CRLpath، pid و exec باید درون پوشه مشخص‌شده در chroot قرار داشته و نسبت به آن تعیین شوند.

برخی عملکردهای سیستم‌عامل ممکن است به فایل‌های اضافی در پوشه chroot نیاز داشته باشند:

  • تفکیک تاخیری DNS معمولاً به /etc/nsswitch.conf و /etc/resolv.conf نیاز دارد
  • محلی‌سازی منطقه زمانی در گزارش‌ها نیازمند فایل /etc/timezone است
  • برخی عملکردهای دیگر ممکن است به فایل‌های دستگاهی مانند /dev/zero یا /dev/null نیاز داشته باشند
•
compression = deflate | zlib | zstd | brotli

انتخاب الگوریتم فشرده‌سازی داده‌های ارسالی

پیش‌فرض: بدون فشرده‌سازی

فشرده‌سازی داده‌ها منحصراً برای پروتکل TLS 1.2 و نسخه‌های قدیمی‌تر در دسترس است. از زمان OpenSSL 1.1.0 نیاز به کاهش securityLevel به 1 دارد.

الگوریتم‌های zlib، zstd و brotli در پیکربندی پیش‌فرض OpenSSL غیرفعال هستند.

الگوریتم‌های zstd و brotli در OpenSSL 3.2 اضافه شده‌اند.

فشرده‌سازی داده‌ها در برنامه‌هایی که به مهاجم اجازه تزریق متن ساده دلخواه را می‌دهند یک ریسک امنیتی محسوب می‌شود.

الگوریتم deflate روش فشرده‌سازی استاندارد مطابق با RFC 1951 است.

توجه: فشرده‌سازی TLS می‌تواند حملات بازیابی متن آشکار مانند CRIME را در مواردی که داده‌های تحت کنترل مهاجم همراه با داده‌های محافظت‌شده فشرده می‌شوند، امکان‌پذیر سازد.

•
debug = [FACILITY.]LEVEL

میزان جزئیات لاگ‌گیری

سطح لاگ‌گیری را می‌توان با یکی از نام‌ها یا اعداد مشخص کرد: emerg (0)، alert (1)، crit (2)، err (3)، warning (4)، notice (5)، info (6) یا debug (7). پیام‌هایی با سطح کمتر یا مساوی (از نظر عددی) با مقدار مشخص‌شده ثبت می‌شوند. سطح پیش‌فرض notice (5) است.

اگرچه استفاده از debug = debug یا debug = 7 پرجزئیات‌ترین گزارش‌ها را تولید می‌کند، اما محتوای آن‌ها فقط برای توسعه‌دهندگان stunnel مفید است. تنها در صورتی از این سطح لاگ‌گیری استفاده کنید که توسعه‌دهنده stunnel هستید یا اطلاعات دقیقی را برای ارسال به پشتیبانی فنی آماده می‌کنید. در غیر این صورت، تلاش برای تحلیل محتوای لاگ‌ها تنها مایه سردرگمی بیشتر خواهد بود.

در صورتی که بخش (facility) مشخص نشده باشد، از مقدار پیش‌فرض daemon استفاده می‌شود. بخش‌ها در بستر Win32 پشتیبانی نمی‌شوند.

بزرگی و کوچکی حروف برای سطح و بخش نادیده گرفته می‌شود.

•
EGD = EGD_PATH (فقط یونیکس)

مسیر سوکت برنامه Entropy Gathering Daemon

این گزینه مسیر سوکت برنامه Entropy Gathering Daemon را مشخص می‌کند که برای مقداردهی اولیه مولد شبه‌تصادفی کتابخانه OpenSSL به کار می‌رود.

•
engine = auto | DEVICE_ID

انتخاب موتور رمزنگاری (cryptographic engine)

پیش‌فرض: بدون استفاده از موتورهای رمزنگاری

بخش «مثال‌ها» حاوی نمونه پیکربندی‌هایی با استفاده از موتورهای رمزنگاری است.

•
engineCtrl = COMMAND[:PARAMETER]

پیکربندی کنترل موتور رمزنگاری

•
engineDefault = TASK_LIST

فهرست وظایف OpenSSL که به موتور جاری واگذار می‌شوند

پارامتر یک لیست از وظایف OpenSSL جداشده با کاما است که باید به موتور رمزنگاری جاری واگذار شوند.

بسته به موتور مورد استفاده، وظایف زیر ممکن است در دسترس باشند: ALL، RSA، DSA، ECDH، ECDSA، DH، RAND، CIPHERS، DIGESTS، PKEY، PKEY_CRYPTO، PKEY_ASN1.

•
fips = yes | no

حالت FIPS 140-2

این گزینه به شما اجازه می‌دهد در صورتی که stunnel با پشتیبانی از FIPS 140-2 کامپایل شده باشد، ورود به حالت FIPS را غیرفعال کنید.

پیش‌فرض: no (از نسخه 5.00)

•
foreground = yes | quiet | no (فقط یونیکس)

حالت پیش‌زمینه

با فعال کردن این گزینه، stunnel به پس‌زمینه (daemon) منتقل نمی‌شود.

مقدار yes همچنین باعث می‌شود که پیام‌های تشخیصی علاوه بر خروجی‌های تعریف‌شده توسط گزینه‌های syslog و output، روی خروجی خطای استاندارد (stderr) نیز ثبت شوند.

•
iconActive = ICON_FILE (فقط رابط گرافیکی)

آیکون نمایش داده شده در صورت وجود اتصالات فعال به سرویس

در ویندوز، آیکون یک فایل .ico حاوی تصویری با ابعاد 16x16 پیکسل است.

•
iconError = ICON_FILE (فقط رابط گرافیکی)

آیکون نمایش داده شده در صورتی که فایل پیکربندی معتبری بارگذاری نشده باشد

در ویندوز، آیکون یک فایل .ico حاوی تصویری با ابعاد 16x16 پیکسل است.

•
iconIdle = ICON_FILE (فقط رابط گرافیکی)

آیکون نمایش داده شده در صورت عدم وجود اتصالات فعال به سرویس

در ویندوز، آیکون یک فایل .ico حاوی تصویری با ابعاد 16x16 پیکسل است.

•
log = append | overwrite

مدیریت فایل لاگ

این گزینه تعیین می‌کند که آیا گزارش‌های جدید به انتهای فایل لاگ (مشخص‌شده در گزینه output) اضافه شوند یا جایگزین فایل قبلی گردند.

پیش‌فرض: append

•
output = FILE

فایلی که گزارش‌ها به آن اضافه خواهند شد

استفاده از این گزینه موجب می‌شود که گزارش‌ها به فایل مشخص‌شده افزوده شوند.

برای هدایت خروجی به خروجی استاندارد (به عنوان مثال برای ثبت آن‌ها توسط برنامه splogger از بسته daemontools)، می‌توانید دستگاه /dev/stdout را به عنوان پارامتر تعیین کنید.

•
pid = FILE (فقط یونیکس)

مسیر فایل شناسه فرآیند (PID)

اگر آرگومان خالی باشد، فایلی ایجاد نخواهد شد.

در صورت تعریف دایرکتوری chroot، مسیر pid نسبت به آن پوشه در نظر گرفته می‌شود.

•
provider = PROVIDER_ID

شناسه ارائه‌دهنده (provider) مورد استفاده را مشخص می‌کند. مقدار PROVIDER_ID یک شناسه یکتا است که به ارائه‌دهنده خدمات رمزنگاری خاص اشاره دارد.

این گزینه نیازمند کتابخانه OpenSSL نسخه 3.0 یا جدیدتر است.

•
providerParameter = PROVIDER_ID:PARAMETER=VALUE

پارامتر مشخصی را برای ارائه‌دهنده تعیین‌شده تنظیم می‌کند. مقدار PROVIDER_ID ارائه‌دهنده را مشخص می‌کند، PARAMETER نام پارامتر و VALUE مقدار آن است. این گزینه امکان سفارشی‌سازی پیکربندی ارائه‌دهنده خدمات رمزنگاری انتخاب‌شده را فراهم می‌سازد.

این گزینه نیازمند کتابخانه OpenSSL نسخه 3.5 یا جدیدتر است.

•
RNDbytes = BYTES

تعداد بایت‌ها برای مقداردهی اولیه مولد شبه‌تصادفی

•
RNDfile = FILE

مسیر فایل حاوی داده‌های تصادفی

کتابخانه OpenSSL از داده‌های این فایل برای مقداردهی اولیه مولد شبه‌تصادفی استفاده می‌کند.

•
RNDoverwrite = yes | no

بازنویسی فایل با مقادیر شبه‌تصادفی جدید

پیش‌فرض: yes (بازنویسی شود)

•
service = SERVICE (فقط یونیکس)

نام سرویس

نام سرویس تعیین‌شده به عنوان نام سرویس برای مقداردهی اولیه syslog و همچنین برای کتابخانه TCP Wrapper در حالت inetd استفاده می‌شود. اگرچه از نظر فنی می‌توان از این گزینه در بخش سرویس‌ها استفاده کرد، اما کاربرد واقعی آن منحصراً در گزینه‌های سراسری است.

پیش‌فرض: stunnel

•
setEnv = VAR_NAME=VALUE

تغییر یا افزودن یک متغیر محیطی برای فرآیندهای فرزند. اگر VAR_NAME از قبل وجود داشته باشد، مقدار آن به‌روزرسانی می‌شود؛ در غیر این صورت یک متغیر جدید ایجاد خواهد شد. این اصلاح تنها روی فرآیندهای فرزند اجراشده اعمال می‌شود و بر محیط فعلی تأثیری ندارد.

•
syslog = yes | no (فقط یونیکس)

فعال‌سازی ثبت گزارش از طریق سازوکار syslog

پیش‌فرض: yes (فعال)

•
taskbar = yes | no (فقط WIN32)

فعال‌سازی آیکون در گوشه پایین سمت راست صفحه (ناحیه اعلان‌ها)

پیش‌فرض: yes (فعال)

هر بخش از پیکربندی سرویس با نام آن که در کروشه قرار می‌گیرد، آغاز می‌شود. نام سرویس برای کنترل دسترسی توسط کتابخانه libwrap (TCP wrappers) استفاده شده و همچنین امکان تفکیک سرویس‌های مختلف را در گزارش‌ها فراهم می‌کند.

اگر قرار است stunnel در حالت inetd استفاده شود، جایی که دریافت اتصال بر عهده برنامه دیگری است (معمولاً inetd، xinetd یا tcpserver)، بخش حالت INETD را در ادامه مطالعه فرمایید.

•
accept = [HOST:]PORT

گوش دادن به اتصالات روی آدرس و پورت مشخص‌شده

اگر آدرسی مشخص نشود، stunnel به طور پیش‌فرض روی تمام آدرس‌های IPv4 رابط‌های محلی گوش می‌دهد.

برای گوش دادن روی تمام آدرس‌های IPv6 از فرمت زیر استفاده کنید:

accept = :::port
•
CAengine = CA_ENGINE_ID

بارگذاری گواهی‌های معتبر مرجع صدور گواهی (CA) از یک موتور رمزنگاری

این گزینه امکان تعیین مکان فایل حاوی گواهی‌های مورد استفاده توسط گزینه verifyChain یا verifyPeer را فراهم می‌کند.

این گزینه می‌تواند چندین بار در یک بخش تکرار شود.

موتورهای پشتیبانی‌شده در حال حاضر: pkcs11، cng.

•
CApath = CA_DIR

بارگذاری گواهی‌های معتبر مرجع صدور گواهی از یک پوشه

این گزینه پوشه‌ای را مشخص می‌کند که stunnel در صورت استفاده از گزینه verifyChain یا verifyPeer در آن به جستجوی گواهی‌ها می‌پردازد. فایل‌های گواهی باید دارای نام‌های ویژه‌ای به صورت XXXXXXXX.0 باشند که در آن XXXXXXXX هش رمزنگاری نمایش DER نام سوژه گواهی است.

این گزینه همچنین می‌تواند برای ارائه گواهی root CA که برای اعتبارسنجی صحیح منگنه OCSP (OCSP stapling) در حالت سرور ضروری است، استفاده شود.

تابع هش در OpenSSL 1.0.0 تغییر یافته است. هنگام تغییر نسخه از OpenSSL 0.x.x به 1.x.x، باید دستور c_rehash را اجرا کنید.

اگر پوشه chroot تعریف شده باشد، مسیر CApath نسبت به آن پوشه در نظر گرفته می‌شود.

•
CAfile = CA_FILE

بارگذاری گواهی‌های معتبر مرجع صدور گواهی از یک فایل

این گزینه امکان تعیین مکان فایل حاوی گواهی‌های مورد استفاده توسط گزینه verifyChain یا verifyPeer را فراهم می‌کند.

این گزینه همچنین می‌تواند برای ارائه گواهی root CA که برای اعتبارسنجی صحیح منگنه OCSP (OCSP stapling) در حالت سرور ضروری است، استفاده شود.

•
CAstore = CA_URI

بارگذاری گواهی‌های معتبر مرجع صدور گواهی از منبع مشخص‌شده توسط URI

این گزینه امکان بارگذاری گواهی‌های CA را از یک مخزن خارجی پشتیبانی‌شده توسط سازوکار OSSL_STORE فراهم می‌کند، مانند یک ماژول PKCS#11 (مانند توکن سخت‌افزاری)، مخزن گواهی سیستم یا یک منبع شبکه.

این گزینه می‌تواند مستقل از CAfile و CApath استفاده شود و به طور مشابه برای اعتبارسنجی زنجیره گواهی با استفاده از گزینه verifyChain یا verifyPeer و همچنین برای اعتبارسنجی OCSP stapling در سمت سرور به کار می‌رود.

این گزینه نیازمند کتابخانه OpenSSL نسخه 3.0 یا جدیدتر است.

•
cert = CERT_FILE | URI

فایل حاوی زنجیره گواهی

این گزینه مکان فایل حاوی گواهی‌های مورد استفاده توسط برنامه stunnel برای احراز هویت در برابر طرف مقابل ارتباط را مشخص می‌کند. فایل باید شامل زنجیره کامل گواهی از گواهی سرور/کلاینت تا گواهی خودامضاشده Root CA باشد. فایل‌ها در قالب PEM یا P12 پشتیبانی می‌شوند.

وجود گواهی برای اجرای برنامه در حالت سرور الزامی است. در حالت کلاینت، گواهی اختیاری است.

گزینه cert می‌تواند چندین بار مشخص شود. نخستین گواهی یافت‌شده به عنوان گواهی سرور یا کلاینت استفاده می‌شود، در حالی که گواهی‌های بعدی به عنوان اعضای میانی زنجیره در نظر گرفته خواهند شد. این قابلیت نیازمند کتابخانه OpenSSL نسخه 1.0.2 یا جدیدتر است.

در صورت استفاده از یک موتور رمزنگاری یا provider، گزینه cert امکان انتخاب شناسه (PKCS#11 URI) گواهی مورد استفاده را فراهم می‌سازد.

توجه: استفاده از provider به OpenSSL نسخه 3.0 یا جدیدتر نیاز دارد.

•
checkEmail = EMAIL

آدرس ایمیل سوژه گواهی ارائه‌شده

یک بخش می‌تواند شامل چندین مورد از گزینه checkEmail باشد. گواهی‌ها در صورتی پذیرفته می‌شوند که بخش پیکربندی سوژه گواهی را بررسی نکند، یا آدرس ایمیل گواهی ارائه‌شده با یکی از آدرس‌های ایمیل تعیین‌شده توسط checkEmail مطابقت داشته باشد.

این گزینه نیازمند کتابخانه OpenSSL نسخه 1.0.2 یا جدیدتر است.

•
checkHost = HOST

نام هاست سوژه گواهی ارائه‌شده

یک بخش می‌تواند شامل چندین مورد از گزینه checkHost باشد. گواهی‌ها در صورتی پذیرفته می‌شوند که بخش پیکربندی سوژه گواهی را بررسی نکند، یا نام هاست گواهی ارائه‌شده با یکی از نام‌های مشخص‌شده با checkHost مطابقت داشته باشد.

این گزینه نیازمند کتابخانه OpenSSL نسخه 1.0.2 یا جدیدتر است.

•
checkIP = IP

آدرس IP سوژه گواهی ارائه‌شده

یک بخش می‌تواند شامل چندین مورد از گزینه checkIP باشد. گواهی‌ها در صورتی پذیرفته می‌شوند که بخش پیکربندی سوژه گواهی را بررسی نکند، یا آدرس IP گواهی ارائه‌شده با یکی از آدرس‌های IP مشخص‌شده با checkIP مطابقت داشته باشد.

این گزینه نیازمند کتابخانه OpenSSL نسخه 1.0.2 یا جدیدتر است.

•
ciphers = CIPHER_LIST

فهرست رمزهای مجاز برای پروتکل‌های SSLv2، SSLv3، TLSv1، TLSv1.1 و TLSv1.2

این گزینه بر فهرست پارامترهای رمزنگاری برای پروتکل TLSv1.3 تأثیری ندارد.

پارامتر این گزینه فهرستی از رمزهایی است که هنگام برقراری اتصالات جدید TLS استفاده می‌شوند، به عنوان مثال: DES-CBC3-SHA:IDEA-CBC-MD5

•
ciphersuites = CIPHERSUITES_LIST

فهرست پارامترهای رمزنگاری مجاز برای پروتکل TLSv1.3

پارامتر این گزینه فهرستی از پارامترهای رمزنگاری به ترتیب اولویت است.

از نسخه OpenSSL 3.0، گزینه ciphersuites رمزهای ناشناخته را نادیده می‌گیرد.

گزینه ciphersuites از زمان OpenSSL 1.1.1 در دسترس است.

پیش‌فرض: TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256

•
client = yes | no

حالت کلاینت (سرویس راه دور از TLS استفاده می‌کند)

پیش‌فرض: no (حالت سرور)

•
config = COMMAND[:PARAMETER]

دستور پیکربندی OpenSSL

دستور پیکربندی OpenSSL با پارامتر مشخص‌شده اجرا می‌شود. این امر صدور دستورات پیکربندی OpenSSL را از طریق فایل پیکربندی stunnel ممکن می‌سازد. دستورات در دسترس در صفحه راهنمای SSL_CONF_cmd(3ssl) شرح داده شده‌اند.

با استفاده مکرر از دستور config می‌توان گزینه‌های متعددی از OpenSSL را مشخص کرد.

به جای غیرفعال کردن config = Curves:list_curves، از گزینه curves برای تنظیم منحنی‌های بیضوی استفاده کنید.

این گزینه نیازمند کتابخانه OpenSSL نسخه 1.0.2 یا جدیدتر است.

•
connect = [HOST:]PORT

اتصال به سرور راه دور روی پورت مشخص‌شده

اگر آدرسی مشخص نشود، stunnel به طور پیش‌فرض به سرور محلی متصل می‌شود.

برای دستیابی به دسترسی‌پذیری بالا یا توزیع بار میان چندین سرور، می‌توان از این دستور چندین بار در یک بخش استفاده کرد.

•
CRLpath = CRL_DIR

پوشه فهرست‌های ابطال گواهی (CRL)

این گزینه پوشه‌ای را مشخص می‌کند که stunnel در آن به جستجوی فهرست‌های CRL مورد استفاده توسط گزینه‌های verifyChain و verifyPeer، و همچنین توسط CRLcheckChain برای بررسی کامل زنجیره گواهی می‌پردازد. فایل‌های لیست CRL باید نام‌های خاصی به صورت XXXXXXXX.r0 داشته باشند که در آن XXXXXXXX مقدار هش فهرست CRL است.

تابع هش در OpenSSL 1.0.0 تغییر یافته است. هنگام تغییر نسخه از OpenSSL 0.x.x به 1.x.x باید دستور c_rehash را اجرا کنید.

اگر پوشه chroot تعریف شده باشد، مسیر CRLpath نسبت به آن پوشه در نظر گرفته می‌شود.

•
CRLfile = CRL_FILE

فایل فهرست‌های ابطال گواهی (CRL)

این گزینه مکان فایل حاوی فهرست‌های CRL مورد استفاده توسط گزینه‌های verifyChain و verifyPeer، و همچنین CRLcheckChain را برای بررسی کامل زنجیره گواهی مشخص می‌کند.

•
CRLcheckChain = yes | no

بررسی فهرست‌های CRL برای زنجیره کامل گواهی‌های طرف مقابل ارتباط

این گزینه نیازمند تنظیم verifyChain = yes و مشخص کردن منبع لیست‌های CRL با استفاده از CRLfile یا CRLpath است.

به طور پیش‌فرض، لیست‌های CRL تنها برای گواهی نهاد پایانی (برگ) طرف مقابل ارتباط بررسی می‌شوند. تنظیم CRLcheckChain = yes بررسی لیست‌های CRL را برای هر گواهی در زنجیره صادرکنندگان تأییدشده نیز فعال می‌کند. در حالت زنجیره کامل، اگر لیست CRL صادرکننده مربوطه موجود نباشد یا منقضی یا نامعتبر باشد، اعتبارسنجی ناموفق خواهد بود.

برای زنجیره‌ای مانند Root CA -> Intermediate CA -> Leaf Certificate، لیست CRL صادرشده توسط Intermediate CA برای بررسی گواهی پایانی و لیست CRL صادرشده توسط Root CA برای بررسی گواهی میانی مورد نیاز است.

پیش‌فرض: no

•
curves = list

منحنی‌های ECDH جداشده با `:'

توجه: این گزینه تنها بر سوکت‌ها در حالت سرور تأثیر می‌گذارد.

نسخه‌های OpenSSL قدیمی‌تر از 1.1.1 تنها اجازه استفاده از یک منحنی را می‌دهند.

فهرست منحنی‌های در دسترس را می‌توان با دستور زیر به دست آورد:

openssl ecparam -list_curves

پیش‌فرض:

X25519:P-256:X448:P-521:P-384 (از زمان OpenSSL 1.1.1 به بعد)
prime256v1 (OpenSSL قدیمی‌تر از 1.1.1)
•
logId = TYPE

نوع شناسه اتصال کلاینت

این شناسه امکان تفکیک ورودی‌های ثبت‌شده در لاگ را برای تک‌تک اتصالات فراهم می‌سازد.

انواع پشتیبانی‌شده در حال حاضر:

•
sequential

شماره ترتیبی اتصال تنها در یک نمونه در حال اجرای برنامه stunnel یکتا است، اما بسیار کوتاه است. این حالت به ویژه برای بررسی و تحلیل دستی لاگ‌ها مفید است.

•
unique

این نوع شناسه به صورت سراسری یکتا است، اما به مراتب طولانی‌تر از شماره ترتیبی اتصال است. این حالت به ویژه برای پردازش و تحلیل خودکار لاگ‌ها مناسب است.

•
thread

شناسه ریسه سیستم‌عامل، نه یکتاست (حتی در یک نمونه واحد از برنامه stunnel) و نه کوتاه. این نوع برای عیب‌یابی مشکلات نرم‌افزار یا خطاهای پیکربندی کاربرد دارد.

•
process

شناسه فرآیند (PID) ممکن است در حالت inetd کاربرد داشته باشد.

پیش‌فرض: sequential

•
debug = 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

تأخیر در تفکیک آدرس DNS مشخص‌شده در گزینه connect

این گزینه برای DNS پویا یا زمانی که سرویس DNS در هنگام آغاز به کار برنامه stunnel در دسترس نیست (مانند کلاینت‌های VPN یا اتصالات شماره‌گیری) مفید است.

اگر تفکیک هر یک از آدرس‌های connect برای یک سرویس ناموفق باشد، تفکیک تاخیری DNS به طور خودکار فعال می‌گردد.

تفکیک تاخیری آدرس به طور خودکار گزینه failover = prio را فعال می‌کند.

پیش‌فرض: no

•
engineId = DEVICE_NUMBER

انتخاب موتور رمزنگاری برای سرویس

•
engineNum = DEVICE_NUMBER

انتخاب موتور رمزنگاری برای سرویس

دستگاه‌ها از شماره 1 به بالا شماره‌گذاری می‌شوند.

•
exec = PROGRAM_PATH

اجرای یک برنامه محلی منطبق با سوپردیمن inetd

اگر پوشه chroot تعریف شده باشد، مسیر exec نسبت به آن پوشه در نظر گرفته می‌شود.

روی پلتفرم‌های یونیکس متغیرهای محیطی زیر مقداردهی می‌شوند: REMOTE_HOST، REMOTE_PORT، SSL_CLIENT_DN، SSL_CLIENT_I_DN.

•
execArgs = $0 $1 $2 ...

آرگومان‌های ارسالی به گزینه exec شامل نام برنامه ($0)

نقل‌قول (quoting) در نسخه فعلی برنامه پشتیبانی نمی‌شود. آرگومان‌ها با هر تعداد نویسه فاصله سفید از یکدیگر تفکیک می‌شوند.

•
failover = rr | prio

راهبرد انتخاب سرورهای تعیین‌شده توسط پارامترهای "connect".

•
rr

نوبت‌گردشی (round robin) - توزیع متوازن و عادلانه بار

•
prio

اولویت (priority) - استفاده از ترتیب گزینه‌ها در فایل پیکربندی

پیش‌فرض: prio

•
ident = USERNAME

اعتبارسنجی نام کاربری راه دور با استفاده از پروتکل IDENT (مطابق با RFC 1413)

•
include = DIRECTORY

خواندن قطعات فایل‌های پیکربندی از پوشه مشخص‌شده

فایل‌ها به ترتیب صعودی الفبایی نام‌هایشان خوانده و اعمال می‌شوند. قاعده نام‌گذاری پیشنهادی برای فایل‌ها:

برای گزینه‌های سراسری:

00-global.conf

برای گزینه‌های محلی سرویس:

01-service.conf
02-service.conf
•
key = KEY_FILE | URI

کلید خصوصی مربوط به گواهی مشخص‌شده در گزینه cert

کلید خصوصی برای احراز هویت دارنده گواهی الزامی است. از آنجا که این کلید باید محرمانه بماند، دسترسی خواندن آن باید منحصراً در اختیار مالک فایل باشد. در سیستم‌های یونیکس این امر با دستور زیر حاصل می‌شود:

chmod 600 keyfile

در صورت استفاده از یک موتور رمزنگاری یا provider، گزینه key امکان انتخاب شناسه (PKCS#11 URI) کلید خصوصی مورد استفاده را فراهم می‌سازد.

توجه: استفاده از provider به OpenSSL نسخه 3.0 یا جدیدتر نیاز دارد.

پیش‌فرض: مقدار گزینه cert

•
libwrap = yes | no

فعال یا غیرفعال کردن استفاده از فایل‌های /etc/hosts.allow و /etc/hosts.deny.

پیش‌فرض: no (از نسخه 5.00 به بعد)

•
local = HOST

آدرس IP مبدأ برای برقراری اتصالات راه دور

به طور پیش‌فرض، از آدرس IP خارجی‌ترین رابط به سمت سرور مقصد استفاده می‌شود.

•
OCSP = URL

نشانی پاسخ‌دهنده (responder) پروتکل OCSP برای اعتبارسنجی گواهی طرف مقابل

•
OCSPaia = yes | no

اعتبارسنجی گواهی‌ها با استفاده از پاسخ‌دهنده‌های AIA

گزینه OCSPaia امکان اعتبارسنجی گواهی‌ها را از طریق فهرست نشانی‌های اینترنتی پاسخ‌دهنده‌های OCSP موجود در افزونه‌های AIA (دسترسی به اطلاعات مرجع - Authority Information Access) فراهم می‌کند.

•
OCSPflag = OCSP_FLAG

فلگ پاسخ‌دهنده OCSP

فلگ‌های پشتیبانی‌شده در حال حاضر: NOCERTS، NOINTERN، NOSIGS، NOCHAIN، NOVERIFY، NOEXPLICIT، NOCASIGN، NODELEGATED، NOCHECKS، TRUSTOTHER، RESPID_KEY، NOTIME

برای مشخص کردن چندین فلگ، گزینه OCSPflag را چندین بار تکرار کنید.

•
OCSPnonce = yes | no

ارسال و بررسی نانس OCSP (OCSP nonce)

گزینه OCSPnonce پروتکل OCSP را در برابر حملات بازپخش (replay attacks) محافظت می‌کند. با توجه به بار پردازشی، افزونه נانس معمولاً تنها توسط پاسخ‌دهنده‌های OCSP داخلی (مثلاً سازمانی) پشتیبانی می‌شود و نه عمومی.

•
OCSPrequire = yes | no

الزام به دریافت پاسخ قطعی از پاسخ‌دهنده OCSP

غیرفعال کردن این گزینه امکان پذیرش اتصال را در صورت عدم دریافت پاسخ قاطع OCSP از منگنه کردن (stapling) یا درخواست مستقیم، ممکن می‌سازد.

پیش‌فرض: yes

•
options = SSL_OPTIONS

گزینه‌های کتابخانه OpenSSL

پارامتر نام گزینه مطابق با توضیحات SSL_CTX_set_options(3ssl) بدون پیشوند SSL_OP_ است. دستور stunnel -options گزینه‌های مجاز در ترکیب جاری برنامه stunnel و کتابخانه OpenSSL را نمایش می‌دهد.

برای تعیین چندین گزینه، از options به صورت مکرر استفاده کنید. می‌توان برای غیرفعال کردن یک گزینه، قبل از نام آن یک علامت خط تیره ("-") قرار داد.

به عنوان مثال، برای حفظ سازگاری با اشکالات پیاده‌سازی TLS در برنامه Eudora می‌توان از گزینه زیر استفاده کرد:

options = DONT_INSERT_EMPTY_FRAGMENTS

پیش‌فرض:

options = NO_SSLv2
options = NO_SSLv3

از زمان OpenSSL 1.1.0، به جای غیرفعال کردن نگارش‌های خاص پروتکل TLS از گزینه‌های sslVersionMax یا sslVersionMin استفاده کنید.

•
protocol = PROTOCOL

مذاکره TLS با پروتکل کاربردی مشخص‌شده

این گزینه مذاکره اولیه رمزنگاری TLS را برای پروتکل کاربردی تعیین‌شده فعال می‌کند. از گزینه protocol نباید برای رمزنگاری TLS روی پورت مجزا استفاده شود.

پروتکل‌های پشتیبانی‌شده در حال حاضر:

•
cifs

افزونه غیرمستند پروتکل CIFS که توسط سرور Samba پشتیبانی می‌شد. پشتیبانی از این افزونه در نسخه 3.0.0 سرور Samba متوقف گردید.

•
capwin

پشتیبانی از برنامه https://www.capwin.org

•
capwinctrl

پشتیبانی از برنامه https://www.capwin.org

این پروتکل تنها در حالت کلاینت پشتیبانی می‌شود.

•
connect

مذاکره RFC 2817 - Upgrading to TLS Within HTTP/1.1، بخش 5.2 - Requesting a Tunnel with CONNECT

این پروتکل تنها در حالت کلاینت پشتیبانی می‌شود.

•
imap

مذاکره RFC 2595 - Using TLS with IMAP, POP3 and ACAP

•
ldap

مذاکره RFC 2830 - Lightweight Directory Access Protocol (v3): Extension for Transport Layer Security

•
nntp

مذاکره RFC 4642 - Using Transport Layer Security (TLS) with Network News Transfer Protocol (NNTP)

این پروتکل تنها در حالت کلاینت پشتیبانی می‌شود.

•
pgsql
•
pop3

مذاکره RFC 2449 - POP3 Extension Mechanism

•
proxy

انتقال IP اصلی کلاینت با استفاده از نگارش 1 پروتکل HAProxy PROXY https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt

•
smtp

مذاکره RFC 2487 - SMTP Service Extension for Secure SMTP over TLS

•
socks

پروتکل SOCKS در نگارش‌های 4، 4a و 5 پشتیبانی می‌شود. پروتکل SOCKS درون پروتکل TLS کپسوله‌سازی می‌شود، بنابراین آدرس سرور مقصد برای مهاجمی که ترافیک شبکه را رهگیری می‌کند آشکار نخواهد بود.

https://www.openssh.com/txt/socks4.protocol

https://www.openssh.com/txt/socks4a.protocol

دستور BIND پروتکل SOCKS پشتیبانی نمی‌شود. مقدار ارسال‌شده برای پارامتر USERID نادیده گرفته می‌شود.

بخش «مثال‌ها» شامل نمونه پیکربندی‌های یک VPN مبتنی بر پروتکل رمزنگاری‌شده SOCKS است.

•
protocolAuthentication = AUTHENTICATION

نوع احراز هویت برای مذاکره پروتکل

این گزینه منحصراً در پروتکل‌های کلاینت `connect' و `smtp' پشتیبانی می‌شود.

در پروتکل `connect' روش‌های احراز هویت `basic' و `ntlm' پشتیبانی می‌شوند. روش پیش‌فرض احراز هویت در پروتکل `connect' برابر `basic' است.

در پروتکل `smtp' روش‌های احراز هویت `plain' و `login' پشتیبانی می‌شوند. روش پیش‌فرض احراز هویت در پروتکل `smtp' برابر `plain' است.

•
protocolDomain = DOMAIN

دامنه برای مذاکره پروتکل

در نسخه فعلی، این گزینه منحصراً در پروتکل `connect' کاربرد دارد.

•
protocolHeader = HEADER

هدر برای مذاکره پروتکل

در نسخه فعلی، این گزینه منحصراً در پروتکل `connect' کاربرد دارد.

•
protocolHost = HOST

آدرس هاست برای مذاکره پروتکل

برای پروتکل `connect'، گزینه protocolHost سرور مقصد TLS را که پروکسی باید به آن متصل شود تعیین می‌کند. آدرس سرور پروکسی که stunnel به آن متصل می‌شود باید با گزینه connect مشخص گردد.

برای پروتکل `smtp'، گزینه protocolHost مقدار دستور HELO/EHLO را که هنگام مذاکره کلاینت ارسال می‌شود تعیین می‌کند.

•
protocolPassword = PASSWORD

گذرواژه برای مذاکره پروتکل

این گزینه منحصراً در پروتکل‌های کلاینت `connect' و `smtp' پشتیبانی می‌شود.

•
protocolUsername = USERNAME

نام کاربری برای مذاکره پروتکل

این گزینه منحصراً در پروتکل‌های کلاینت `connect' و `smtp' پشتیبانی می‌شود.

•
PSKidentity = IDENTITY

شناسه کلاینت در روش PSK (کلید پیش‌اشتراکی)

گزینه PSKidentity می‌تواند در بخش‌های کلاینت برای انتخاب هویت مورد استفاده در احراز هویت PSK به کار رود. این گزینه در بخش‌های سرور نادیده گرفته می‌شود.

پیش‌فرض: نخستین شناسه تعریف‌شده در فایل PSKsecrets

•
PSKsecrets = FILE

فایل حاوی شناسه‌ها و کلیدهای PSK

هر خط از فایل دارای قالب زیر است:

IDENTITY:KEY

کلیدهای هگزادسیمال به طور خودکار به داده دودویی تبدیل می‌شوند. کلید باید حداقل ۱۶ بایت باشد که در صورت هگزادسیمال معادل حداقل ۳۲ نویسه است. دسترسی خواندن یا نوشتن این فایل باید کاملاً محدود شود.

•
pty = yes | no (فقط یونیکس)

تخصیص شبه‌ترمینال (pseudo-terminal) برای برنامه اجرا شده توسط گزینه `exec'

•
redirect = [HOST:]PORT

هدایت مجدد کلاینتی که احراز هویت آن با گواهی ناموفق بوده است

این گزینه تنها در حالت سرور عمل می‌کند. بخشی از مذاکرات پروتکل با گزینه redirect ناسازگار هستند.

•
renegotiation = yes | no

اجازه مذاکره مجدد (renegotiation) TLS

کاربردهای مذاکره مجدد TLS شامل برخی سناریوهای احراز هویت و تجدید کلیدها در اتصالات طولانی‌مدت است.

از سوی دیگر، این ویژگی ممکن است حمله منع سرویس (DoS) پیش‌پاافتاده‌ای را با تحمیل بار پردازشی به CPU تسهیل کند:

https://vincent.bernat.im/en/blog/2011-ssl-dos-mitigation.html

شایان توجه است که مسدود ساختن مذاکره مجدد TLS به طور کامل مانع این حمله نمی‌شود.

پیش‌فرض: yes (در صورت پشتیبانی توسط OpenSSL)

•
reset = yes | no

اعلام رخداد خطا با استفاده از فلگ TCP RST

این گزینه روی برخی بسترها پشتیبانی نمی‌شود.

پیش‌فرض: yes

•
retry = yes | no | DELAY

اتصال مجدد بخش connect+exec پس از قطع ارتباط

مقدار پارامتر DELAY مدت زمان انتظار بر حسب میلی‌ثانیه را پیش از تلاش مجدد تعیین می‌کند. مقدار "retry = yes" معادل "retry = 1000" است.

پیش‌فرض: no

•
securityLevel = LEVEL

تنظیم سطح امنیت

معنای هر یک از سطوح در ادامه تشریح شده است:

•
سطح 0

همه چیز مجاز است.

•
سطح 1

سطح امنیتی که حداقل ۸۰ بیت امنیت را تضمین می‌کند. هیچ پارامتر رمزنگاری با امنیت کمتر از ۸۰ بیت مجاز به استفاده نیست. بنابراین کلیدهای RSA، DSA و DH با طول کمتر از ۱۰۲۴ بیت و همچنین کلیدهای ECC کوتاه‌تر از ۱۶۰ بیت و کلیه مجموعه‌های رمز صادراتی (export) ممنوع هستند. استفاده از SSLv2 ممنوع است. کلیه لیست‌های پارامترهای رمزنگاری که از MD5 برای MAC استفاده می‌کنند ممنوع می‌باشند. از زمان OpenSSL 3.0، نسخه‌های TLS قدیمی‌تر از 1.2 غیرفعال شده‌اند.

•
سطح 2

سطح امنیتی که ۱۱۲ بیت امنیت را تضمین می‌کند. بر این اساس کلیدهای RSA، DSA و DH با طول کمتر از ۲۰۴۸ بیت و کلیدهای ECC کوتاه‌تر از ۲۲۴ بیت ممنوع هستند. علاوه بر ممنوعیت‌های سطح ۱، استفاده از مجموعه‌های رمزی که از RC4 استفاده می‌کنند نیز ممنوع است. فشرده‌سازی غیرفعال است. استفاده از SSLv3 در نسخه‌های OpenSSL قدیمی‌تر از 3.0 ممنوع می‌باشد.

•
سطح 3

سطح امنیتی که ۱۲۸ بیت امنیت را تضمین می‌کند. بر این اساس کلیدهای RSA، DSA و DH با طول کمتر از ۳۰۷۲ بیت و کلیدهای ECC کوتاه‌تر از ۲۵۶ بیت ممنوع هستند. علاوه بر ممنوعیت‌های سطح ۲، استفاده از مجموعه‌های رمزی که رازداری رو به جلو (forward secrecy) را فراهم نمی‌کنند نیز ممنوع است. بلیت‌های نشست (session tickets) غیرفعال هستند. نسخه‌های TLS قدیمی‌تر از 1.1 در نگارش‌های OpenSSL قبل از 3.0 ممنوع می‌باشند.

•
سطح 4

سطح امنیتی که ۱۹۲ بیت امنیت را تضمین می‌کند. بر این اساس کلیدهای RSA، DSA و DH با طول کمتر از ۷۶۸۰ بیت و کلیدهای ECC کوتاه‌تر از ۳۸۴ بیت ممنوع هستند. لیست‌های پارامترهای رمزنگاری که از SHA1 برای MAC استفاده می‌کنند ممنوع می‌باشند. نسخه‌های TLS قدیمی‌تر از 1.2 در نگارش‌های OpenSSL قبل از 3.0 ممنوع هستند.

•
سطح 5

سطح امنیتی که ۲۵۶ بیت امنیت را تضمین می‌کند. بر این اساس کلیدهای RSA، DSA و DH با طول کمتر از ۱۵۳۶۰ بیت و کلیدهای ECC کوتاه‌تر از ۵۱۲ بیت ممنوع هستند.

•
پیش‌فرض: 2

گزینه securityLevel از زمان OpenSSL 1.1.0 در دسترس است.

•
requireCert = yes | no

الزام ارائه گواهی کلاینت برای گزینه‌های verifyChain یا verifyPeer

هنگامی که گزینه requireCert روی no تنظیم شده باشد، stunnel اتصالات کلاینت‌هایی را که گواهی ارائه نکرده‌اند می‌پذیرد.

هر دو گزینه verifyChain = yes و verifyPeer = yes به طور خودکار مقدار requireCert را برابر yes قرار می‌دهند.

پیش‌فرض: no

•
setgid = GROUP_ID (فقط یونیکس)

شناسه گروه یونیکس

به عنوان گزینه سراسری: گروهی که برنامه stunnel با دسترسی‌های آن اجرا خواهد شد.

به عنوان گزینه سرویس: گروه سوکت یونیکس ایجادشده توسط گزینه "accept".

•
setuid = USER_ID (فقط یونیکس)

شناسه کاربر یونیکس

به عنوان گزینه سراسری: کاربری که برنامه stunnel با دسترسی‌های آن اجرا خواهد شد.

به عنوان گزینه سرویس: مالک سوکت یونیکس ایجادشده توسط گزینه "accept".

•
sessionCacheSize = CACHE_SIZE

اندازه حافظه نهان (کش) نشست‌های TLS

این پارامتر حداکثر تعداد ورودی‌های حافظه نهان داخلی نشست را مشخص می‌کند.

مقدار 0 به معنای نامحدود بودن اندازه حافظه نهان است. این مقدار برای سیستم‌های عملیاتی به دلیل ریسک بروز حملات منع سرویس (DoS) از طریق اتمام حافظه RAM توصیه نمی‌شود.

•
sessionCacheTimeout = SECONDS

مدت زمان انقضای حافظه نهان نشست‌های TLS

این پارامتر مدت زمان بر حسب ثانیه را مشخص می‌کند که پس از آن نشست TLS از حافظه نهان حذف می‌گردد.

•
sessionResume = yes | no

اجازه یا عدم اجازه برای ازسرگیری نشست (session resumption)

پیش‌فرض: yes

•
sessiond = HOST:PORT

آدرس سرور sessiond - سرور حافظه نهان نشست‌های TLS

•
sni = SERVICE_NAME:SERVER_NAME_PATTERN (حالت سرور)

استفاده از سرویس به عنوان سرویس زیرمجموعه (سرور مجازی) برای افزونه Server Name Indication در TLS (مطابق با RFC 3546).

مقدار SERVICE_NAME به سرویس والد اشاره دارد که اتصالات کلاینت‌ها را از طریق گزینه accept دریافت می‌کند. مقدار SERVER_NAME_PATTERN نام سرور مجازی را مشخص می‌کند. این الگو می‌تواند با نویسه `*' آغاز شود، به عنوان مثال: ’*.example.com". معمولاً چندین سرویس زیرمجموعه به یک سرویس والد واحد مرتبط می‌شوند. گزینه sni همچنین می‌تواند چندین بار در چارچوب یک سرویس زیرمجموعه تعریف شود.

نه سرویس والد و نه سرویس زیرمجموعه نباید در حالت کلاینت پیکربندی شوند.

گزینه connect در سرویس زیرمجموعه در صورت همراهی با گزینه protocol نادیده گرفته می‌شود، زیرا در این حالت اتصال به سرور راه دور پیش از مذاکره TLS برقرار می‌گردد.

احراز هویت با استفاده از کتابخانه libwrap دو بار انجام می‌پذیرد: ابتدا برای سرویس والد پس از دریافت اتصال TCP، و سپس برای سرویس زیرمجموعه در حین مذاکره TLS.

گزینه sni از زمان OpenSSL 1.0.0 در دسترس است.

•
sni = SERVER_NAME (حالت کلاینت)

استفاده از پارامتر به عنوان مقدار افزونه Server Name Indication در پروتکل TLS (مطابق با RFC 3546).

مقدار خالی برای پارامتر SERVER_NAME ارسال افزونه SNI را غیرفعال می‌سازد.

گزینه sni از زمان OpenSSL 1.0.0 در دسترس است.

•
socket = a|l|r:OPTION=VALUE[:VALUE]

تنظیم گزینه روی سوکت پذیرنده/محلی/راه دور

برای گزینه‌های linger مقادیر به صورت l_onoff:l_linger هستند. برای گزینه‌های time مقادیر به صورت tv_sec:tv_usec می‌باشند.

مثال‌ها:

socket = l:SO_LINGER=1:60
    تنظیم مهلت انقضای یک دقیقه‌ای
    هنگام بستن سوکت محلی
socket = r:SO_OOBINLINE=yes
    قرار دادن داده‌های خارج از باند (out-of-band)
    مستقیماً در جریان داده‌های ورودی
    برای سوکت‌های راه دور
socket = a:SO_REUSEADDR=no
    غیرفعال کردن استفاده مجدد از پورت
    (به طور پیش‌فرض فعال است)
socket = a:SO_BINDTODEVICE=lo
    پذیرش اتصالات منحصراً روی
    رابط محلی (loopback)
•
sslVersion = SSL_VERSION

نسخه پروتکل TLS

نسخه‌های پشتیبانی‌شده: all، SSLv2، SSLv3، TLSv1، TLSv1.1، TLSv1.2، TLSv1.3

در دسترس بودن پروتکل‌های خاص به نگارش OpenSSL مورد استفاده بستگی دارد. نسخه‌های قدیمی‌تر OpenSSL از پروتکل‌های TLSv1.1، TLSv1.2، TLSv1.3 پشتیبانی نمی‌کنند. نسخه‌های جدیدتر OpenSSL از پروتکل SSLv2 پشتیبانی نمی‌کنند.

پروتکل‌های منسوخ‌شده SSLv2 و SSLv3 به طور پیش‌فرض غیرفعال هستند.

از زمان OpenSSL 1.1.0، تنظیم

sslVersion = SSL_VERSION

معادل گزینه‌های زیر است:

sslVersionMax = SSL_VERSION
sslVersionMin = SSL_VERSION
•
sslVersionMax = SSL_VERSION

حداکثر نسخه پشتیبانی‌شده پروتکل TLS

نسخه‌های پشتیبانی‌شده: all، SSLv3، TLSv1، TLSv1.1، TLSv1.2، TLSv1.3

مقدار all تمامی نسخه‌های پروتکل را تا حداکثر نسخه پشتیبانی‌شده توسط کتابخانه OpenSSL فعال می‌سازد.

در دسترس بودن پروتکل‌های خاص به نگارش OpenSSL مورد استفاده وابسته است.

گزینه sslVersionMax از زمان OpenSSL 1.1.0 در دسترس است.

پیش‌فرض: all

•
sslVersionMin = SSL_VERSION

حداقل نسخه پشتیبانی‌شده پروتکل TLS

نسخه‌های پشتیبانی‌شده: all، SSLv3، TLSv1، TLSv1.1، TLSv1.2، TLSv1.3

مقدار all تمامی نسخه‌های پروتکل را تا حداقل نسخه پشتیبانی‌شده توسط کتابخانه OpenSSL فعال می‌سازد.

در دسترس بودن پروتکل‌های خاص به نگارش OpenSSL مورد استفاده وابسته است.

گزینه sslVersionMin از زمان OpenSSL 1.1.0 در دسترس است.

پیش‌فرض: TLSv1

•
stack = BYTES (به استثنای مدل FORK)

اندازه پشته پردازنده برای ریسه‌های ایجادشده

پشته بیش از حد بزرگ میزان مصرف حافظه مجازی را افزایش می‌دهد. پشته بسیار کوچک ممکن است سبب بروز اختلال در پایداری برنامه گردد.

پیش‌فرض: 65536 بایت (کافی برای پلتفرم‌های آزمایش‌شده)

•
ticketKeySecret = SECRET

کلید متقارن هگزادسیمال مورد استفاده سرور برای تضمین محرمانگی بلیت‌های نشست

بلیت‌های نشست تعریف‌شده در RFC 5077 قابلیت ارتقایافته‌ای برای ازسرگیری نشست ارائه می‌کنند که در آن نیازی به حفظ وضعیت نشست توسط سرور نیست.

استفاده همزمان از گزینه‌های ticketKeySecret و ticketMacSecret امکان ازسرگیری نشست را روی کلاستری از سرورها یا پس از راه‌اندازی مجدد سرور میسر می‌سازد.

کلید باید به اندازه ۱۶ یا ۳۲ بایت باشد که دقیقاً معادل ۳۲ یا ۶۴ رقم هگزادسیمال است. بایت‌ها می‌توانند به صورت اختیاری با دو نقطه از هم جدا شوند.

این گزینه منحصراً در حالت سرور عمل می‌کند.

گزینه ticketKeySecret از زمان OpenSSL 1.0.0 در دسترس است.

غیرفعال‌سازی گزینه NO_TICKET برای پشتیبانی از بلیت‌های نشست در OpenSSL قدیمی‌تر از 1.1.1 الزامی است، اما این گزینه با redirect ناسازگار است.

•
ticketMacSecret = SECRET

کلید متقارن هگزادسیمال مورد استفاده سرور برای تضمین یکپارچگی بلیت‌های نشست

کلید باید به اندازه ۱۶ یا ۳۲ بایت باشد که دقیقاً معادل ۳۲ یا ۶۴ رقم هگزادسیمال است. بایت‌ها می‌توانند به صورت اختیاری با دو نقطه از هم جدا شوند.

این گزینه منحصراً در حالت سرور عمل می‌کند.

گزینه ticketMacSecret از زمان OpenSSL 1.0.0 در دسترس است.

•
TIMEOUTbusy = SECONDS

مدت زمان انتظار برای دریافت داده‌های مورد انتظار

•
TIMEOUTclose = SECONDS

مدت زمان انتظار برای اعلان close_notify (در صورتی که کلاینت MSIE است روی 0 تنظیم شود)

•
TIMEOUTconnect = SECONDS

مدت زمان انتظار برای برقراری اتصال

•
TIMEOUTidle = SECONDS

حداکثر مدت زمان مجاز برای باز نگه داشتن یک اتصال بیکار

•
TIMEOUTocsp = SECONDS

مدت زمان انتظار برای برقراری اتصال با سرور پاسخ‌دهنده OCSP

•
transport = tcp | udp

انتخاب پروتکل لایه انتقال

مقادیر پشتیبانی‌شده:

•
tcp

پروتکل استاندارد TLS روی بستر TCP (پیش‌فرض).

•
udp

پروتکل DTLS روی بستر UDP.

هر دیتاگرام یک اتصال منطقی جدید را در چارچوب سرویس ایجاد می‌کند. سرور برای هر کلاینت از یک سوکت متصل مجزا استفاده کرده و کوکی‌های DTLS از حملات منع سرویس توزیع‌شده (DDoS) بازتابی محافظت می‌کنند.

پیش‌فرض: tcp

•
transparent = none | source | destination | both (فقط یونیکس)

حالت پروکسی شفاف روی پلتفرم‌های پشتیبانی‌شده

مقادیر پشتیبانی‌شده:

•
none

غیرفعال کردن پشتیبانی از پروکسی شفاف. این مقدار پیش‌فرض است.

•
source

بازنویسی آدرس مبدأ به گونه‌ای که به نظر برسد اتصال مستقیماً از سوی کلاینت برقرار شده است، نه از برنامه stunnel.

این گزینه در حال حاضر پشتیبانی می‌شود در:

•
حالت راه دور (گزینه connect) در سامانه Linux >=2.6.28

پیکربندی نیازمند اعمال تنظیمات 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 است.

•
حالت راه دور (گزینه connect) در سامانه Linux 2.2.x

این پیکربندی نیازمند کامپایل هسته لینوکس با گزینه transparent proxy است. سرویس مقصد باید روی دستگاه مجزایی مستقر باشد که مسیر دستیابی به آن از طریق سرور stunnel عبور کند.

علاوه بر این، stunnel باید به عنوان root و بدون گزینه setuid اجرا گردد.

•
حالت راه دور (گزینه connect) در سامانه FreeBSD >=8.0

این پیکربندی نیازمند تنظیم فایروال و مسیریابی است. برنامه stunnel باید به عنوان کاربر root و بدون گزینه setuid اجرا شود.

•
حالت محلی (گزینه exec)

این پیکربندی به کمک کتابخانه libstunnel.so محقق می‌گردد. برای بارگذاری این کتابخانه از متغیر محیطی _RLD_LIST در پلتفرم Tru64 یا LD_PRELOAD در سایر پلتفرم‌ها استفاده می‌شود.

•
destination

آدرس مقصد اصلی به جای گزینه connect استفاده می‌شود.

نمونه پیکربندی برای آدرس مقصد شفاف:

[transparent]
client = yes
accept = <stunnel_port>
transparent = destination

این پیکربندی نیازمند تنظیمات iptables است، برای نمونه در فایل /etc/rc.local یا مشابه آن.

در صورت استقرار سرویس مقصد روی همان دستگاه محلی:

/sbin/iptables -t nat -I OUTPUT -p tcp --dport <redirected_port> \
    -m ! --uid-owner <stunnel_user_id> \
    -j DNAT --to-destination <local_ip>:<local_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>

آدرس مقصد شفاف در حال حاضر منحصراً در سیستم‌عامل لینوکس پشتیبانی می‌شود.

•
both

استفاده از پروکسی شفاف هم برای آدرس مبدأ و هم برای آدرس مقصد.

جهت حفظ سازگاری با نگارش‌های پیشین، دو گزینه زیر نیز پشتیبانی می‌شوند:

•
yes

نام این گزینه به source تغییر یافته است.

•
no

نام این گزینه به none تغییر یافته است.

•
verify = LEVEL

اعتبارسنجی گواهی طرف مقابل ارتباط

این گزینه منسوخ شده و باید با گزینه‌های verifyChain و verifyPeer جایگزین گردد.

•
سطح 0

درخواست گواهی و نادیده گرفتن آن

•
سطح 1

اعتبارسنجی در صورت ارائه گواهی

•
سطح 2

اعتبارسنجی با گواهی نصب‌شده مرجع صدور گواهی (CA)

•
سطح 3

اعتبارسنجی با گواهی طرف مقابل که به صورت محلی نصب شده است

•
سطح 4

اعتبارسنجی با گواهی طرف مقابل با نادیده گرفتن زنجیره CA

•
پیش‌فرض

عدم اعتبارسنجی

•
verifyChain = yes | no

اعتبارسنجی زنجیره گواهی‌های طرف مقابل ارتباط

برای اعتبارسنجی گواهی سرور، الزام به یک گواهی خاص با استفاده از گزینه‌های checkHost یا checkIP امری حیاتی است.

گواهی خودامضاشده مرجع اصلی صدور گواهی (Root CA) باید در فایل مشخص‌شده در گزینه CAfile یا در پوشه مشخص‌شده در گزینه CApath قرار داده شود.

پیش‌فرض: no

•
verifyPeer = yes | no

اعتبارسنجی گواهی طرف مقابل ارتباط

گواهی طرف مقابل باید در فایل مشخص‌شده در گزینه CAfile یا در پوشه مشخص‌شده در گزینه CApath قرار داده شود.

پیش‌فرض: no

برنامه stunnel در صورت موفقیت مقدار صفر و در صورت بروز خطا مقدار غیرصفر برمی‌گرداند.

سیگنال‌های زیر را می‌توان برای کنترل برنامه در سیستم‌عامل‌های یونیکس به کار برد:

•
SIGHUP

بارگذاری مجدد فایل پیکربندی.

برخی از گزینه‌های سراسری مجدداً بارگذاری نخواهند شد:

  • chroot
  • foreground
  • pid
  • setgid
  • setuid

در صورت استفاده از گزینه `setuid'، برنامه stunnel قادر به بارگذاری مجدد پیکربندی‌هایی که از پورت‌های ممتاز (<1024) استفاده می‌کنند نخواهد بود.

در صورت استفاده از گزینه `chroot'، برنامه stunnel کلیه فایل‌های مورد نیاز (از جمله فایل پیکربندی، گواهی‌ها، لاگ و فایل pid) را در درون پوشه مشخص‌شده با `chroot' جستجو خواهد کرد.

•
SIGUSR1

بستن و باز کردن مجدد فایل لاگ. این ویژگی می‌تواند در اسکریپت‌های چرخش لاگ (log rotation) برنامه stunnel مورد استفاده قرار گیرد.

•
SIGUSR2

ثبت فهرست اتصالات فعال در فایل لاگ.

•
SIGTERM, SIGQUIT, SIGINT

خاتمه دادن به اجرای برنامه.

پیامد ارسال سایر سیگنال‌ها تعریف‌نشده است.

برای رمزنگاری اتصالات به یک سرور محلی imapd می‌توان از تنظیمات زیر استفاده کرد:

[imapd]
accept = 993
exec = /usr/sbin/imapd
execArgs = imapd

یا در حالت راه دور:

[imapd]
accept = 993
connect = 143

برای فعال‌سازی دریافت ایمیل از طریق TLS توسط یک کلاینت ایمیل محلی از سرور imapd، کلاینت را برای دریافت ایمیل از localhost و پورت 119 تنظیم کرده و از پیکربندی زیر استفاده کنید:

[imap]
client = yes
accept = 143
connect = server:993

در ترکیب با برنامه pppd، برنامه stunnel امکان برپایی یک شبکه خصوصی مجازی (VPN) ساده را فراهم می‌سازد. در سمت سرور که روی پورت 2020 گوش می‌دهد، پیکربندی می‌تواند به این صورت باشد:

[vpn]
accept = 2020
exec = /usr/sbin/pppd
execArgs = pppd local
pty = yes

فایل پیکربندی زیر می‌تواند برای اجرای برنامه stunnel در حالت inetd به کار رود. شایان توجه است که در این فایل پیکربندی هیچ بخشی با نام [نام_سرویس] وجود ندارد.

exec = /usr/sbin/imapd
execArgs = imapd

برای پیکربندی VPN می‌توان از تنظیمات کلاینت زیر استفاده کرد:

[socks_client]
client = yes
accept = 127.0.0.1:1080
connect = vpn_server:9080
verifyPeer = yes
CAfile = stunnel.pem

پیکربندی متناظر سرور vpn_server:

[socks_server]
protocol = socks
accept = 9080
cert = stunnel.pem
key = stunnel.key

برای آزمایش این پیکربندی می‌توان روی ماشین کلاینت دستور زیر را اجرا کرد:

curl --socks4a localhost http://www.example.com

نمونه پیکربندی سرور SNI:

[virtual]
; سرویس والد
accept = 443
cert =  default.pem
connect = default.internal.mydomain.com:8080
[sni1]
; سرویس زیرمجموعه ۱
sni = virtual:server1.mydomain.com
cert = server1.pem
connect = server1.internal.mydomain.com:8081
[sni2]
; سرویس زیرمجموعه ۲
sni = virtual:server2.mydomain.com
cert = server2.pem
connect = server2.internal.mydomain.com:8082
verifyPeer = yes
CAfile = server2-allowed-clients.pem

نمونه پیکربندی برای احراز هویت با استفاده از کلید خصوصی ذخیره‌شده در مخزن گواهی ویندوز (Windows Certificate Store، فقط ویندوز):

engine = capi
[service]
engineId = capi
client = yes
accept = 127.0.0.1:8080
connect = example.com:8443

در صورت استفاده از موتور CAPI، گزینه cert نباید تنظیم شود، زیرا کلید کلاینت به طور خودکار بر اساس گواهی‌های CA معتبر ارائه‌شده توسط سرور از Certificate Store واکشی خواهد شد.

نمونه پیکربندی برای استفاده از گواهی و کلید خصوصی از دستگاه پشتیبانی‌شده توسط موتور 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

نمونه پیکربندی برای استفاده از گواهی و کلید خصوصی از دستگاه پشتیبانی‌شده توسط ارائه‌دهنده `pkcs11prov`:

توجه: نیازمند OpenSSL نسخه 3.0 یا جدیدتر است

setEnv = PKCS11_MODULE_PATH=opensc-pkcs11.dll
setEnv = PKCS11_PIN:123456
provider = pkcs11prov
[service]
client = yes
accept = 127.0.0.1:8080
connect = example.com:843
cert = pkcs11:token=MyToken;object=MyCert
key = pkcs11:token=MyToken;object=MyKey

توجه: نیازمند OpenSSL نسخه 3.5 یا جدیدتر است

provider = pkcs11prov
providerParameter = pkcs11prov:pkcs11_module=opensc-pkcs11.dll
providerParameter = pkcs11prov:pin=123456
[service]
client = yes
accept = 127.0.0.1:8080
connect = example.com:843
cert = pkcs11:token=MyToken;object=MyCert
key = pkcs11:token=MyToken;object=MyKey

در سیستم‌عامل ویندوز، کتابخانه PKCS#11 باید در پوشه `ossl-modules` قرار داشته باشد، یا باید مسیر کامل مطلق آن در `PKCS11_MODULE_PATH` یا در پارامتر `pkcs11_module` تعیین شود.

برنامه stunnel را نمی‌توان برای رمزنگاری پروتکل FTP استفاده کرد، زیرا این پروتکل برای انتقال فایل‌ها از اتصالات اضافی با شماره پورت‌های پویا استفاده می‌کند. با این وجود، نسخه‌های ویژه‌ای از کلاینت‌ها و سرورهای FTP وجود دارند که امکان رمزنگاری داده‌های ارسالی با استفاده از پروتکل TLS را فراهم می‌سازند.

در بیشتر کاربردها، stunnel خود به طور مستقل روی پورت مشخص‌شده در فایل پیکربندی گوش فرا داده و اتصالی را به پورت دیگری که در گزینه connect مشخص شده یا برنامه جدیدی که در گزینه exec تعیین گردیده برقرار می‌سازد. با این حال، برخی ترجیح می‌دهند از برنامه جداگانه‌ای استفاده کنند که اتصالات را دریافت کرده و سپس برنامه stunnel را اجرا نماید. نمونه‌هایی از این برنامه‌ها عبارتند از inetd، xinetd و tcpserver.

یک خط نمونه در فایل /etc/inetd.conf می‌تواند به این صورت باشد:

imaps stream tcp nowait root @bindir@/stunnel
    stunnel @sysconfdir@/stunnel/imaps.conf

از آنجا که در این موارد اتصال روی پورت تعریف‌شده (در اینجا imaps) توسط برنامه دیگری (در اینجا inetd) برقرار می‌شود، stunnel نمی‌تواند از گزینه accept استفاده کند. در فایل پیکربندی نیز نباید هیچ سرویسی تعریف شود ([نام_سرویس])، زیرا این نوع پیکربندی تنها اجازه برقراری یک اتصال را می‌دهد. تمام گزینه‌های سرویس باید همراه با گزینه‌های سراسری قرار داده شوند. نمونه‌ای از این پیکربندی در بخش مثال‌ها آورده شده است.

پروتکل TLS ایجاب می‌کند که هر سرور خود را با یک گواهی معتبر X.509 به کلاینت متصل‌شونده معرفی نماید. تأیید هویت سرور بر این اساس است که نشان دهد کلید خصوصی متناظر با گواهی را در اختیار دارد. ساده‌ترین روش برای به دست آوردن گواهی، تولید آن با استفاده از بسته نرم‌افزاری آزاد OpenSSL است. اطلاعات بیشتر درباره تولید گواهی‌ها را می‌توان در صفحات اینترنتی ذکر شده در ادامه یافت.

فایل .pem باید شامل کلید خصوصی و گواهی امضاشده باشد (نه درخواست گواهی). فایل حاصل باید دارای قالب زیر باشد:

-----BEGIN RSA PRIVATE KEY-----
[کلید رمزنگاری‌شده]
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
[گواهی رمزنگاری‌شده]
-----END CERTIFICATE-----

برنامه stunnel نیاز به مقداردهی اولیه PRNG (مولد اعداد شبه‌تصادفی) دارد، زیرا پروتکل TLS برای امنیت رمزنگاری به یک منبع خوب تصادفی متکی است. منابع زیر تا زمان به دست آمدن آنتروپی کافی به ترتیب خوانده می‌شوند:

  • محتوای فایل مشخص‌شده در گزینه RNDfile.
  • محتوای فایل با نام تعیین‌شده توسط متغیر محیطی RANDFILE، در صورت تنظیم بودن آن.
  • فایل .rnd قرار گرفته در پوشه خانگی کاربر، در صورتی که متغیر RANDFILE تنظیم نشده باشد.
  • فایل مشخص‌شده در گزینه `--with-random' در هنگام پیکربندی و ساخت برنامه.
  • محتوای صفحه نمایش در سیستم‌عامل ویندوز.
  • سوکت egd، در صورتی که گزینه EGD استفاده شده باشد.
  • سوکت egd مشخص‌شده در گزینه `--with-egd-socket' در هنگام پیکربندی برنامه.
  • دستگاه /dev/urandom.

شایان توجه است که در دستگاه‌های مجهز به سیستم‌عامل ویندوز که کاربری پشت کنسول آن‌ها کار نمی‌کند، محتوای صفحه نمایش به اندازه کافی متغیر نیست تا PRNG را مقداردهی کند. در این حالت باید از گزینه RNDfile برای مقداردهی مولد استفاده نمود.

فایل RNDfile باید حاوی داده‌های تصادفی باشد، به این معنی که با هر بار اجرای برنامه stunnel این مقادیر باید متفاوت باشند. در صورتی که گزینه RNDoverwrite استفاده نشده باشد، این عمل به طور خودکار انجام می‌پذیرد. برای ایجاد دستی چنین فایلی می‌توان از دستور openssl rand همراه با نسخه‌های امروزی بسته OpenSSL استفاده کرد.

نکته مهم دیگر این است که اگر دستگاه /dev/urandom در دسترس باشد، کتابخانه OpenSSL تمایل دارد در هنگام بررسی وضعیت مولد، PRNG را با آن تغذیه کند. در سیستم‌های دارای /dev/urandom به احتمال زیاد از این دستگاه استفاده خواهد شد، با اینکه در انتهای فهرست فوق قرار دارد. این از ویژگی‌های کتابخانه OpenSSL است و نه برنامه stunnel.

از نسخه 4.40، برنامه stunnel شامل پارامترهای 2048 بیتی DH درون کد منبع است. از نسخه 5.18، این مقادیر اولیه با پارامترهای موقت تولیدشده خودکار جایگزین می‌شوند. تولید پارامترهای DH ممکن است تا چند دقیقه به طول انجامد.

همچنین می‌توان پارامترهای DH را درون فایل به همراه گواهی قرار داد که تولید پارامترهای موقت را غیرفعال می‌سازد:

openssl dhparam 2048 >> stunnel.pem

•
@sysconfdir@/stunnel/stunnel.conf

فایل پیکربندی برنامه

گزینه execArgs و خط فرمان Win32 از نقل‌قول (quoting) پشتیبانی نمی‌کنند.

•
https://www.stunnel.org

برنامه stunnel

•
https://openssl-library.org

کتابخانه OpenSSL

•
Michał Trojnara
2026.07.31 stunnel 5.80