خطأ javax.net.ssl.SSLHandshakeException: remote host closed connection during handshake
المخيف يمكن أن يكون عقبة كبيرة أمام مطوري جافا. يشير هذا الاستثناء إلى فشل أثناء عملية مصافحة SSL/TLS الحاسمة، مما يمنع تطبيق جافا الخاص بك من إنشاء اتصال آمن بخادم بعيد. يستكشف هذا الدليل الشامل الأسباب الجذرية ويوفر حلولًا عملية لحل هذه المشكلة المحبطة.
جدول المحتويات
- فهم SSLHandshakeException
- الحل الأول: تحديث إصدار جافا الخاص بك
- الحل الثاني: تكوين بروتوكولات SSL/TLS
- الحل الثالث: التحقق من صحة شهادات SSL
- استكشاف الأخطاء وإصلاحها والتقنيات المتقدمة
- الأسئلة الشائعة (FAQ)
فهم SSLHandshakeException
ينشأ SSLHandshakeException
عندما تفشل مصافحة SSL/TLS، المسؤولة عن إنشاء اتصال آمن. تشير رسالة “أغلق المضيف البعيد الاتصال أثناء المصافحة” على وجه التحديد إلى أن الخادم أنهى الاتصال قبل اكتمال المصافحة. يمكن أن ينجم هذا عن مشاكل مختلفة إما على العميل (تطبيق جافا الخاص بك) أو الخادم.
تشمل الأسباب الشائعة:
- إصدار جافا قديم: قد تفتقر إصدارات جافا القديمة إلى دعم بروتوكولات SSL/TLS الحديثة التي يستخدمها الخادم، مما يؤدي إلى عدم التوافق.
- تكوين بروتوكول SSL/TLS غير صحيح: عدم تطابق بين البروتوكولات التي يدعمها تطبيق جافا الخاص بك والخادم.
- شهادات SSL غير صالحة أو مفقودة: مشاكل في شهادة SSL الخاصة بالخادم (غير صالحة، منتهية الصلاحية، ذاتية التوقيع بدون تكوين ثقة صحيح، أو سلسلة شهادة معطلة).
- مشاكل اتصال الشبكة: اتصال متقطع بالشبكة أو تدخل جدار الحماية يعطل المصافحة.
- مشاكل على جانب الخادم: مشاكل على الخادم البعيد، مثل نضوب الموارد أو سوء التكوين.
الحل الأول: تحديث إصدار جافا الخاص بك
إصدارات جافا القديمة هي مصدر رئيسي لهذا الخطأ. انتقل العديد من الخوادم بعيدًا عن البروتوكولات القديمة الأقل أمانًا. غالبًا ما يكون التحديث إلى أحدث إصدار دعم طويل الأمد (LTS) لجافا هو الحل الأبسط والأكثر فعالية. قم بتنزيل أحدث إصدار LTS من موقع Oracle على الويب، وقم بتثبيته، وتأكد من أن تطبيقك يستخدم إصدار جافا المحدث.
الحل الثاني: تكوين بروتوكولات SSL/TLS
يسمح لك جافا بتحديد بروتوكولات SSL/TLS التي يستخدمها تطبيقك. إذا لم يدعم الخادم البروتوكولات الافتراضية لتطبيقك، فيجب عليك ضبط الإعدادات. يتضمن هذا عادةً استخدام SSLSocketFactory
أو SSLEngine
لتحديد البروتوكولات المسموح بها.
SSLContext sslContext = SSLContext.getInstance("TLSv1.3"); // أو TLSv1.2، إلخ
sslContext.init(null, null, null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
Socket socket = sslSocketFactory.createSocket(hostname, port);
// ... بقية التعليمات البرمجية الخاصة بك ...
استبدل "TLSv1.3"
ببروتوكولات يدعمها كل من تطبيقك والخادم. جرّب بروتوكولات مختلفة (TLSv1.3، TLSv1.2، TLSv1.1) حتى تجد بروتوكولًا متوافقًا. راجع وثائق الخادم للحصول على البروتوكولات التي يدعمها.
الحل الثالث: التحقق من صحة شهادات SSL
تُعد شهادات SSL المُكوّنة بشكل غير صحيح أو غير الصالحة سببًا متكررًا آخر. يمكنك التحقق من صحة الشهادات برمجيًا أو يدويًا. برمجيًا، قد تحتاج إلى إضافة شهادة الخادم إلى مخزن ثقة جافا الخاص بك إذا كانت ذاتية التوقيع أو من جهة إصدار شهادات غير قياسية. يدويًا، استخدم أدوات مثل openssl
للتحقق من صحة الشهادة وسلسلتها. إذا كانت الشهادة غير صالحة أو منتهية الصلاحية، فاتصل بمسؤول الخادم.
استكشاف الأخطاء وإصلاحها والتقنيات المتقدمة
إذا لم تحل الحلول السابقة المشكلة، فكر في هذه الخطوات المتقدمة:
- التحقق من اتصال الشبكة: تحقق من اتصال الشبكة، بما في ذلك قواعد جدار الحماية. استخدم أدوات مثل
ping
وtraceroute
لتشخيص مشاكل الشبكة. - فحص سجلات الخادم: راجع سجلات الخادم للحصول على رسائل خطأ أكثر تحديدًا قد تحدد المشكلة.
- إعدادات الوكيل: إذا كنت خلف وكيل، فتأكد من تكوين تطبيق جافا الخاص بك بشكل صحيح لاستخدامه.
- تمكين تصحيح أخطاء SSL: قم بتمكين تصحيح أخطاء SSL في تطبيق جافا الخاص بك للحصول على معلومات أكثر تفصيلًا حول عملية المصافحة.
- اتصل بمسؤول الخادم: إذا فشلت كل الحلول الأخرى، فاتصل بمسؤول الخادم للإبلاغ عن المشكلة. قد يكون لديهم مشاكل على جانب الخادم تسبب فشل المصافحة.
الأسئلة الشائعة (FAQ)
س: شهادتي ذاتية التوقيع. كيف أحل هذه المشكلة؟
ج: استورد شهادة التوقيع الذاتي إلى مخزن مفاتيح جافا الخاص بك (عادةً cacerts
) باستخدام أداة سطر الأوامر keytool
.
س: الخادم معطل. كيف يتسبب ذلك في هذا الخطأ؟
ج: يمنع الخادم المعطل مصافحة ناجحة لأن محاولة الاتصال تفشل.
س: ماذا لو لم تنجح أي من هذه الحلول؟
ج: تحقق من اتصال الشبكة وقواعد جدار الحماية، وفكر في الاتصال بمسؤول الخادم. قد يكون لديهم مشاكل على جانب الخادم.