이 기사는 주로 HTTPS 요청 SSL의 Java 개발 솔루션에 대해 설명합니다. 특정 분석 및 구현 코드는 다음과 같습니다.
Java 코드에서 HTTPS 링크를 요청할 때 다음 오류 가보고 될 수 있습니다.
javax.net.ssl.sslhandshakeexception : sun.security.validator.validatorexception : pkix 경로 구축 실패 : sun.security.provider.certpath.suncertbuilderex : 요청 된 대상에 대한 유효한 인증 경로를 찾을 수 없습니다.
그 이유는 인증서가 없기 때문입니다. URL을 사용하여 브라우저에서 직접 액세스해도됩니다. 브라우저는 이전에 해당 .CER 인증서를 저장해야합니다.
두 가지 솔루션이 있습니다. 대상 기계에서 유효한 인증서를 얻거나 인증서 신탁 문제를 무시합니다.
1. 대상 기계에 대한 유효한 인증서를 얻습니다
1. 인증서 프로그램을 컴파일하고 설치하여 javac installcert.java (다음과 같이 코드)
/ * * Copyright 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.messagegegest; import java.security.cert.certificateexception; import java.security.cert.x509certificate;/** * 신뢰할 수있는 인증서를 사용하여 서버의 인증서를 키 스토어 *에 추가하는 데 사용되는 클래스. */public class instationcert {public static void main (string [] args)은 예외 {문자열 호스트; int port; char [] passphrase; if ((args.length == 1) || (args.length == 2)) {args [0] .split ( ":"); host = c [0]; port == 1)? 443 : integer.parseint (c [1]); 문자열 p = (args.length == 1)? "changeit": args [1]; passphrase = p.tochararray ();} else {system.out.println ( "usage : java instals : java installcert <host> [: port] [passphrase]"; return;} 파일 = 새 파일 ( "jssececerts"); if (file.spile () == false) {char sep = file = file =. file (system.getProperty ( "java.home") + sep + "lib" + sep + "security"); file = new File (dir, "jssecacerts"); if (file.isfile () == 거짓) {file = new File (dir, "cacerts")}} system.out.println ( " + file +" + "); fileInputStream (file); keystore ks = keystore.getInstance (keystore.getDefaultType ()); ks.load (in, passphrase); TrustManagerFactory.getInstance (TrustmanagerFactory.getDefaultAlgorithm ()); TMF.Init (KS); x509trustManager defaultTrustManager = (x509trustManager) tmf.getTrustManagers () [0]; SavingTrustManager TM = New SavingTrustManager (NELLXT.); TrustManager [] {tm}, null); sslsocketfactory factory = context.getSocketfactory (); System.out.println ( " + host +": " + port +"... "); sslsocket socket = (sslsocket) factory.createsocket (호스트); Socket.setSotimeout (100); {System.out.println ( "SSL 핸드 셰이크 시작 ..."); socket.starthandshake (); socket.close (); System.out.println (); System.out.println ( "오류, 인증서가 이미 신뢰됩니다");} catch (sslexception e) {system.out.println (); e.printstacktrace (system.out);} x509certificate [] chain = tm.chain; if (chain == null) {system.out.println ( "서버 인증 체인을 얻을 수 없음"); return;} bufferedReader = new bufferedReader (new bufferedReader (new) inputStreamReader (System.In)); System.out.println (); System.out.println ( "서버 Send" + Chain.length + "reatiferate (s); system.out.println (); MessageDigest sha1 = MessageDigest.getInstance ("Sha1 "); = 0; i <chain -length; cert.getissuerdn ()); sha1.update (cert.getencoded ()); system.out.println ( "sha1" + tohexstring (sha1.digest ()); ToHexString (md5.digest ()); system.out.println ();} system.out.println ( "신뢰할 수있는 키 스토어 또는 'q'를 종료하기 위해 'q'에 추가 할 인증서를 입력하십시오. 0 : integer.parseint (line) -1;} catch (numberformatexception e) {system.out.println ( "keystore not banged"); return;} x509certificate cert = chain [k]; String alias = host + " -" + (k + 1); k + 1); fileoutputStream ( "jssecacerts"); ks.store (out, passphrase); out.close (); system.out.println (); system.out.println (cert); system.out.println (); System.out.println (); System.out.println (); Println ( "추가 된 인증서 to Keystore 'jssecerts'alias ' " + alias +"' ");} 개인 정적 최종 char [] hexdigits ="0123456789abcdef ".tocharray (); byte [] bytes) {stringbuilder sb = new StringBuilder (bytes.lengher); {b & = 0xff; sb.append (hexDigits [b >> 4]); sb.append (hexDigits [b & 15]); sb.append ( '');} sb.toString ();} private savingtrustmanager xprivate x509trustmanager tm; private x509certmanager tm; chain; savingtrustmanager (x509trustmanager tm) {this.tm = tm;} public x509certificate [] getAcceptedIssuers () {throw new newupportedoperationException ();} public void void void void void checkclientTrusted (x509Certificate, String Authtype); void CheckServerTrusted (x509certificate [] 체인, String authtype)는 증명서 exception {this.chain = chain; tm.checkserverTrusted (체인, authtype);}}} 2. 인증서를 생성하려면 설치 인증서 프로그램을 실행하십시오.
java InstallCert my.hoolai.com
예 : java InstalCert smtp.zhangsan.com:465 admin 비밀번호 및 호스트 포트 번호가 추가되지 않은 경우 위의 인증서 획득 프로그램에 제공된 기본 포트 번호는 443이고 암호는 다음과 같습니다.
3. 조작 프롬프트 정보에 따라 1을 입력하고 입력하고 다음과 같은 인증서를 생성하십시오.
$ java_home/jre/lib/security 디렉토리에 인증서를 배치하십시오. JDK의 JRE는 프로젝트가 사용하는 환경임을 기억하십시오! ! !
또는:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");
비밀번호를 변경하고 보안 디렉토리에서 명령을 실행할 수 있습니다.
keytool -storepasswd -new xxxcom -keystore cacerts
비밀번호를 수정하고 명령을 수정 한 후 명령을 사용할 수 있습니다.
keytool -list -v -keystore cacerts
파일의 정보를 볼 때 파일 정보를 보려면 비밀번호가 필요합니다. 입력 비밀번호가 수정 된 암호와 일치하면 수정이 성공했음을 의미합니다.
추신 :이 시점에서 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 = new HostNameVerifier () {public boolean verify (String urlhostName, sslsession session) {return true; }}; httpsUrlConnection.SetDefaulThostNameVerifier (hv); connection = (httpurlConnection) url.openConnection ();좋아, 두 방법 모두 시도하고 작동했습니다.
요약
위는 Java에서 신뢰할 수없는 HTTPS 요청 SSL 문제에 대한 솔루션에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!