Keytool - Problema ao importar certificado para o KeyStore
Pessoal,
Na empresa onde trabalho utilizamos o httpclient para realizar algumas operações de monitoramento em páginas web.
Nos casos onde a aplicação responde via https, precisamos importar (utilizando o Keytool) o certificado (arquivo .cer obtido clicando no cadeado do browser) ao KeyStore (arquivo cacerts), para que o httpclient consiga realizar as requisições.
Na maioria do certificados funciona tudo bem. Mas tem alguns certificados que acontece de não conseguirmos importar, pois ocorre uma exceção. Vejam abaixo:
Comando para importação do certificado:
Exceção:
Gostaria de saber se alguém conhece uma solução para este problema...
Obrigado,
Jean Pierobom
/usr/lib/j2sdk1.5-sun/jre/bin/keytool -import -alias aliasdocertificado -file /tmp/arquivo.cer -keystore arquivocacerts -storepass senhadostore
keytool error: java.security.SignatureException: Signature does not match.
Jean Pierobom
Curtidas 0
Respostas
Paulo Jr
09/04/2009
Olá,
Tbm tive este problema com um servidor de homologação na empresa que trabalho, o certificado do servidor de produção importava sem problemas, mas o de homologação dava esse erro.
No meu caso o problema estava no certificado, foi só gerar novamente o certificado para o servidor com o openssl e instalar no apache que deu certo a importação no cliente depois.
Até.
Paulo.
GOSTEI 0
Paulo Jr
09/04/2009
Paulo,
Mas me diz uma coisa... Você estava tentando importar o certificado de um servidor (o de produção) em outro servidor (o de homologação)?
Pq no meu caso, o certificado foi gerado no próprio servidor (utilizando o openssl).
Obrigado,
Jean Pierobom
GOSTEI 0
Paulo Jr
09/04/2009
Pessoal,
Criei uma classe de teste. Ela carrega o certificado (arquivo .cer) e utiliza o método java.security.cert.Certificate.verify(PublicKey arg0) (que verifica se a assinatura foi feita utilizando a chave privada que corresponde à chave pública passada como parâmetro).
CertificadoSSLLoader
TestaValidadeCertificadoSSL
A saída deste programa, como esperado, é a mesma do keytool:
O que mais me chamou atenção até aqui foi o comentário javadoc do método.
Isto me leva a crer que que há grandes chances de ser algum problema ocorrido no momento da geração do certificado no servidor do site.
Clareou para alguém?
Obrigado,
Jean Pierobom
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.security.cert.CertificateException;
import javax.security.cert.X509Certificate;
public class CertificadoSSLLoader {
public static X509Certificate load(String cerFileName) throws CertificateException {
File file = new File(cerFileName);
FileInputStream fis;
try {
fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
throw new IllegalArgumentException("Arquivo " + cerFileName + " não existe.");
}
X509Certificate certificado = X509Certificate.getInstance(fis);
return certificado;
}
}
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SignatureException;
import javax.security.cert.CertificateException;
import javax.security.cert.X509Certificate;
public class TestaValidadeCertificadoSSL {
public static void main(String[] args) {
try {
X509Certificate certificado = CertificadoSSLLoader.load("certificado.cer");
certificado.verify(certificado.getPublicKey());
} catch (InvalidKeyException e) {
System.out.println("Chave inválida.");
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
System.out.println("Algoritmo inválido.");
e.printStackTrace();
} catch (NoSuchProviderException e) {
System.out.println("Provedor inválido.");
e.printStackTrace();
} catch (SignatureException e) {
System.out.println("Assinatura inválida.");
e.printStackTrace();
} catch (CertificateException e) {
System.out.println("Ocorreu um erro ao carregar o certificado");
e.printStackTrace();
}
}
}
Assinatura inválida. java.security.SignatureException: Signature does not match. at sun.security.x509.X509CertImpl.verify(Unknown Source) at sun.security.x509.X509CertImpl.verify(Unknown Source) at com.sun.security.cert.internal.x509.X509V1CertImpl.verify(Unknown Source) at TestaValidadeCertificadoSSL.main(TestaValidadeCertificadoSSL.java:16)
abstract void verify(PublicKey key)
Verifies that this certificate was signed using the private key that corresponds to the specified public key.
GOSTEI 0
Paulo Jr
09/04/2009
Pessoal,
O certificado foi gerado novamente e a importação foi realizada com sucesso.
Obrigado à todos, em especial ao Paulo que me ligou (grande coincidência pois trabalhamos na mesma empresa e eu não sabia!) e passou o caminho das pedras.
Obrigado,
Jean Pierobom
GOSTEI 0
Wellington Carvalho
09/04/2009
OLá.. tb estou gerando certificado com openssl, e estou tendo problemas...
da um erro :
javax.security.cert.CertificateException: Could not parse certificate: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
vc ja viu isso ?
to bem enrolado ... ja tentei gerar o certificado novamente mas num tive sucesso...
usei este tutorial.. http://suporte.softwell.com.br/maker/manual/dicas_e_truques/certificacao_digital_ambiente_webrun.htm
c puder me ajudar agradesco.. vc ja viu este erro antes, como corrigiu ?
GOSTEI 0
Wellington Carvalho
09/04/2009
Tom, desculpe mas vou ficar devendo... Até pesquisei por algo mas não encontrei nada.
Acredito que seja algum problema relacionado à geração do certificado mesmo.
Até mais,
GOSTEI 0