تصف هذه المقالة طريقة تنفيذ مصادقة SSL ثنائية الاتجاه في Java. شاركه للرجوع إليه ، على النحو التالي:
التحقق من SSL المشترك هو أكثر شيوعا. تحقق فقط مما إذا كان خادمنا صحيحًا أم صحيحًا. بالطبع ، إذا كان عنوان URL الذي تزوره خاطئًا على الإطلاق ، فلن يتمكن أحد من فعل ذلك. وهذا ما يسمى المصادقة في اتجاه واحد SSL.
ولكن في الواقع ، قد نتحقق أيضًا من ما إذا كان العميل يفي بالمتطلبات ، أي إصدار شهادة لكل من مستخدمينا ، وكل شهادة رقمية فريدة وليست عامة. وبهذه الطريقة ، يمكنك التأكد من التعرف على المستخدم الذي يصل حاليًا إلى الخادم بواسطة الخادم ولا يمكن الوصول إليه من قبل الآخرين.
تضمن المصادقة ثنائية الاتجاه أن يتعرف كل من الخادم والعميل على بعضهما البعض في المستوى الأول. ثم إذا أرادوا التواصل ، فسيقومون بتوصيل بروتوكول SSL ببروتوكول الاتصال لضمان تشفير محتوى الاتصال. حتى أدوات Sniffer الشبكة مثل Sniffer انظر رمز مشوهة. في المستقبل ، سأوضح لك ما تراه مع Sniffer دون تشفير. أخشى أنك ستكون أكثر يقظة بهذه الطريقة.
المحتوى التالي مقتطف من الإنترنت وتعديله بعد التحقق الفعلي.
سيناريو المحاكاة:
عندما يتواصل جانب الخادم مع جانب العميل ، يلزم التفويض والتحقق من الهوية ، أي أنه يمكن للعميل قبول الرسائل من الخادم فقط ، ويمكن للخادم قبول الرسائل من العميل فقط.
تكنولوجيا التنفيذ:
JSSE (امتداد مقبس أمان جافا)
إنه حل تم إطلاقه بواسطة Sun لحل الاتصالات الآمنة على الإنترنت. ينفذ بروتوكولات SSL و TSL (أمان طبقة النقل). يتضمن JSSE تقنيات مثل تشفير البيانات ، والتحقق من الخادم ، وسلامة الرسائل والتحقق من العميل. باستخدام JSSE ، يمكن للمطورين نقل البيانات بأمان بين العميل والخادم عبر بروتوكول TCP/IP.
من أجل تنفيذ مصادقة الرسائل.
يتطلب الخادم:
1) Keystore: حيث يتم حفظ المفتاح الخاص للخادم
2) Trust Keystore: يحفظ شهادة تفويض العميل
وبالمثل ، يتطلب العميل:
1) Keystore: حيث يتم حفظ المفتاح الخاص للعميل
2) Trust KeyStore: هنا أوصي باستخدام أمر KeyTool الذي يأتي مع Java لإنشاء ملفات المعلومات هذه. بالطبع ، يعد OpenSSL أيضًا جيل شهادات SSL الأكثر شعبية المصدر. OpenSSL مكتوبة بلغة C ، النظام العرضي. ومع ذلك ، قد نفكر في راحة استخدام برامج Java لإنشاء شهادات في المستقبل ، واستخدام Keytool الذي يأتي مع JDK.
1) إنشاء المفتاح الخاص للخادم واستيراده إلى ملف keystore الخادم
keytool -genkey -alias serverkey -keystore kserver.keystore
أثناء العملية ، تحتاج إلى ملءها بشكل منفصل وإعدادها وفقًا لاحتياجاتك.
كلمة مرور Keystore: 123456
الاسم الأول والأخير: جين
اسم الوحدة التنظيمية: لا شيء
اسم المنظمة: لا شيء
اسم المدينة أو المنطقة: BJ
اسم الدولة أو المقاطعة: BJ
رمز البلد: CN
لا يتم ملء كلمة المرور الخاصة بمفتاح ServerKey الخاص بنفس كلمة مرور Keystore. تأكد من الانتباه هنا ، فقط اضغط على Enter دون تغيير كلمة المرور الخاصة بك. خلاف ذلك ، إذا كان لا يمكن تطبيق هذا المفتاح الخاص مباشرة في البرنامج اللاحق ، فسيتم الإبلاغ عن خطأ.
يمكنك إنشاء ملف kserver.keystore
يتم استخدام server.keystore للخادم ، الذي يخزن المفتاح الخاص به.
2) تصدير شهادة الخادم بناءً على المفتاح الخاص
keytool -esport -alias serverkey -keystore kserver.keystore -file server.crt
server.crt هي الشهادة على جانب الخادم
3) استيراد شهادة الخادم في مفتاح ثقة العميل
Keytool -Import -Alias serverkey -file server.crt -Keystore tclient.keystore
tclient.keystore مخصص للعملاء ، وهو يحمل شهادة موثوقة.
بالطريقة نفسها ، قم بإنشاء شهادة العميل الخاصة وشهادة العميل ، واستيرادها إلى مفتاح ائتمان الخادم الخاص بالخادم
1) keytool -genkey -alias clientkey -Keystore Kclient.keystore
2) keytool -esport -alias clientkey -Keystore Kclient.keystore -file client.crt
3) keytool -Import -Alias clientkey -file client.crt -Keystore tserver.keystore
وبهذه الطريقة ، يتم تقسيم الملفات التي تم إنشاؤها إلى مجموعتين
Server Save: kserver.keystore tserver.keystore
العميل حفظ: kclient.keystore tclient.kystore
فيما يلي التحقق من أن الشهادة التي أنشأتها متوفرة من خلال برنامج الاتصالات Java Socket.
عميل:
أمثلة على الحزمة. javax.net.ssl.keymanagerfactory ؛ استيراد javax.net.ssl.sslcontext ؛ استيراد javax.net.ssl.sslsocket "127.0.0.1" ؛ int static int default_port = 7777 ؛ Static Final Final Client_Key_Store_Password = "123456" ؛ Static Final Final Client_trust_key_store_password = "123456" ؛ sslsocket الخاص sslsocket ؛ / ** * ابدأ برنامج العميل * * param args */ public static void main (string [] args) {sslclient client = new sslclient () ؛ client.init () ؛ client.process () ؛ } / *** قم بالاتصال بالخادم من خلال مقبس SSL وأرسل رسالة* / public void process () {if (sslsocket == null) {system.out.println ("error") ؛ يعود؛ } جرب {inputStream input = sslsocket.getInputStream () ؛ OutputStream Output = sslsocket.getOutputStream () ؛ BufferedInputStream BIS = جديد BufferedInputStream (إدخال) ؛ bufferedoutputstream bos = جديد bufferedoutputstream (الإخراج) ؛ bos.write ("رسالة العميل" .getBytes ()) ؛ bos.flush () ؛ Byte [] Buffer = New Byte [20] ؛ Bis.Read (Buffer) ؛ System.out.println (سلسلة جديدة (عازلة)) ؛ sslsocket.close () ؛ } catch (ioException e) {system.out.println (e) ؛ }}/** * <ul> * <li> النقاط الرئيسية لاتصال SSL: </li> * <li> تهيئة SSLSocket </li> * <li> استيراد مفتاح المفتاح الخاص العميل الخاص ، استيراد العميل Keystore (شهادة الخادم) </li> * </ul> sslContext.getInstance ("SSL") ؛ KeyManagerFactory KMF = KeyManagerFactory.getInstance ("Sunx509") ؛ TrustManagerFactory TMF = TrustManagerFactory.getInstance ("Sunx509") ؛ keystore ks = keystore.getInstance ("jks") ؛ keystore tks = keystore.getInstance ("jks") ؛ Ks.Load (جديد fileInputStream ("e: //kclient.keystore") ، client_key_store_password.tochararray ()) ؛ tks.load (جديد fileInputStream ("e: //tclient.keystore") ، client_trust_key_store_password.tocharray ()) ؛ kmf.init (KS ، client_key_store_password.tochararray ()) ؛ TMF.Init (TKS) ؛ CTX.Init (KMF.GetKeyManagers () ، TMF.GetTrustManagers () ، null) ؛ sslsocket = (sslsocket) ctx.getSocketFactory (). createSocket (default_host ، default_port) ؛ } catch (استثناء e) {system.out.println (e) ؛ }}}جانب الخادم:
حزمة أمثلة. javax.net.ssl.keymanagerfactory ؛ import javax.net.ssl.sslcontext ؛ import javax.net.ssl.sslserversite ؛ استيراد javax.net.ssl.trustmanagerfactory ؛/*********************************************************************************************** ***************************************************************************************************** ***************************************************************************************************** ***************************************************************************************************** ***************************************************************************************************** ***************************************************************************************************** ***************************************************************************************************** ************************************************************************************************* serverkey -Keystore kserver.keystore -file server.crt </li> * <li> 3) أضف الشهادة إلى keystore الموثوق بها من العميل </li> * <li> keytool -Import -alias serverkey -file server.crt -keystore tclient.keystore </li> * </ul> ********************************************************************************************************* ********************************************************************************************************* ********************************************************************************************************* ********************************************************************************************************* ********************************************************************************************************* ********************************************************************************************************* ********************************************************************************************************* ********************************************************************************************************* Server * */public Class SSLServer {private static Final default_port = 7777 ؛ Static Static Final Final Server_key_store_password = "123456" ؛ Static Static Final Final Server_trust_key_store_password = "123456" ؛ SSLServersocket Serversocket ؛ / ** * ابدأ البرنامج * * param args */ public static void main (string [] args) {sslserver server = new sslserver () ؛ server.init () ؛ server.start () ؛ }/** * <ul> * <li> استمع إلى SSL Server Socket </li> * <li> نظرًا لأن هذا البرنامج ليس عرضًا للاستماع إلى المقبس ، فإنه يتبنى ببساطة نموذجًا واحدًا ، ويقبل فقط رسائل العميل ويعيد رسالة العميل المحددة </li> * </ul>/ulr public void start () يعود؛ } بينما (صحيح) {try {socket s = serversouctce.accept () ؛ inputStream input = S.GetInputStream () ؛ OutputStream Output = S.GetOutputStream () ؛ BufferedInputStream BIS = جديد BufferedInputStream (إدخال) ؛ bufferedoutputstream bos = جديد bufferedoutputstream (الإخراج) ؛ Byte [] Buffer = New Byte [20] ؛ Bis.Read (Buffer) ؛ System.out.println (سلسلة جديدة (عازلة)) ؛ Bos.Write ("Server Echo" .getBytes ()) ؛ bos.flush () ؛ S.Close () ؛ } catch (استثناء e) {system.out.println (e) ؛ }}}}/** * <ul> * <li> النقاط الرئيسية لاتصال SSL: </li> * <li> تهيئة SSLServersOcket </li> * <li> استيراد مفتاح المفتاح الخاص للخادم ، واستيراد keystore المُثوق بها الخادم (شهادة العميل) </li> * </ul>/public void init () sslContext.getInstance ("SSL") ؛ KeyManagerFactory KMF = KeyManagerFactory.getInstance ("Sunx509") ؛ TrustManagerFactory TMF = TrustManagerFactory.getInstance ("Sunx509") ؛ keystore ks = keystore.getInstance ("jks") ؛ keystore tks = keystore.getInstance ("jks") ؛ Ks.Load (جديد fileInputStream ("e: //kserver.keystore") ، server_key_store_password.tocharray ()) ؛ tks.load (جديد fileInputStream ("e: //ttserver.keystore") ، server_trust_key_store_password.tocharray ()) ؛ kmf.init (KS ، server_key_store_password.tochararray ()) ؛ TMF.Init (TKS) ؛ CTX.Init (KMF.GetKeyManagers () ، TMF.GetTrustManagers () ، null) ؛ ServersOcket = (sslserversocket) ctx.getServersOcketFactory (). correverservers (default_port) ؛ serversocket.setneedclientauth (صواب) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}لمزيد من المعلومات حول المحتوى المتعلق بـ Java ، يرجى مراجعة موضوعات هذا الموقع: "بنية بيانات Java والبرنامج التعليمي الخوارزمية" ، "ملخص Tips Java DOM Node Tips" ، "ملخص ملفات Java ونصائح تشغيل الدليل" و "ملخص لنصائح Java Cache Operation" "
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.