دليل إعداد SSL و TLS والبروكسي في curl
إعداد شهادات HTTPS وإصدارات TLS والبروكسيات وحل DNS المخصص في curl ضروري للاتصال الآمن بالـ API وخطوط CI/CD وتشخيص مشاكل الشبكة. يغطي هذا الدليل كل خيارات SSL و TLS والبروكسي والشبكة — من تعطيل فحص الشهادات بـ -k للتطوير المحلي إلى إعداد mutual TLS بـ --cert وتوجيه حركة المرور عبر بروكسيات SOCKS5. كل خيار يتضمن شرحاً واضحاً واعتبارات أمنية ومثالاً جاهزاً للنسخ.
مرجع سريع لخيارات SSL والبروكسي
السماح بالاتصالات غير الآمنة — تخطي كل التحقق من SSL
التحقق من شهادة الخادم مقابل حزمة CA محددة
توفير شهادة عميل لمصادقة mutual 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 مختلف عما يحدده العنوان
تعيين رقم المنفذ المحلي أو نطاقه للاتصال
ربط الاتصال بواجهة شبكة محددة
استخدام خوادم 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/datacurl --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/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.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/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 التي يجب أن تتجاوز البروكسي وتتصل مباشرة. يدعم أحرف البدل:*.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، أو التحقق من خادم خلفي محدد خلف موازن الأحمال، أو التطوير المحلي حيث تحتاج اسم مضيف حقيقي للتحقق من شهادة 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مختلف مع الحفاظ على العنوان الأصلي لطلب 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خيارات شبكة إضافية
تعيين رقم المنفذ المحلي أو نطاقه للاتصال
ربط الاتصال بواجهة شبكة محددة
استخدام خوادم 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/statusMutual 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.