راهنمای پیکربندی SSL، TLS و پروکسی در curl

پیکربندی گواهی‌های HTTPS، نسخه‌های TLS، پروکسی‌ها و تفکیک DNS سفارشی در curl برای ارتباطات امن API، خطوط لوله CI/CD و عیب‌یابی مشکلات شبکه ضروری است. این راهنما تمام فلگ‌های SSL، TLS، پروکسی و شبکه را پوشش می‌دهد — از غیرفعال کردن بررسی گواهی با -k برای توسعه محلی تا راه‌اندازی TLS دوطرفه با --cert و مسیریابی ترافیک از طریق پروکسی‌های SOCKS5. هر گزینه شامل توضیح واضح، ملاحظات امنیتی و یک مثال آماده کپی است.

مرجع سریع فلگ‌های SSL و پروکسی

-kSSL/TLS

اجازه اتصال ناامن — رد شدن از تمام تأیید SSL

--cacertSSL/TLS

تأیید گواهی سرور در مقابل بسته CA مشخص

--certSSL/TLS

ارائه گواهی کلاینت برای احراز هویت TLS دوطرفه

--keySSL/TLS

ارائه فایل کلید خصوصی برای گواهی کلاینت

--tlsv1.2SSL/TLS

استفاده از نسخه TLS 1.2 یا بالاتر برای اتصال

--tlsv1.3SSL/TLS

استفاده از نسخه TLS 1.3 یا بالاتر برای اتصال

--ssl-reqdSSL/TLS

الزام SSL/TLS برای اتصال (شکست در صورت عدم دسترسی)

--ciphersSSL/TLS

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

--cert-typeSSL/TLS

مشخص کردن نوع گواهی کلاینت (PEM، DER، ENG، P12)

--pinnedpubkeySSL/TLS

پین و تأیید کلید عمومی سرور (به سبک HPKP)

-xپروکسی

مسیریابی تمام ترافیک از طریق سرور پروکسی مشخص

--socks5پروکسی

مسیریابی اتصال از طریق پروکسی SOCKS5

--proxy-userپروکسی

ارائه نام کاربری:رمز عبور برای سرور پروکسی

--noproxyپروکسی

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

--socks5-hostnameپروکسی

پروکسی SOCKS5 با تفکیک DNS از طریق پروکسی

--proxy-cacertپروکسی

گواهی CA برای تأیید خود پروکسی HTTPS

--resolveشبکه

نگاشت جفت host:port خاص به آدرس IP سفارشی

--connect-toشبکه

اتصال به host:port متفاوت از آنچه URL مشخص می‌کند

--local-portشبکه

تنظیم شماره یا محدوده پورت محلی برای اتصال

--interfaceشبکه

متصل کردن اتصال به رابط شبکه خاص

--dns-serversشبکه

استفاده از سرورهای DNS سفارشی به جای پیش‌فرض‌های سیستم (c-ares)

curl -k: نادیده گرفتن خطاهای گواهی SSL

عملکرد
فلگ -k (یا --insecure) تمام تأیید گواهی SSL/TLS را غیرفعال می‌کند. curl بررسی نمی‌کند که آیا گواهی سرور توسط CA معتبر امضا شده، آیا نام میزبان مطابقت دارد، یا آیا گواهی منقضی شده است.
زمان استفاده
فقط برای توسعه محلی با گواهی‌های خودامضا یا محیط‌های تست استفاده کنید. برای staging/production، به جای آن از --cacert با گواهی CA واقعی استفاده کنید — هم امن‌تر و هم صریح‌تر است.
$ curl -k https://localhost:8443/api/health

هرگز از -k در اسکریپت‌های production یا خطوط لوله CI/CD استفاده نکنید. این فلگ تمام اعتبارسنجی گواهی را غیرفعال می‌کند و اتصال شما را در برابر حملات man-in-the-middle آسیب‌پذیر می‌سازد. به جای آن از --cacert برای اعتماد به CA خاص استفاده کنید.

curl --cacert: استفاده از گواهی CA سفارشی

عملکرد
فلگ --cacert به curl می‌گوید گواهی SSL سرور را در مقابل فایل بسته CA (مرجع گواهی) مشخص در فرمت PEM تأیید کند، به جای فروشگاه اعتماد پیش‌فرض سیستم.
زمان استفاده
وقتی سرور شما از گواهی امضاشده توسط CA خصوصی یا داخلی استفاده می‌کند که در فروشگاه اعتماد سیستم نیست. این در محیط‌های سازمانی، کلاسترهای Kubernetes و راه‌اندازی‌های Docker با PKI داخلی رایج است.
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/data

curl --cert: گواهی کلاینت (TLS دوطرفه)

عملکرد
فلگ --cert یک گواهی سمت کلاینت برای TLS دوطرفه (mTLS) ارائه می‌دهد. در mTLS، هم سرور و هم کلاینت گواهی‌ها را برای تأیید هویت یکدیگر ارائه می‌دهند. فایل گواهی باید در فرمت PEM یا PKCS#12 باشد.
زمان استفاده
وقتی سرور احراز هویت گواهی کلاینت را الزام می‌کند — رایج در APIهای بانکی، خدمات دولتی، ارتباطات دستگاه‌های IoT و معماری‌های zero-trust. همیشه با --key جفت کنید مگر اینکه کلید در فایل گواهی تعبیه شده باشد.
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/secure

curl --key: کلید خصوصی گواهی کلاینت

عملکرد
فلگ --key فایل کلید خصوصی را مشخص می‌کند که با گواهی کلاینت ارائه‌شده توسط --cert جفت است. کلید باید با گواهی مطابقت داشته باشد. اگر کلید رمزگذاری شده باشد، curl عبارت عبور را درخواست می‌کند (یا از --pass استفاده کنید).
زمان استفاده
همیشه همراه با --cert استفاده کنید. اگر کلید خصوصی از قبل در فایل گواهی تعبیه شده است (رایج با فایل‌های PKCS#12 / .p12)، می‌توانید --key را حذف کنید.
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/secure

curl --tlsv1.2: اجبار حداقل TLS 1.2

عملکرد
فلگ --tlsv1.2 curl را مجبور می‌کند از TLS 1.2 به عنوان حداقل نسخه قابل قبول برای handshake SSL/TLS استفاده کند. پروتکل‌های قدیمی‌تر (TLS 1.0، 1.1، SSLv3) رد می‌شوند.
زمان استفاده
برای اجرای حداقل استاندارد امنیتی استفاده کنید. TLS 1.2 برای سازگاری PCI-DSS لازم است و توسط تمام سرورهای مدرن پشتیبانی می‌شود. اکثر نسخه‌های مدرن curl به طور پیش‌فرض TLS 1.2+ دارند، اما این فلگ آن را صریح می‌کند.
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'

curl --tlsv1.3: اجبار حداقل TLS 1.3

عملکرد
فلگ --tlsv1.3 curl را مجبور می‌کند از TLS 1.3 — سریع‌ترین و امن‌ترین نسخه TLS — استفاده کند. TLS 1.3 رفت و برگشت اضافی در handshake را حذف می‌کند (پشتیبانی 0-RTT) و تمام مجموعه‌های رمز منسوخ را حذف می‌کند.
زمان استفاده
وقتی می‌دانید سرور از TLS 1.3 پشتیبانی می‌کند و بهترین عملکرد و امنیت را می‌خواهید استفاده کنید. توجه: TLS 1.3 به OpenSSL 1.1.1+ یا کتابخانه TLS سازگار نیاز دارد. هنوز همه سرورها از آن پشتیبانی نمی‌کنند.
$ curl --tlsv1.3 https://modern-api.example.com/data

گزینه‌های SSL/TLS اضافی

--ssl-reqd

الزام SSL/TLS برای اتصال (شکست در صورت عدم دسترسی)

--ciphers

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

--cert-type

مشخص کردن نوع گواهی کلاینت (PEM، DER، ENG، P12)

--pinnedpubkey

پین و تأیید کلید عمومی سرور (به سبک HPKP)

curl -x: استفاده از پروکسی HTTP/HTTPS

عملکرد
فلگ -x (یا --proxy) تمام ترافیک curl را از طریق سرور پروکسی مشخص مسیریابی می‌کند. فرمت: [protocol://]host[:port]. پروتکل‌های پروکسی پشتیبانی‌شده: HTTP، HTTPS، SOCKS4، SOCKS5.
زمان استفاده
برای سرورهای پروکسی سازمانی، عیب‌یابی با ابزارهایی مانند Fiddler، Charles یا mitmproxy، تست محدودیت‌های جغرافیایی، یا وقتی دسترسی مستقیم به اینترنت موجود نیست. همچنین می‌توانید متغیرهای محیطی http_proxy / https_proxy را تنظیم کنید.
$ curl -x http://proxy.example.com:8080 https://api.example.com/data

curl --socks5: استفاده از پروکسی SOCKS5

عملکرد
فلگ --socks5 به curl می‌گوید از پروکسی SOCKS5 برای اتصال TCP استفاده کند. بر خلاف پروکسی‌های HTTP، SOCKS5 در سطح TCP عمل می‌کند و می‌تواند هر پروتکلی را مدیریت کند — نه فقط HTTP. تفکیک DNS به طور پیش‌فرض محلی انجام می‌شود؛ از --socks5-hostname برای تفکیک DNS از طریق پروکسی استفاده کنید.
زمان استفاده
برای تونل‌های SSH (ssh -D)، دسترسی به شبکه Tor، یا وقتی پروکسی باید پروتکل‌های غیر HTTP را مدیریت کند. SOCKS5 از UDP پشتیبانی می‌کند و می‌تواند به صورت اختیاری DNS را مدیریت کند — که آن را انعطاف‌پذیرتر از پروکسی‌های HTTP می‌کند.
$ curl --socks5 localhost:1080 https://api.example.com/data

curl --proxy-user: احراز هویت پروکسی

عملکرد
فلگ --proxy-user (یا -U) اعتبارنامه‌های احراز هویت را به سرور پروکسی ارسال می‌کند. فرمت: user:password. این از احراز هویت سرور (-u) جداست.
زمان استفاده
وقتی سرور پروکسی احراز هویت الزام می‌کند — رایج در محیط‌های شبکه سازمانی. اعتبارنامه‌ها به پروکسی ارسال می‌شوند، نه به سرور مقصد.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --noproxy: عبور از پروکسی برای میزبان‌های خاص

عملکرد
فلگ --noproxy لیستی از میزبان‌ها، دامنه‌ها یا آدرس‌های IP را مشخص می‌کند که باید پروکسی را دور بزنند و مستقیماً متصل شوند. از wildcard پشتیبانی می‌کند: *.example.com تمام زیردامنه‌ها را شامل می‌شود.
زمان استفاده
برای حذف localhost، سرویس‌های داخلی یا دامنه‌های خاص از پروکسی استفاده کنید. وقتی پروکسی به صورت سراسری از طریق متغیرهای محیطی تنظیم شده اما برخی میزبان‌ها (مانند سرویس‌های محلی) نیاز به دسترسی مستقیم دارند مهم است. از * برای عبور از پروکسی برای همه میزبان‌ها استفاده کنید.
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api

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

--socks5-hostname

پروکسی SOCKS5 با تفکیک DNS از طریق پروکسی

--proxy-cacert

گواهی CA برای تأیید خود پروکسی HTTPS

curl --resolve: تفکیک DNS سفارشی

عملکرد
فلگ --resolve آدرس IP سفارشی برای جفت host:port خاص ارائه می‌دهد و کاملاً جستجوی DNS را دور می‌زند. فرمت: host:port:address. چندین ورودی --resolve قابل ارائه است.
زمان استفاده
برای تست قبل از انتشار DNS، تأیید بک‌اند خاص پشت load balancer، یا توسعه محلی که نیاز به نام میزبان واقعی برای اعتبارسنجی گواهی SSL دارید ضروری است. برخلاف ویرایش /etc/hosts، این برای هر درخواست و خاص هر پورت است.
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/health

curl --connect-to: تغییر مسیر اتصال به میزبان دیگر

عملکرد
فلگ --connect-to اتصال TCP را به جفت host:port متفاوتی هدایت می‌کند در حالی که URL اصلی را برای درخواست HTTP (شامل هدر Host و SNI) حفظ می‌کند. فرمت: HOST1:PORT1:HOST2:PORT2.
زمان استفاده
برای تست سرور بک‌اند خاص پشت load balancer بدون تغییر DNS یا /etc/hosts. برخلاف --resolve، این host:port را به host:port نگاشت می‌کند (نه به IP)، که وقتی مقصد هم نام میزبان دارد مفید است.
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/health

گزینه‌های شبکه اضافی

--local-port

تنظیم شماره یا محدوده پورت محلی برای اتصال

--interface

متصل کردن اتصال به رابط شبکه خاص

--dns-servers

استفاده از سرورهای DNS سفارشی به جای پیش‌فرض‌های سیستم (c-ares)

سناریوهای واقعی SSL و پروکسی

این مثال‌ها فلگ‌های متعدد را برای مدیریت وظایف رایج امنیت و شبکه در محیط‌های توسعه، CI/CD و production ترکیب می‌کنند.

تست HTTPS روی Localhost

هنگام توسعه محلی با گواهی خودامضا، --resolve را با --cacert (یا -k برای تست سریع) ترکیب کنید. این به شما اجازه می‌دهد از نام میزبان واقعی برای SSL/SNI صحیح بدون تغییر فایل hosts استفاده کنید.

$ curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/api/status

TLS دوطرفه (احراز هویت گواهی کلاینت)

برخی APIها نیاز دارند هم سرور و هم کلاینت گواهی ارائه دهند. --cert، --key و --cacert را برای برقراری اتصال TLS دوطرفه کاملاً تأییدشده ارائه دهید.

$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://mtls-api.example.com/data

پروکسی سازمانی با احراز هویت

در شبکه‌های سازمانی با سرورهای پروکسی اجباری، -x را با -U برای اعتبارنامه‌های پروکسی ترکیب کنید. --noproxy را برای حذف سرویس‌های داخلی از پروکسی اضافه کنید.

$ curl -x http://proxy.corp.com:3128 -U user:pass --noproxy "*.internal.corp" https://external-api.com/data

کانتینر Docker با CA داخلی

وقتی سرویس‌ها در Docker از گواهی‌های CA داخلی استفاده می‌کنند، گواهی CA را در کانتینر mount کرده و با --cacert به آن ارجاع دهید. این از -k امن‌تر است زیرا همچنان زنجیره گواهی را اعتبارسنجی می‌کند.

$ curl --cacert /etc/ssl/certs/internal-ca.crt https://service.docker.internal:8443/health

پروکسی SOCKS5 از طریق تونل SSH

یک پروکسی SOCKS5 با ssh -D ایجاد کرده و ترافیک curl را از طریق --socks5 مسیریابی کنید. این برای دسترسی به سرویس‌های داخلی از طریق سرور bastion مفید است.

$ curl --socks5 localhost:1080 https://internal-api.example.com/status

سوالات متداول درباره SSL و پروکسی در curl

چگونه تأیید گواهی SSL را در curl رد کنم؟

از curl -k URL یا curl --insecure URL استفاده کنید. این تمام بررسی‌های گواهی را غیرفعال می‌کند — انقضا، عدم تطابق نام میزبان، CA نامعتبر. فقط برای توسعه محلی استفاده کنید. برای production، از --cacert با گواهی CA واقعی استفاده کنید.

چگونه curl را وادار کنم به گواهی خودامضا اعتماد کند؟

از curl --cacert /path/to/ca.pem URL برای مشخص کردن گواهی CA که گواهی خودامضای شما را امضا کرده استفاده کنید. این از -k امن‌تر است زیرا همچنان زنجیره گواهی را اعتبارسنجی می‌کند — فقط به CA خاص شما اعتماد می‌کند.

چگونه بررسی کنم curl از کدام نسخه TLS استفاده می‌کند؟

curl -v URL را اجرا کنید و در خروجی verbose به دنبال خط * SSL connection using TLSv1.x / CipherSuite بگردید. برای اجبار نسخه خاص، از --tlsv1.2 یا --tlsv1.3 استفاده کنید.

TLS دوطرفه (mTLS) چیست و چگونه با curl از آن استفاده کنم؟

TLS دوطرفه نیاز دارد هم سرور و هم کلاینت گواهی ارائه دهند. استفاده: curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL. جفت --cert/--key کلاینت را احراز هویت می‌کند؛ --cacert سرور را تأیید می‌کند.

چگونه از curl از طریق پروکسی HTTP استفاده کنم؟

از curl -x http://proxy:port URL استفاده کنید. برای پروکسی HTTPS: curl -x https://proxy:port URL. همچنین می‌توانید متغیرهای محیطی http_proxy و https_proxy را تنظیم کنید — curl به طور خودکار آن‌ها را شناسایی می‌کند.

چگونه از curl با پروکسی SOCKS5 استفاده کنم؟

از curl --socks5 host:port URL برای تفکیک DNS محلی، یا curl --socks5-hostname host:port URL برای تفکیک DNS از طریق پروکسی (مهم برای حریم خصوصی/Tor) استفاده کنید. مثال با تونل SSH: ssh -D 1080 user@bastion، سپس curl --socks5 localhost:1080 URL.

چگونه با سرور پروکسی در curl احراز هویت کنم؟

از curl -x http://proxy:port -U user:password URL استفاده کنید. فلگ -U (یا --proxy-user) اعتبارنامه‌ها را به پروکسی ارسال می‌کند. این از -u که با سرور مقصد احراز هویت می‌کند جداست.

چگونه میزبان‌های خاصی را از پروکسی در curl حذف کنم؟

از --noproxy "localhost,127.0.0.1,*.internal.com" یا متغیر محیطی NO_PROXY استفاده کنید. از wildcard پشتیبانی می‌کند (*.example.com). از --noproxy "*" برای عبور کامل از پروکسی برای یک درخواست استفاده کنید.

چگونه HTTPS را روی localhost با curl تست کنم؟

برای تست سریع: curl -k https://localhost:8443/. برای اعتبارسنجی صحیح: curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/. رویکرد --resolve اجازه می‌دهد نام میزبان گواهی به درستی مطابقت کند.

چگونه تفکیک DNS را برای میزبان خاص در curl بازنویسی کنم؟

از curl --resolve host:port:IP URL استفاده کنید. مثال: curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/. این DNS را فقط برای آن جفت host:port دور می‌زند — نیازی به ویرایش /etc/hosts نیست.

چگونه خطای 'SSL certificate problem: certificate has expired' را در curl رفع کنم؟

گواهی سرور منقضی شده است. راه‌حل‌ها: (1) تمدید گواهی در سرور، (2) به‌روزرسانی بسته CA: curl --cacert /path/to/updated-ca.pem URL، (3) فقط برای تست: curl -k URL. بررسی انقضا: curl -v URL 2>&1 | grep expire.

آیا استفاده از curl --insecure (-k) در production امن است؟

خیر. فلگ -k تمام اعتبارسنجی گواهی را غیرفعال می‌کند — انقضا، نام میزبان و زنجیره اعتماد. این اتصال شما را در برابر حملات man-in-the-middle آسیب‌پذیر می‌کند. همیشه از --cacert با گواهی CA خاص در production و خطوط لوله CI/CD استفاده کنید.