Java: Como mostrar uma caixa de diálogo para que o usuário aceitar certificados SSL
-
10-07-2019 - |
Pergunta
Atualmente estou tendo um certificado auto-assinado para o meu HTTPS servidor web.
No meu programa java há uma SSLSocketFactory que irá criar um soquete para o servidor web. A implementação padrão de blocos de sol o certificado auto-assinado. Com uma própria implementação de um X509TrustManager só posso verificar se a data do certificado é válido.
Existe alguma possibilidade de deixar a implementação padrão verificar a validade (data e hostname, ...), e se ele falhar para mostrar uma caixa de diálogo para permitir que o usuário aceitar este certificado?
Cada código que eu encontrei até agora desativada somente a verificação SSL e aceito cada certificado inválido.
Solução
Eu realmente não tenho tentei isso, mas por que você não pode implementar seu próprio gerenciador de confiança, que primeiros delegados para o gerente de confiança padrão para verificar se o certificado é válido e se não, pergunta ao usuário se ele ainda quer aceitar o certificado?
Você pode inicializar a maioria das classes de segurança com argumentos nulos para usar valores padrão. Para obter o gerenciador de confiança padrão, você deve obter os gerentes de confiança disponíveis e escolher o primeiro nas matrizes MGRS para implementar a interface X509TrustManager
. Normalmente, a matriz conterá apenas um elment de qualquer maneira.
TrustManagerFactory trustmanagerfactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustmanagerfactory.init((KeyStore)null);
TrustManager[] mgrs = trustmanagerfactory.getTrustManagers();
Depois de ter embrulhado o gerente de confiança padrão com seu próprio ramal, você tem que inicializar um contexto SSL e obter uma fábrica tomada a partir dele:
SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, new TrustManager[] {myTm}, null);
SSLSocketFactory sf = sslContext.getSocketFactory();
Em seguida, use esta fábrica de soquete para criar novos soquetes de cliente ou passá-lo para HttpsURLConnection.setDefaultSSLSocketFactory
para usar o protocolo https em URLs com seu próprio gerenciador de confiança.