HTTPS hostname errado: deve ser . O que causa isso?
Pergunta
Estou recebendo este 'HTTPS hostname errado:' erro ao tentar se conectar a um servidor usando https. Meu url é algo como isto
https://sub.domain.com/tamnode/webapps/app/servlet.
I conectar usando o seguinte código
// Create a URLConnection object for a URL
URL url = new URL(requestedURL);
HttpURLConnection.setFollowRedirects(false);
// connect
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("User-Agent", USER_AGENT); //$NON-NLS-1$
OutputStreamWriter wr = new OutputStreamWriter(connection
.getOutputStream());
mas, em seguida, obter um erro
IOException: HTTPS hostname wrong: should be <sub.domain.com>.
at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing
....
Este é o código que tem funcionado no passado, mas não mais. Houve algumas mudanças na arquitetura do sistema, mas eu preciso para obter mais dados antes de se aproximar dos responsáveis.
O que pode causar esse erro? Posso desativar a verificação URLSpoofing?
Solução
Parece que o certificado SSL para domain.com foi dado a sub.domain.com. Ou, mais provavelmente, o que foi domain.com foi renomeado para sub.domain.com sem atualizar o certificado SSL.
Outras dicas
cletus está certo sobre a causa provável.
Há uma maneira de desligar a verificação paródia, também.
Você pode criar um objeto que implementa HostnameVerifier que os retornos verdadeiros sob circunstâncias mais do que 'normal'.
Você poderia substituir o HostnameVerifier padrão chamando setHostnameVerifier no objeto de conexão no código em questão.
Essa resposta foi 'inspirado por': http://www.java -samples.com/showtutorial.php?tutorialid=211
Eu encontrei esse link com esta consulta: http: / /www.google.com/search?q=https+hostname+wrong+should+be
Uma nota mais: pense duas vezes antes de fazer isso. Você vai criar uma fraqueza explorável na segurança entre os seus componentes de cliente e servidor.
Eu tenho essa exceção - java.io.IOException: HTTPS hostname wrong: should be <localhost>
A minha solução é que eu mudei de certificado auto-assinado e fazer o CN=localhost
.
ou
Adicionar seu domínio de nome do certificado cn=<domain-name>
para o seu arquivo host provavelmente localizado em c: / windows / system32 / drivers / etc /...
O código a seguir resolvido meu problema
static {
//for localhost testing only
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
new javax.net.ssl.HostnameVerifier() {
@Override
public boolean verify(String hostname,
javax.net.ssl.SSLSession sslSession) {
if (hostname.equals("your_domain")) {
return true;
}
return false;
}
});
}
Use o nome do host (nome DNS) como nome de Alias.
Ex:
keytool -import -alias <google.com> -file certificate_one.cer -keystore cacerts
Java verifica padrão que o certificado CN (Nome Comum) é o mesmo que o nome do host na URL. Se o CN no certificado não é o mesmo que o nome do host , o seu cliente de serviço web falha com a seguinte exceção: java.io.IOException: HTTPS hostname errado: deve ser hostname como nos certificados.