تناقش هذه المقالة بشكل أساسي حل تطوير Java لـ HTTPS يطلب SSL غير موثوق به. رمز التحليل والتحليل المحدد على النحو التالي.
عند طلب ارتباط HTTPS في رمز Java ، قد يتم الإبلاغ عن الخطأ التالي
javax.net.ssl.sslhandshakeException: sun.security.validator.validatorexception: فشل بناء مسار pkix: sun.security.provider.certpath.suncertpathbuilderexception: غير قادر على العثور
والسبب هو أنه لا توجد شهادة. لا بأس في استخدام عنوان URL للوصول إليه مباشرة في المتصفح. يجب أن يكون المتصفح قد أنقذ شهادة .RE المقابلة من قبل.
هناك حلان: الحصول على شهادة صالحة من الجهاز المستهدف أو تجاهل مشكلة الثقة في الشهادة.
1. الحصول على شهادة صالحة للجهاز المستهدف
1. تجميع وتثبيت برنامج الشهادة javac installcert.java (رمز على النحو التالي)
/ * * حقوق الطبع والنشر 2006 Sun Microsystems ، Inc. جميع الحقوق محفوظة. * * إعادة التوزيع والاستخدام في النماذج المصدر والثنائية ، مع أو بدون تعديل * ، يمنح أن يتم استيفاء الشروط التالية *: * * - يجب أن تحتفظ إعادة توزيع رمز المصدر بإشعار حقوق الطبع والنشر أعلاه ، وقائمة الشروط هذه وإخلاء المسئولية التالية. * * - يجب أن تقوم إعادة التوزيع في النموذج الثنائي بإعادة إنتاج إشعار حقوق الطبع والنشر أعلاه ، وقائمة الشروط هذه والإفصاح التالي في الوثائق * و/أو المواد الأخرى المتوفرة مع التوزيع. * * - لا يجوز استخدام اسم Sun Microsystems أو أسماء المساهمين * لاتفاق أو الترويج للمنتجات المشتقة من هذا البرنامج دون إذن كتابي مسبق محدد. * * يتم توفير هذا البرنامج من قبل حاملي حقوق الطبع والنشر والمساهمين "AS *" وأي ضمانات صريحة أو ضمنية ، بما في ذلك ، على سبيل المثال لا الحصر ، * الضمانات الضمنية للتسويق والملاءمة لغرض معين *. لا يجوز بأي حال من الأحوال أن يكون مالك حقوق الطبع والنشر أو المساهمين مسؤولين عن أي أضرار مباشرة أو غير مباشرة أو عرضية أو خاصة أو مثالية أو تبعية (بما في ذلك ، على سبيل المثال لا الحصر ، شراء السلع أو الخدمات البديلة ؛ البرمجيات ، حتى لو تم نصحها بإمكانية حدوث مثل هذا الضرر. *// ** *http://blogs.sun.com/andreas/resource/installcert.java *استخدم: *java installcert hostname *مثال: *٪ java installcert ecc.fedora.redhat.com */import javax.net.ssl. *؛ java.security.messagedigest ؛ استيراد java.security.cert.certificateException ؛ استيراد java.security.cert.x509certificate ؛/** * فئة تستخدم لإضافة شهادة الخادم إلى keystore * مع شهاداتك الموثوق بها. */الفئة العامة installcert {public static void main (string [] args) reswors stispion {string host ؛ int port ؛ char [] ashrase ؛ if ((args.length == 1) || (args.length == 2)) {string [] c = args [0] .split (":") ؛ 443: integer.parseint (c [1]) ؛ String p = (args.length == 1)؟ "changeit": args [1] ؛ passphrase = p.tochararray () ؛} آخر {system.out.println ("الاستخدام: java installCert <Sost> [: port] [passphrase] file (system.getProperty ("java.home") + sep + "lib" + sep + "security") ؛ file = file new (dir ، "jssecacerts") ؛ if (file.isfile () == false) {file = file = new file ، "cacerts") ؛}}}}}} fileInputStream (file) ؛ keystore ks = keystore.getInstance (keystore.getDefaultType ()) ؛ ks.load (في ، assphrase) ؛ in.close () TrustManagerFactory.getInstance (trustmanagerfactory.getDefaultalGorithm ()) ؛ tmf.init (ks) ؛ x509trustmanager defaultTrustManager = ( SavingTrustManager (DefaultTrustManager) ؛ context.init (null ، new trustmanager [] {tm} ، null) ؛ sslsocketfactory factory = context.getSocketory () ؛ system.out.println ("الاتصال" + مضيف + ":" + port + "...") factory.createsocket (المضيف ، المنفذ) ؛ socket.setsotimeout (10000) ؛ حاول {system.out.println ("بدء SSL مصافحة ...") ؛ socket.starthandshake () {system.out.println () ؛ inputStreamReader (system.in)) ؛ system.out.println () ؛ system.out.println ("Server sent" + chain.length + "الشهادة (s):") = 0 ؛ cert.getissuerdn ()) toHexString (md5.digest ())) ؛ system.out.println () ؛ 0: integer.parseint (line) - 1 ؛} catch (numberformatexception e) {system.out.println ("keystore not not change") ؛ return ؛} x509Certificate cert = chain [k] ؛ string alias = host + " -" + (k + 1) ؛ ks.setCertificateenter fileOutputStream ("jssecacerts") ؛ Ks.Store (Out ، passphrase) ؛ out.close () ؛ system.out.println () ؛ system.out.println (cert) ؛ system.out.println () ؛ system.out.println () ؛ system.out.println () "jssecacerts" باستخدام الاسم المستعار " + ass +" ") {b & = 0xff ؛ sb.append (hexdigits [b >> 4]) ؛ sb.append (hexdigits [b & 15]) ؛ sb.append ('' ') ؛} return sb.toString () سلسلة ؛ SavingTrustManager (X509TRUSTMANAGER TM) {this.tm = tm ؛} Public X509Certificate [] UnsupportedOperationException () ؛} public void checkservertrusted (x509certificate [] سلسلة ، سلسلة upertype) يلقي certificateException {this.chain = chain ؛ tm.CheckServerTrusted (سلسلة ، Authtype) ؛}}}} 2. قم بتشغيل برنامج شهادة التثبيت لإنشاء شهادة
java InstallCert my.hoolai.com
على سبيل المثال: java InstalCert smtp.zhangsan.com:465 admin إذا لم تتم إضافة كلمة المرور ورقم منفذ المضيف ، فإن رقم المنفذ الافتراضي الوارد في برنامج الحصول على الشهادة أعلاه هو: 443 ، وكلمة المرور هي: تغيير
3. وفقًا لمعلومات مطالبة التشغيل ، أدخل 1 وأدخل ، وقم بإنشاء شهادة تسمى: JSSecacerts في الدليل الحالي.
ضع الشهادة في دليل $ java_home/jre/lib/security ، تذكر أن JRE من JDK هي البيئة التي يستخدمها المشروع! ! !
أو:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");
يمكنك تغيير كلمة المرور وتشغيل الأمر في دليل الأمان
keytool -storepasswd -new xxxcom -keystore cacerts
يمكنك تعديل كلمة المرور واستخدام الأمر بعد تعديله
keytool -list -v -keystore cacerts
عند عرض معلومات الملف ، سيطلب من أنك بحاجة إلى كلمة مرور لعرضها. إذا تطابق كلمة مرور الإدخال كلمة المرور المعدلة ، فهذا يعني أن التعديل قد نجح.
ملاحظة: في هذه المرحلة ، يمكنك استخدام SSL بنجاح. بالإضافة إلى ذلك ، استنادًا إلى الملف الذي تم إنشاؤه الآن فقط ، يمكنك إنشاء ملف CER.
الأمر كما يلي
keytool -export -alias xxx.com-1 -keystore jssecacerts -rfc -file xxx.cer
كما ذكر أعلاه ، كان الاسم المستعار للتسمية الافتراضي في فئة الأدوات السابقة هو إضافة "-1". يجب أن يكون تعيين كلمة المرور باستخدام InstallCert هو نفسه كلمة المرور في ملف Cacherts.
إذا قمت بتعديل كلمة المرور ، فأنت بحاجة إلى تعديل سلسلة كلمة المرور المقابلة في فئة InstallCert ، وإلا فإن الاستثناء التالي سيكون:
java.security.UnrecoverableKeyException: Password verification failed
2. تجاهل مشكلة الثقة في الشهادة
رمز المصدر: http://mengyang.iteye.com/blog/575671
تأكد من ملاحظة أنك تحتاج إلى استدعاء الأساليب الموضحة في المقالة قبل إنشاء الاتصال ، مثل هذا:
TrustAllHttpScertificates () ؛ HostNameverifier HV = New HostNameverifier () {public boolean التحقق (urlhostname string ، جلسة SSLSession) {return true ؛ }} ؛ httpsurlconnection.setDefaulThoStNameverifier (hv) ؛ connection = (httpurlconnection) url.openconnection () ؛حسنًا ، تمت تجربة كلتا الطريقتين وعملت.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة حول حل مشكلة HTTPS غير الموثوق بها SSL في Java. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!