راهنمای پیکربندی SSL، TLS و پروکسی در curl
پیکربندی گواهیهای HTTPS، نسخههای TLS، پروکسیها و تفکیک DNS سفارشی در curl برای ارتباطات امن API، خطوط لوله CI/CD و عیبیابی مشکلات شبکه ضروری است. این راهنما تمام فلگهای SSL، TLS، پروکسی و شبکه را پوشش میدهد — از غیرفعال کردن بررسی گواهی با -k برای توسعه محلی تا راهاندازی TLS دوطرفه با --cert و مسیریابی ترافیک از طریق پروکسیهای SOCKS5. هر گزینه شامل توضیح واضح، ملاحظات امنیتی و یک مثال آماده کپی است.
مرجع سریع فلگهای SSL و پروکسی
اجازه اتصال ناامن — رد شدن از تمام تأیید SSL
تأیید گواهی سرور در مقابل بسته CA مشخص
ارائه گواهی کلاینت برای احراز هویت TLS دوطرفه
ارائه فایل کلید خصوصی برای گواهی کلاینت
استفاده از نسخه TLS 1.2 یا بالاتر برای اتصال
استفاده از نسخه TLS 1.3 یا بالاتر برای اتصال
الزام SSL/TLS برای اتصال (شکست در صورت عدم دسترسی)
مشخص کردن رمزهای SSL برای استفاده در اتصال
مشخص کردن نوع گواهی کلاینت (PEM، DER، ENG، P12)
پین و تأیید کلید عمومی سرور (به سبک HPKP)
مسیریابی تمام ترافیک از طریق سرور پروکسی مشخص
مسیریابی اتصال از طریق پروکسی SOCKS5
ارائه نام کاربری:رمز عبور برای سرور پروکسی
لیست میزبانهایی که نباید از پروکسی عبور کنند
پروکسی SOCKS5 با تفکیک DNS از طریق پروکسی
گواهی CA برای تأیید خود پروکسی HTTPS
نگاشت جفت host:port خاص به آدرس IP سفارشی
اتصال به host:port متفاوت از آنچه URL مشخص میکند
تنظیم شماره یا محدوده پورت محلی برای اتصال
متصل کردن اتصال به رابط شبکه خاص
استفاده از سرورهای 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/datacurl --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/securecurl --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/securecurl --tlsv1.2: اجبار حداقل TLS 1.2
- عملکرد
- فلگ
--tlsv1.2curl را مجبور میکند از 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.3curl را مجبور میکند از 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/TLS برای اتصال (شکست در صورت عدم دسترسی)
مشخص کردن رمزهای SSL برای استفاده در اتصال
مشخص کردن نوع گواهی کلاینت (PEM، DER، ENG، P12)
پین و تأیید کلید عمومی سرور (به سبک 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/datacurl --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/datacurl --proxy-user: احراز هویت پروکسی
- عملکرد
- فلگ
--proxy-user(یا-U) اعتبارنامههای احراز هویت را به سرور پروکسی ارسال میکند. فرمت:user:password. این از احراز هویت سرور (-u) جداست. - زمان استفاده
- وقتی سرور پروکسی احراز هویت الزام میکند — رایج در محیطهای شبکه سازمانی. اعتبارنامهها به پروکسی ارسال میشوند، نه به سرور مقصد.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/datacurl --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 با تفکیک DNS از طریق پروکسی
گواهی 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/healthcurl --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گزینههای شبکه اضافی
تنظیم شماره یا محدوده پورت محلی برای اتصال
متصل کردن اتصال به رابط شبکه خاص
استفاده از سرورهای 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/statusTLS دوطرفه (احراز هویت گواهی کلاینت)
برخی 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 استفاده کنید.