この記事では、主にHTTPSリクエストSSLのJava開発の解決策の解決策について説明しています。特定の分析と実装コードは次のとおりです。
JavaコードでHTTPSリンクを要求すると、次のエラーが報告される場合があります
javax.net.ssl.sslhandshakeexception:sun.security.validator.validatorexception:pkixパスの構築:sun.security.provider.certpath.suncertpathbuilderexcept
その理由は、証明書がないためです。 URLを使用してブラウザに直接アクセスしても構いません。ブラウザは、対応する.cer証明書を以前に保存する必要があります。
2つの解決策があります。ターゲットマシンから有効な証明書を取得するか、証明書トラストの問題を無視します。
1.ターゲットマシンの有効な証明書を取得します
1.証明書プログラムjavac installcert.java(次のようなコード)をコンパイルしてインストールする
/ * * Copyright 2006 Sun Microsystems、Inc。All Rights Reserved。 * *次の条件が満たされている場合、 *変更の有無にかかわらず、ソースおよびバイナリ形式での再配布と使用は許可されます。 * * - バイナリ形式での再配布は、上記の著作権 *通知、この条件のリスト、および分布に提供された *文書および/またはその他の資料の次の開示を再現する必要があります。 * * - Sun Microsystemsの名前もその *貢献者の名前も、具体的な書面による許可なしにこのソフトウェアから派生した製品を支持または宣伝するために使用することはできません。 * *このソフトウェアは、著作権所有者と貢献者によって「 *のAs」、および特定の *目的に対する商品性と適合性の暗黙の保証を含むがこれらに限定されない明示的または黙示的な保証によって提供されます。いかなる場合でも、著作権所有者または *貢献者は、直接的、間接的、偶発的、特別な、 *例示的、または結果的な損害賠償(代替品またはサービスの調達を含むが、それに限定されない)に対して責任を負いません。ソフトウェアは、たとえそのような損害の可能性について助言されたとしても。 *// ** *http://blogs.sun.com/andreas/resource/installcert.java *use: *java installcert hostname *例: *%java installcert ecc.fedora.redhat.com */Import javax.net.ssl。 java.security.messagedigest; Import java.security.cert.certificateException; Import java.security.cert.x509Certificate;/** *信頼できる証明書を使用してサーバーの証明書をキーストアに追加するために使用されるクラス。 */public class installcert {public static void main(string [] args)throws exception {string host; int port; char [] passphrase; if((args.length == 1)||(args.length == 2)){string [] c = args [0] .split( ":"); host = c [0] 443:integer.parseint(c [1]); string p =(args.length == 1)? "changeit" : args[1];passphrase = p.toCharArray();} else {System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");return;}File file = new File("jssecacerts");if (file.isFile() == false) {char SEP = File.separatorchar;File dir = new file(system.getProperty( "java.home") + sep + "lib" + sep + "security"); file = new file(dir、 "jssecacerts"); if(file.isfile()== false){file = new file(dir、 "cacerts");}}} system.out.out.outln "); fileInputStream(file); keystore ks = keystore.getInstance(keystore.getDefaultType()); ks.load(in、passphrase); in.close(); sslcontext.getinstance( "tls");信託管理tmf = Trustmanagerfactory.getInstance(trustmanagerfactory.getDefaultAlgorithm()); tmf.init(ks); x509trustmanager defaulttrustmanager =(x509trustmanager)tmf.gettrustmanagers()[0]; savingtrustmanager tm = new SavingTrustManager(defaultTrustManager); context.init(null、new Trustmanager [] {tm}、null); sslsocketFactory Factory = Context.getSocketFactory(); System.out.println( "Opening connection to" + host + ":" + port + "); port); socket.setsotimeout(10000); try {system.out.println( "Start ssl handshake ..."); socket.starthandshake(); socket.close(); system.out.println(); system.out.println( "no errors、corteceded");} catch e) {system.out.println(); e.printstacktrace(system.out);} x509certificate [] chain = tm.chain; if(chain == null){system.out.println( "server証明書チェーンを取得できませんでした"); inputStreamReader(system.in)); system.out.println(); system.out.println( "server sent" + chain.length + "certivement(s):"); system.out.println();メッセージゲストsha1 = MESSAGESGEST.GETINSTANCE( "SHA1"); MESSAGESGESTIGEST.GETEST.GETEST.GESTIGEST.GETEST.GETESTINTANCE( 0; i <chain.length; sha1 " + tohexstring(sha1.digest())); md5.update(cert.getencoded()); system.out.println(" + tohexstring(md5.digest())); system.out.println();} system.out.out.out.out.out.out. [1] "); string line = reader.readline(); int k; try {k =(line.length()== 0)? 0:integer.parseint(line)-1;} catch(numberformatexception e){system.out.println( "keystore not chander"); return;} x509certificate cert = chast = chast = host + " - " +(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(エイリアス '" +エイリアス +"' "を使用);}プライベート静的最終char [] hexdigits =" 0123456789ABCDEF ".tocharArray(); private stating string tohexstring(byte [] bytes){stringbuilder sb = new stringbuilder(bytes.length * 3); 0xff; sb.append(hexdigits [b >> 4]); sb.append(hexdigits [b&15]); sb.append( '');} return sb.tostring();} private static class savingtrustmanagerはx509trustmanager {private final x509trustmanager [] private final x509trustmanager [] Chain; SavingTrustManager(X509TrustManager TM){this.tm = tm;} public x509certificate [] getCeptedissuers(){Throw New UnsupportedOperationException();} public void checkClientRusted(X509Certificate [] CerificialException {String authtype) unsupportedoperationexception();} public void checkServerTrusted(x509Certificate [] chain、string authtype)Strows excimetexception {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/securityディレクトリに配置してください。JDKのJREはプロジェクトで使用される環境であることを忘れないでください。 ! !
または:
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 = new hostnameverifier(){public boolean verify(string urlhostname、sslsession session){return true; }}; httpsurlconnection.setDefaulthostNameverifier(hv); connection =(httpurlconnection)url.openconnection();さて、両方の方法が試され、機能しました。
要約します
上記は、Javaの信頼できないHTTPSリクエストSSLの問題の解決策に関するこの記事の内容全体です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!