บทความนี้ส่วนใหญ่กล่าวถึงวิธีการแก้ปัญหาการพัฒนา Java ของ HTTPS Request SSL ที่ไม่น่าเชื่อถือ การวิเคราะห์เฉพาะและรหัสการใช้งานมีดังนี้
เมื่อขอลิงก์ HTTPS ในรหัส Java อาจมีการรายงานข้อผิดพลาดต่อไปนี้
javax.net.ssl.sslhandshakeexception: sun.security.validator.validatorexception: การสร้างเส้นทาง Pkix ล้มเหลว: Sun.security.provider.certpath.suncertBuilderexception: ไม่สามารถหาเส้นทางการรับรองที่ถูกต้อง
เหตุผลก็คือไม่มีใบรับรอง มันก็โอเคที่จะใช้ URL เพื่อเข้าถึงโดยตรงในเบราว์เซอร์ เบราว์เซอร์ควรบันทึกใบรับรอง. CER ที่สอดคล้องกันมาก่อน
มีวิธีแก้ปัญหาสองวิธี: การได้รับใบรับรองที่ถูกต้องจากเครื่องเป้าหมายหรือไม่สนใจปัญหาความน่าเชื่อถือของใบรับรอง
1. รับใบรับรองที่ถูกต้องสำหรับเครื่องเป้าหมาย
1. รวบรวมและติดตั้งโปรแกรมใบรับรอง Javac InstallCert.java (รหัสดังนี้)
/ * * ลิขสิทธิ์ 2006 Sun Microsystems, Inc. สงวนลิขสิทธิ์ * * การแจกจ่ายซ้ำและการใช้งานในรูปแบบแหล่งที่มาและไบนารีที่มีหรือไม่มีการปรับเปลี่ยน * ได้รับอนุญาตหากเงื่อนไขต่อไปนี้ * เป็นไปตาม: * * - การแจกจ่ายซ้ำของซอร์สโค้ดจะต้องรักษาประกาศลิขสิทธิ์ด้านบน * รายการเงื่อนไขและข้อ จำกัด ต่อไปนี้ * * - การแจกจ่ายซ้ำในรูปแบบไบนารีจะต้องทำซ้ำลิขสิทธิ์ด้านบน * ประกาศรายการเงื่อนไขและการเปิดเผยต่อไปนี้ในเอกสาร * และ/หรือวัสดุอื่น ๆ ที่ได้รับการแจกแจง * * - ชื่อของ Sun Microsystems หรือชื่อของผู้มีส่วนร่วม * อาจใช้เพื่อรับรองหรือส่งเสริมผลิตภัณฑ์ที่ได้รับ * จากซอฟต์แวร์นี้โดยไม่ได้รับอนุญาตเป็นลายลักษณ์อักษรล่วงหน้า * * ซอฟต์แวร์นี้จัดทำโดยผู้ถือลิขสิทธิ์และผู้มีส่วนร่วม "เป็น * คือ" และการรับประกันโดยชัดแจ้งหรือโดยนัยใด ๆ รวมถึง แต่ไม่ จำกัด เพียง * การรับประกันโดยนัยของความสามารถในการค้าและความเหมาะสมสำหรับวัตถุประสงค์ * โดยเฉพาะ ไม่ว่าในกรณีใดเจ้าของลิขสิทธิ์หรือผู้มีส่วนร่วมจะต้องรับผิดชอบต่อความเสียหายทางตรงทางอ้อม, เป็นพิเศษ, พิเศษ, เป็นแบบอย่าง, หรือความเสียหายที่ตามมา (รวมถึง แต่ไม่ จำกัด เพียง * การจัดหาสินค้าทดแทนหรือบริการการสูญเสียการใช้ข้อมูลหรือ * ผลกำไร ซอฟต์แวร์ * นี้แม้ว่าจะได้รับคำแนะนำถึงความเป็นไปได้ของความเสียหายดังกล่าว *// ** *http://blogs.sun.com/andreas/resource/installcert.java *ใช้: *Java InstallCert Hostname *ตัวอย่าง: *% Java InstallCert Ecc.fedora.redhat.com */นำเข้า Javax.net.ssl. java.security.messageDigest; นำเข้า java.security.cert.certificateException; นำเข้า Java.security.cert.x509certificate;/** * คลาสที่ใช้เพื่อเพิ่มใบรับรองของเซิร์ฟเวอร์ลงในคีย์ * พร้อมใบรับรองที่เชื่อถือได้ของคุณ */คลาสสาธารณะ InstallCert {โมฆะสาธารณะคงที่หลัก (สตริง [] args) พ่นข้อยกเว้น {สตริงโฮสต์; int พอร์ต; char [] passphrase; ถ้า ((args.length == 1) || (args.length == 2)) {string [] c = args [0] 443: integer.parseint (c [1]); String p = (args.length == 1)? "ChangeIt": args [1]; passphrase = p.toChararray ();} else {system.out.println ("การใช้งาน: java installcert <most> [: พอร์ต] [passphrase]"); return; ไฟล์ไฟล์ = ไฟล์ใหม่ ไฟล์ (system.getProperty ("java.home") + ก.ย. + "lib" + ก.ย. + "ความปลอดภัย"); ไฟล์ = ไฟล์ใหม่ (dir, "jssecacerts"); ถ้า (file.isfile () == false) {ไฟล์ = ไฟล์ใหม่ (dir, "cacerts"); FileInputStream (ไฟล์); KeyStore KS = KeyStore.getInstance (keyStore.getDefaultType ()); ks.load (ใน, passPHREAT TrustManagerFactory.getInstance (TrustManagerFactory.getDefaultAlgorithm ()); tmf.init (KS); x509TrustManager defaultTrustManager = (x509TrustManager) tmf.getTrustManagers () [0]; TrustManager [] {tm}, null); SSLSocketFactory Factory = context.getSocketFactory (); System.out.println ("การเปิดการเชื่อมต่อกับ" + host + ":" + พอร์ต + "... "); sslsocket socket = (sslsocket) โรงงาน {system.out.println ("เริ่มต้นการจับมือกัน ssl ... "); socket.starthandshake (); socket.close (); system.out.println (); system.out.println ("ไม่มีข้อผิดพลาด {system.out.println (); e.printStackTrace (system.out);} x509certificate [] chain = tm.chain; ถ้า (chain == null) {system.out.println ("ไม่สามารถรับใบรับรองเซิร์ฟเวอร์"); return; InputStreamReader (System.in)); System.out.println (); system.out.println ("เซิร์ฟเวอร์ส่ง" + chain.length + "ใบรับรอง (s):"); system.out.println (); messageDigest sha1 = messageGeSt.getinstance ("sha1"); 0; i <chain.length; sha1 " + tohexstring (sha1.digest ())); md5.update (cert.getencoded ()); system.out.println (" md5 " + tohexstring (md5.digest ()); [1] "); สตริงบรรทัด = reader.readline (). trim (); int k; ลอง {k = (line.length () == 0)? 0: integer.parseint (บรรทัด) - 1;} catch (numberFormatexception e) {system.out.println ("คีย์ไม่เปลี่ยน"); return;} x509certificate cert = chain [k]; string alias = host + " -" (k + 1); fileOutputStream ("jssecacerts"); ks.store (out, passphrase); out.close (); system.out.println (); system.out.println (ใบรับรอง); system.out.println () การใช้นามแฝง '" + alias +"' ");} ถ่านสุดท้ายคงที่ [] hexdigits =" 0123456789abcdef ".tochararray (); สตริงคงที่ส่วนตัว tohexstring (byte [] bytes) 0xff; sb.append (hexdigits [b >> 4]); sb.append (hexdigits [b & 15]); sb.append ('');} return sb.toString ();} คลาสส่วนตัว Chain; SavingTrustManager (x509TrustManager tm) {this.tm = tm;} สาธารณะ x509certificate [] getacceptedissuers () {โยน unsupportedoperationexception ();} การตรวจสอบโมฆะสาธารณะ Void CheckserVerTrusted (X509Certificate [] chain, string authType) พ่นใบรับรอง {this.chain = chain; tm.checkservertrusted (chain, authtype);}}}}}}}}}}}}}}}}}} 2. เรียกใช้โปรแกรมใบรับรองการติดตั้งเพื่อสร้างใบรับรอง
java InstallCert my.hoolai.com
ตัวอย่างเช่น: java InstalCert smtp.zhangsan.com:465 admin หากไม่มีการเพิ่มหมายเลขรหัสผ่านและโฮสต์พอร์ตหมายเลขพอร์ตเริ่มต้นที่กำหนดในโปรแกรมที่ได้รับใบรับรองข้างต้นคือ: 443 และรหัสผ่านคือ: เปลี่ยน
3. ตามข้อมูลพรอมต์การดำเนินการป้อน 1 และป้อนและสร้างใบรับรองชื่อ: JSSECACERTS ในไดเรกทอรีปัจจุบัน
วางใบรับรองใน $ java_home/jre/lib/ไดเรกทอรีความปลอดภัยโปรดจำไว้ว่า JRE ของ JDK เป็นสภาพแวดล้อมที่โครงการใช้! - -
หรือ:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");
คุณสามารถเปลี่ยนรหัสผ่านและเรียกใช้คำสั่งในไดเรกทอรีความปลอดภัย
keytool -storepasswd -new xxxcom -keystore cacerts
คุณสามารถแก้ไขรหัสผ่านและใช้คำสั่งหลังจากแก้ไขได้
keytool -list -v -keystore cacerts
เมื่อดูข้อมูลของไฟล์จะแจ้งให้คุณทราบว่าคุณต้องใช้รหัสผ่านเพื่อดู หากรหัสผ่านอินพุตตรงกับรหัสผ่านที่แก้ไขแล้วหมายความว่าการปรับเปลี่ยนสำเร็จ
PS: ณ จุดนี้คุณสามารถใช้ SSL ได้สำเร็จ นอกจากนี้ตามไฟล์ jssecacerts ที่สร้างขึ้นในตอนนี้คุณสามารถสร้างไฟล์ 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 = ใหม่ Hostnameverifier () {Public Boolean Verify (String urlhostname, SSLSession เซสชัน) {return true; }}; httpsurlConnection.setDefaulthostnameverifier (HV); การเชื่อมต่อ = (httpurlConnection) url.openconnection ();ตกลงทั้งสองวิธีได้รับการลองและทำงาน
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการแก้ปัญหาของการร้องขอ HTTPS ที่ไม่น่าเชื่อถือ SSL ใน Java ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!