É possível obter o Java para ignorar o “armazenamento de confiança” e apenas aceitar qualquer certificado SSL fica?

StackOverflow https://stackoverflow.com/questions/1219208

  •  10-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando escrever um cliente SSL que envia correio através da API javax.mail. O problema que estou tendo é que o pedido do servidor que eu use SSL, mas o servidor também é configurado com um certificado SSL não-padrão. As páginas da web que tenho encontrado digamos que eu preciso para instalar o certificado para o armazenamento confiável. Eu não quero fazer isso (eu não ter as permissões necessárias.)

  1. Existe uma maneira de obter o Java para simplesmente ignorar o erro de certificado e aceitá-lo?
  2. Na falta deste, há uma maneira de ter o armazenamento de confiança ser local para o meu programa, e não instalado para toda a JVM?
Foi útil?

Solução

Você precisa criar um TrustManager falso que aceita todos os certificados, e registrá-lo como um gerente. Algo parecido com isto:

public class MyManager implements com.sun.net.ssl.X509TrustManager {
  public boolean isClientTrusted(X509Certificate[] chain) { return true; }
  public boolean isHostTrusted(X509Certificate[] chain) { return true; }
  ...
}


com.sun.net.ssl.TrustManager[] managers =
  new com.sun.net.ssl.TrustManager[] {new MyManager()};

com.sun.net.ssl.SSLContext.getInstance("SSL").
       .init(null, managers, new SecureRandom());

Outras dicas

Código de Trabalho (em jdk1.6.0_23) para # 1.

Importações

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

A confiança real todo o código TrustManager.

TrustManager trm = new X509TrustManager() {
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    public void checkClientTrusted(X509Certificate[] certs, String authType) {

    }

    public void checkServerTrusted(X509Certificate[] certs, String authType) {
    }
};

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { trm }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

Tente este (resposta à pergunta 2):

System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore");

Você também pode especificar isso como um parâmetro de linha de comando adicionais:

java -Djavax.net.ssl.trustStore=/path/to/truststore <remaining arguments>

No Fedora este poderia ser o sistema de ampla loja de java confiança em /etc/pki/java/cacerts

Basta adicionar -Dtrust_all_cert=true aos argumentos da VM. Este argumento diz java para ignorar todas as verificações de certificados.

Na linha de comando que você pode adicionar argumento -noCertificationCheck de java para ignorar as verificações de certificados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top