دليل إعداد SSL و TLS والبروكسي في curl

إعداد شهادات HTTPS وإصدارات TLS والبروكسيات وحل DNS المخصص في curl ضروري للاتصال الآمن بالـ API وخطوط CI/CD وتشخيص مشاكل الشبكة. يغطي هذا الدليل كل خيارات SSL و TLS والبروكسي والشبكة — من تعطيل فحص الشهادات بـ -k للتطوير المحلي إلى إعداد mutual TLS بـ --cert وتوجيه حركة المرور عبر بروكسيات SOCKS5. كل خيار يتضمن شرحاً واضحاً واعتبارات أمنية ومثالاً جاهزاً للنسخ.

مرجع سريع لخيارات SSL والبروكسي

-kSSL/TLS

السماح بالاتصالات غير الآمنة — تخطي كل التحقق من SSL

--cacertSSL/TLS

التحقق من شهادة الخادم مقابل حزمة CA محددة

--certSSL/TLS

توفير شهادة عميل لمصادقة mutual 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 مختلف عما يحدده العنوان

--local-portالشبكة

تعيين رقم المنفذ المحلي أو نطاقه للاتصال

--interfaceالشبكة

ربط الاتصال بواجهة شبكة محددة

--dns-serversالشبكة

استخدام خوادم DNS مخصصة بدلاً من الافتراضية للنظام (c-ares)

curl -k: تجاهل أخطاء شهادة SSL

ما يفعله
الخيار -k (أو --insecure) يعطل كل عمليات التحقق من شهادات SSL/TLS. لن يتحقق curl مما إذا كانت شهادة الخادم موقعة من CA موثوق، أو إذا كان اسم المضيف يتطابق، أو إذا كانت الشهادة منتهية الصلاحية.
متى تستخدمه
استخدمه فقط للتطوير المحلي مع الشهادات الموقعة ذاتياً أو بيئات الاختبار. للبيئات المرحلية/الإنتاجية، استخدم --cacert مع شهادة CA الفعلية بدلاً من ذلك — فهو أكثر أماناً ووضوحاً.
$ curl -k https://localhost:8443/api/health

لا تستخدم أبداً -k في سكريبتات الإنتاج أو خطوط CI/CD. فهو يعطل كل عمليات التحقق من الشهادات، مما يجعل اتصالك عرضة لهجمات الرجل في المنتصف. استخدم --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: شهادة العميل (Mutual TLS)

ما يفعله
الخيار --cert يوفر شهادة من جانب العميل لـ mutual TLS (mTLS). في mTLS، يقدم كل من الخادم والعميل شهادات للتحقق من هوية بعضهما البعض. يجب أن يكون ملف الشهادة بتنسيق PEM أو PKCS#12.
متى تستخدمه
مطلوب عندما يتطلب الخادم مصادقة بشهادة العميل — شائع في واجهات API المصرفية والخدمات الحكومية واتصالات أجهزة IoT وبنيات الثقة الصفرية. ادمجه دائماً مع --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 كأدنى إصدار مقبول لمصافحة 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 الرحلة الإضافية في المصافحة (دعم 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 التي يجب أن تتجاوز البروكسي وتتصل مباشرة. يدعم أحرف البدل: *.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، أو التحقق من خادم خلفي محدد خلف موازن الأحمال، أو التطوير المحلي حيث تحتاج اسم مضيف حقيقي للتحقق من شهادة 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 مختلف مع الحفاظ على العنوان الأصلي لطلب HTTP (بما في ذلك ترويسة Host و SNI). الصيغة: HOST1:PORT1:HOST2:PORT2.
متى تستخدمه
استخدمه لاختبار خادم خلفي محدد خلف موازن الأحمال دون تعديل 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 وبيئات الإنتاج.

اختبار 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

Mutual 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 في الحاوية والإشارة إليها بـ --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 غير الموثوق. استخدمه فقط للتطوير المحلي. للإنتاج، استخدم --cacert مع شهادة CA الفعلية.

كيف أجعل curl يثق بشهادة موقعة ذاتياً؟

استخدم curl --cacert /path/to/ca.pem URL لتحديد شهادة CA التي وقعت شهادتك الذاتية. هذا أكثر أماناً من -k لأنه لا يزال يتحقق من سلسلة الشهادات — ويثق فقط بـ CA الخاص بك.

كيف أتحقق من إصدار TLS الذي يستخدمه curl؟

شغّل curl -v URL وابحث عن السطر * SSL connection using TLSv1.x / CipherSuite في المخرجات المفصلة. لفرض إصدار محدد، استخدم --tlsv1.2 أو --tlsv1.3.

ما هو mutual TLS (mTLS) وكيف أستخدمه مع curl؟

يتطلب mutual 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. يدعم أحرف البدل (*.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) آمن في الإنتاج؟

لا. الخيار -k يعطل كل عمليات التحقق من الشهادات — انتهاء الصلاحية واسم المضيف وسلسلة الثقة. هذا يجعل اتصالك عرضة لهجمات الرجل في المنتصف. استخدم دائماً --cacert مع شهادة CA المحددة في بيئات الإنتاج وخطوط CI/CD.