В этой статье в основном обсуждается решение для разработки Java https запроса SSL без доверия. Конкретный код анализа и реализации заключается в следующем.
При запросе HTTPS -ссылки в коде Java может быть сообщена следующая ошибка
javax.net.ssl.sslhandshakeexception: sun.security.validator.validatorexception: Pkix Path Build
Причина в том, что нет сертификата. Можно использовать URL для доступа к нему непосредственно в браузере. Браузер должен был сохранять соответствующий сертификат.
Существует два решения: получение действительного сертификата с целевой машины или игнорирование вопроса о доверии сертификата.
1. Получите действительный сертификат для целевой машины
1. Скомпилируйте и установите программу сертификации javac installcert.java (код следующим образом)
/ * * Copyright 2006 Sun Microsystems, Inc. Все права защищены. * * Перераспределение и использование в исходных и двоичных формах, с или без * модификации, разрешены при условии, что следующие условия * выполнены: * * - перераспределение исходного кода должно сохранить вышеуказанный авторский право *, этот список условий и следующий отказ от ответственности. * * - Перераспределение в двоичной форме должно воспроизводить вышеуказанное авторское право * Уведомление, этот список условий и следующее раскрытие в документации * и/или других материалах, предоставленных при распределении. * * - Ни название Sun Microsystems, ни имена его * участников не могут использоваться для одобрения или продвижения продуктов, полученных из этого программного обеспечения без конкретного предварительного письменного разрешения. * * Это программное обеспечение предоставляется владельцами авторских прав и участниками «как * IS», и любые явные или подразумеваемые гарантии, включая, помимо прочего, * подразумеваемые гарантии торговцев и пригодности для конкретной * цели, отказываются. Ни в коем случае владелец авторского права или * участники не несут ответственности за любые прямые, косвенные, случайные, особые, * образцовые или косвенные убытки (включая, но не ограничиваясь, * закупок заместительных товаров или услуг; потеря использования, данные или * прибыль; или деловая прерывание), однако, вызвано и по любой теории, не связанность с поступлением, не связанными с ними, не связанными с ними, не связанными с ними, в том числе и в обращении, в том числе и в обращении, в том числе и в обращении, в том числе и в обращении, в том числе и в обращении, в том числе и в обращении, в том числе и в обращении, в том числе и в обращении, в том числе и в обращении, в том числе. Это * программное обеспечение, даже если он рекомендуется о возможности такого ущерба. *// ** *http://blogs.sun.com/andreas/resource/installcert.java *Использование: *java installcert hostname *Пример: *% java installcert ecc.fedora.redhat.com */import javax.net.ssl. java.security.messagedigest; import java.security.cert.certificateexception; импорт java.security.cert.x509certificate;/** * Класс, используемый для добавления сертификата сервера в хранилище ключа * с вашими доверенными сертификатами. */public class installcert {public static void main (string [] args) бросает исключение {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]); строка p = (args.length == 1)? «Изменение»: args [1];; passPhrase = p.toChararray ();} else {System.out.println («Использование: java installcert <host> [: port] [passphrase]»); return;} файл файл = новый файл ("jssecacerts"); if (file.isfile () == false) {warsecacerts "); File (system.getProperty ("java.home") + Sep + "lib" + sep + "безопасность"); file = new File (dir, "jssecacerts"); if (file.ishile () == false) {file = new File (dir, "cacerts");}} system.out.println ("keystore" in in in in in ")") ") FileInputStream (file); StoreStore KS = keyStore.getInstance (keyStore.getDefaultType ()); ks.load (in, passphrase); in.close (); sslcontext context = sslcontext.getinstance ("tls"); Trust ManagerFacty TMF = sslContext.getInstance ("tls"); TrustManagerFactory.getInstance (TrustManagerFactory.getDefaultAlgorithm ()); TMF.Init (ks); x509trustmanager defaulttrustmanager = (x509trustmanager) tmf.gettrustmanagers () [0]; SavingTrustmanager tm = new SavingTrustmanager (seforttrustmanage; TrustManager [] {tm}, null); sslSocketFactory factory = context.getSocketFactory (); System.out.println («Открытие подключения к" + host + ":" + port + "..."); sslsocket socket = (sslsocket) factory.createcocket (host, port); socket.setmotumeout (10000). Рука ... "); socket.starthandshake (); socket.close (); system.out.println (); System.out.println (" Нет ошибок, сертификат уже доверяет ");} Catch (sslexception e) {System.out.println (); e.printstacktrace (System.out); == null) {System.out.println («Не удалось получить цепочку сертификата сервера»); return;} BufferedReader Reader = New BufferedReader (New InputStreamReader (System.in)); System.out.println (); System.out.println («Сервер Send». Messagedigest.getInstance ("sha1"); Messagedigest md5 = messagedigest.getinstance ("md5"); for (int i = 0; i <chain.length; i ++) {x509certificate cert = cepant [i]; System.out.println (" + (i + 1)". cert.getSubjectdn ()); System.out.println ("Esuer" + cert.getIssuerdn ()); sha1.update (cert.getencoded ()); system.out.println ("sha1" + tohexstring (sha1.digest ()); md5.update (cert.getencodencod. md5 " + tohexstring (md5.digest ())); system.out.println ();} system.out.println (" Введите сертификат, чтобы добавить в доверенный магазин ключей или 'Q', чтобы уйти: [1] "); String line = reader.readline () 0: integer.parseint (line) - 1;} catch (numberformatexception e) {System.out.println ("Ceastor Store"); return;} x509certificate cert = chain [k]; string alias = 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 (); 'jssecacerts' с использованием псевдонима '" + псевдоним +"' ");} private static final char [] hexdigits =" 0123456789abcdef ".tochararray (); частная статическая строка tohexstring (byte [] bytes) {stringbuilder sb = new Stringbuilder (bytes.length.lese); {b & = 0xff; sb.append (hexdigits [b >> 4]); sb.append (hexdigits [b & 15]); sb.append ('');} return sb.tostring ();} private static savingtrustmanager x509trustmag Cheape; SavingTrustManager (x509TrustManager TM) {this.tm = tm;} public x509Certificate [] getAcceptedIssuers () {throw new UnsupportedOperationException ();} public void checkclientTrasted (x509certificate [] chain, String outtype) UnsupportedOperationException ();} public void CheckServerTrusted (x509Certificate [] chain, String authtype) Throws SertiateException {this.chain = chain; tm.checkservertrusted (цепь, auttype);}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} 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
При просмотре информации файла он побуждает, чтобы вам нужен пароль для его просмотра. Если пароль ввода соответствует измененному паролю, это означает, что модификация была успешной.
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; }}.Хорошо, оба метода были опробованы и работали.
Суммировать
Выше приведено все содержание этой статьи о решении проблемы ненадежного HTTPS -запроса SSL в Java. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!