Este artigo discute principalmente a solução para o desenvolvimento de Java da solicitação HTTPS SSL não confiável. O código específico de análise e implementação é o seguinte.
Ao solicitar o link HTTPS no código Java, o seguinte erro pode ser relatado
javax.net.ssl.ssslHandshakeException: sun.security.validator.validatorexception: pkix path editura falhou: sun.security.provider.certpath.suncertPathBuilderexception: Não é possível encontrar o caminho de certificação válido para o alvo solicitado
A razão é que não há certificado. Não há problema em usar o URL para acessá -lo diretamente no navegador. O navegador deveria ter salvado o certificado .Cer correspondente antes.
Existem duas soluções: obtendo um certificado válido da máquina de destino ou ignorando o problema de confiança do certificado.
1. Obtenha um certificado válido para a máquina de destino
1. Compile e instale o programa de certificado Javac Instalcert.java (código da seguinte forma)
/ * * Copyright 2006 Sun Microsystems, Inc. Todos os direitos reservados. * * Redistribuição e uso em formulários de origem e binários, com ou sem * modificação, são permitidos, desde que as seguintes condições * sejam atendidas: * * - Redistribuições do código -fonte devem reter o aviso de direitos autorais acima *, esta lista de condições e o seguinte aviso. * * - Redistribuições em forma binária devem reproduzir o aviso de direitos autorais acima *, esta lista de condições e a seguinte divulgação na documentação * e/ou outros materiais fornecidos com a distribuição. * * - Nem o nome dos Microsystems Sun nem os nomes de seus * colaboradores podem ser usados para endossar ou promover produtos derivados * deste software sem permissão prévia por escrito específica. * * Este software é fornecido pelos detentores de direitos autorais e colaboradores "como * é" e quaisquer garantias expressas ou implícitas, incluindo, entre outros, as garantias implícitas de comercialização e aptidão para um determinado objetivo. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * Software, mesmo que seja informado da possibilidade de tais danos. *// ** *http://blogs.sun.com/andreas/resource/installCert.java *Use: *java installCert hostname *Exemplo: *% java installCert Ecc.fedora.redhat.com */import javax.ssl. *; import java.io.io.fedora.redhat.com * java.Security.Messagedigest; importar java.security.cert.certificateException; importar java.security.cert.x509Certificate;/** * classe usada para adicionar o certificado do servidor à chave * com seus certificados confiáveis. */public classe InstallCert {public static void main (string [] args) lança exceção {string host; int porta; char [] senha; 443: Integer.parseint (c [1]); string p = (args.length == 1)? "Changeit": args [1]; senha = P.ToCharArray ();} else {System.out.println ("Uso: Java InstallCert <dost> [: Port] [PasspHrase]"); return;} arquivo de arquivo = novo ("JSSCACERTS"); se (file.file;); File (system.getProperty ("java.home") + sep + "lib" + sep + "segurança"); arquivo = novo arquivo (dir, "jSSecacerts"); if (file.isfile () == false) {file = new File ("CACERTS");}}}} System.out.print.println (File "(" CACERTS ");"}}} ") FileInputStream (File); KeyStore Ks = KeyStore.getInstance (keystore.getDefaultType ()); ks.load (in, pasfrae); in.close (); sslContext contexto = sslContext.getInstance ("tls") TrustManagerFactory.GetInstance (TrustManagerFactory.GetDefaultAlgorithm ()); tmf.init (KS); x509TrustManager DefaultTrustManager = (X509TrustManager) tmf.getTrustManagers () [0]; SavingTrustmanager; TrustManager[]{tm}, null);SSLSocketFactory factory = context.getSocketFactory();System.out.println("Opening connection to " + host + ":" + port + "...");SSLSocket socket = (SSLSocket) factory.createSocket(host, port);socket.setSoTimeout(10000);try {System.out.println("Starting SSL Handshake ... "); Socket.StartHandShake (); Socket.Close (); System.out.println (); System.out.println (" Sem erros, Certificado já é confiável ");} Catch (sslexception e) {System.out.println (); E.PrintTackTrace (System.out); == null) {System.out.println ("Não foi possível obter a cadeia de certificados do servidor"); return;} BufferErader Reader = new BufferredReader (new inputStreamReader (System.in)); System.out.println (); System.out.println ("servidor enviado" + cadeia.Lilgth + " Messagedigest.getInstance ("sha1"); Messagedigest md5 = Messagedigest.getInstance ("md5"); para (int i = 0; i <cadeia.Length; i ++) {x509Certificate Cert = Chain [i]; System.out.println ("" + (i + 1) cert.getsubjectdn ()); system.out.println ("emissuer" + cert.getissuerdn ()); md5 " + tohexstring (md5.digest ())); system.out.println ();} system.out.println (" insira o certificado para adicionar à chave de keystore confiável ou 'q' para sair: [1] "); linha de string = reader.readline (). 0: Integer.ParseInt (Line) - 1;} Catch (NumberForMatexception e) {System.out.println ("Keystore não alterado"); return;} x509Certificate cert = Chain [K]; Alias de String = Host + " -" + (K + 1); FileOutputStream ("jSSecacerts"); ks.store (out, senha); out.close (); system.out.println (); system.out.println (cert); system.out.println (); system.out.println (system.out.println; 'JSSecacerts' usando alias '" + Alias +"' ");} private estático final char [] hexdigits =" 0123456789AbcDef ".ToCharArray (); string string privado (byte [] bytes) {stringbuilder sB = titsicbuilder; & = 0xff; sb.append (hexdigits [b >> 4]); sb.append (hexdigits [b & 15]); sb.append ('');} retorna sb.toString ();} private static savingtrustmanager implementos x509rustmanager {) private x50 99Trustman Chain; SavingTrustManager (x509TrustManager tm) {this.tm = tm;} public x509Certificate [] getAceceptEdissuers () {lança novo UnsupportEdOperationException (} public void CheckCientTrusted (x509Certificate [] Chain, string, autentmex) UnsupportEdOperationException ();} public void checkServerTrusted (X509Certificate [] Chain, String Authtype) lança certificado de CertateException {this.chain = cadeia; 2. Execute o programa de certificado de instalação para gerar um certificado
java InstallCert my.hoolai.com
Por exemplo: java InstalCert smtp.zhangsan.com:465 admin Se a senha e o número da porta do host não forem adicionados, o número da porta padrão fornecido no programa de obtenção de certificado acima é: 443, e a senha é: alteração
3. De acordo com as informações do prompt de operação, digite 1 e digite, e gerar um certificado chamado: JSSecacerts no diretório atual.
Coloque o certificado no diretório $ java_home/jre/lib/security, lembre -se de que o JRE do JDK é o ambiente usado pelo projeto! ! !
ou:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");
Você pode alterar a senha e executar o comando no diretório de segurança
keytool -storepasswd -new xxxcom -keystore cacerts
Você pode modificar a senha e usar o comando depois de modificá -la
keytool -list -v -keystore cacerts
Ao visualizar as informações do arquivo, solicitará que você precise de uma senha para visualizá -la. Se a senha de entrada corresponder à senha modificada, significa que a modificação foi bem -sucedida.
PS: Neste ponto, você pode usar com sucesso o SSL. Além disso, com base no arquivo JSSecacerts gerado agora, você pode gerar um arquivo CER.
O comando é o seguinte
keytool -export -alias xxx.com-1 -keystore jssecacerts -rfc -file xxx.cer
Como mencionado acima, o alias de nomeação padrão na classe de ferramentas anterior era adicionar "-1". A senha definida usando o InstallCert deve ser o mesmo que a senha no arquivo Cacherts.
Se você modificou a senha, precisar
java.security.UnrecoverableKeyException: Password verification failed
2. Ignore o problema de confiança do certificado
Código fonte: http://mengyang.iteye.com/blog/575671
Certifique -se de observar que você precisa chamar os métodos descritos no artigo antes que a conexão seja criada, como esta:
TrustAlhttpSCertificates (); hostNameVerriFier hv = new HostNameVerriFier () {public boolean verify (string urlHostName, SslSession Session) {return true; }}; HttpsurlConnection.setDefaultThostNameVerriFier (hv); conexão = (httpurlConnection) url.openconnection ();OK, ambos os métodos foram tentados e funcionados.
Resumir
O exposto acima é o conteúdo inteiro deste artigo sobre a solução para o problema da solicitação HTTPS não confiável SSL em Java. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!