Como importar corretamente um certificado autoassinado para o keystore Java que está disponível para todos os aplicativos Java por padrão?

144

Quero importar um certificado autoassinado para Java, para que qualquer aplicativo Java que tente estabelecer uma conexão SSL confie neste certificado.

Até agora, consegui importá-lo no

keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem

Ainda assim, quando eu tento correr HTTPSClient.class , ainda recebo:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: falha na construção do caminho PKIX: sun.security.provider.certpath.SunCertPathBuilderException: não foi possível encontrar o caminho de certificação válido para o destino solicitado
sorin
fonte
Eu não confiaria necessariamente nesse código. Coisas como Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())são completamente desnecessárias na primeira parte. O segundo não faz nenhuma verificação de certificação. Tente com uma planície URLConnectionpara começar. Tem certeza que você tenha modificado cacertsno lib/securityde sua instalação JRE? Você já tentou a trustmanageropção de depuração ?
23712 Bruno Bruno

Respostas:

225

No Windows, a maneira mais fácil é usar o portecle do programa .

  1. Baixe e instale o portecle.
  2. Primeiro, verifique 100% se você sabe qual JRE ou JDK está sendo usado para executar seu programa. Em um Windows 7 de 64 bits, pode haver alguns JREs. O Process Explorer pode ajudá-lo com isso ou você pode usar:System.out.println(System.getProperty("java.home"));
  3. Copie o arquivo JAVA_HOME \ lib \ security \ cacerts para outra pasta.
  4. No Portecle, clique em Arquivo> Abrir Arquivo de Keystore
  5. Selecione o arquivo cacerts
  6. Digite esta senha: changeit
  7. Clique em Ferramentas> Importar Certificado Confiável
  8. Procure o arquivo mycertificate.pem
  9. Clique em Importar
  10. Clique em OK para o aviso sobre o caminho de confiança.
  11. Clique em OK quando exibir os detalhes sobre o certificado.
  12. Clique em Sim para aceitar o certificado como confiável.
  13. Quando solicitar um alias, clique em OK e clique em OK novamente quando indicar que importou o certificado.
  14. Clique em salvar. Não se esqueça disso ou a alteração foi descartada.
  15. Copie o arquivo cacerts de volta onde você o encontrou.

No Linux:

Você pode fazer o download do certificado SSL de um servidor Web que já o esteja usando assim:

$ echo -n | openssl s_client -connect www.example.com:443 | \
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt

Opcionalmente, verifique as informações do certificado:

$ openssl x509 -in /tmp/examplecert.crt -text

Importe o certificado para o keystore Java cacerts:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt
Sarel Botha
fonte
1
A idéia principal disso não é portecle, mas importar certificados para o keystore certo.
Alfabravo 23/07/12
Isso funcionou, mas meu java estava em um local diferente. Meu keystore estava localizado em / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts, que eu encontrei executando, ps -ef | grep javaque me dizia que meu java estava sendo executado a partir do openjdk localizado em / usr / lib / jvm / java-openjdk / bin / java. Além disso, se isso for para um aplicativo da web, lembre-se de reiniciar. Obrigado pela ajuda!!
Codezilla
7
Eu não usei portecle, mas eu achei que Keystore Explorador funciona muito bem para Windows, Linux, (e ele deve funcionar no OSX também)
Xantix
Muito útil mesmo. 2 coisas muito importantes destacadas aqui. Um deles é sobre a importação no keystore certo. E outra é certificar-se de reiniciar no caso de um servidor da web.
Sdm
6
Em 2019, podemos obter certificados SSL gratuitamente usando serviços como o Lets encrypt
Ferrybig 13/03/19
41
    D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate"
Vikky
fonte
12
Você será solicitado a fornecer a senha do keystore, o padrão é "changeit"
The Gilbert Arenas Dagger
34

Acabei escrevendo um pequeno script que adiciona os certificados às lojas de chaves, por isso é muito mais fácil de usar.

Você pode obter a versão mais recente em https://github.com/ssbarnea/keytool-trust

#!/bin/bash
# version 1.0
# https://github.com/ssbarnea/keytool-trust
REMHOST=$1
REMPORT=${2:-443}

KEYSTORE_PASS=changeit
KEYTOOL="sudo keytool"

# /etc/java-6-sun/security/cacerts

for CACERTS in  /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \
    /usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts \
    "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts"
do

if [ -e "$CACERTS" ]
then
    echo --- Adding certs to $CACERTS

# FYI: the default keystore is located in ~/.keystore

if [ -z "$REMHOST" ]
    then
    echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443."
    exit 1
    fi

set -e

rm -f $REMHOST:$REMPORT.pem

if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null
        then
        :
        else
        cat /tmp/keytool_stdout
        cat /tmp/output
        exit 1
        fi

if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem
        then
        :
        else
        echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)"
        cat /tmp/output
        fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null
    then
    echo "Key of $REMHOST already found, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null
    then
    echo "Key of $REMHOST already found in cacerts, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

fi

done

`` ``

sorin
fonte
18

Isso funcionou para mim. :)

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 
Caminhar
fonte
4

Se você estiver usando um certificado assinado por uma Autoridade de Certificação que não esteja incluído no arquivo cacerts Java por padrão, será necessário concluir a seguinte configuração para conexões HTTPS. Para importar certificados para cacerts:

  1. Abra o Windows Explorer e navegue até o arquivo cacerts, localizado na subpasta jre \ lib \ security em que o AX Core Client está instalado. O local padrão é C: \ Arquivos de programas \ ACL Software \ AX Core Client \ jre \ lib \ security
  2. Crie uma cópia de backup do arquivo antes de fazer alterações.
  3. Dependendo dos certificados que você recebe da Autoridade de Certificação que está usando, pode ser necessário importar um certificado intermediário e / ou certificado raiz para o arquivo cacerts. Use a seguinte sintaxe para importar certificados: keytool -import -alias -keystore -trustcacerts -file
  4. Se você estiver importando os dois certificados, o alias especificado para cada certificado deve ser exclusivo.
  5. Digite a senha do keystore no prompt “Password” e pressione Enter. A senha Java padrão para o arquivo cacerts é "changeit". Digite 'y' em "Confiar neste certificado?" prompt e pressione Enter.
Bharat Darakh
fonte
Utilize este comando: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh
1

O comando simples 'keytool' também funciona no Windows e / ou no Cygwin.

Se você estiver usando o Cygwin, aqui está o comando modificado que usei na parte inferior da resposta "S.Botha's":

  1. certifique-se de identificar o JRE dentro do JDK que você usará
  2. Inicie seu prompt / cygwin como administrador
  3. entre no diretório bin desse JDK, por exemplo, cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Execute o comando keytool a partir dele, onde você fornece o caminho para o seu novo Cert no final, da seguinte maneira:

    ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts  -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"

Observe que, se estiver no Cygwin, você está dando um caminho para um programa que não seja do Cygwin, portanto, o caminho é semelhante ao DOS e entre aspas.

Jordan Gee
fonte
0

Pode querer tentar

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem

Sinceramente, não faço ideia de onde ele coloca seu certificado, se você apenas escrever, cacertsapenas dê um caminho completo

Gradiente
fonte
0

instalar certificado no java linux

/ opt / jdk (versão) / bin / keytools -import -alias aliasname -arquivo certificate.cer -keystore cacerts -storepass password

Apuri Srikanth
fonte
0
fist get the certificate from the provider
create a file ends wirth .cer and pase the certificate

copy the text file or  past   it  somewhere you can access it 
then use the cmd prompt as an admin and cd to the bin of the jdk,
the cammand that will be used is the:  keytool 

change the  password of the keystore with :

keytool  -storepasswd -keystore "path of the key store from c\ and down"

the password is : changeit 
 then you will be asked to enter the new password twice 

then type the following :

keytool -importcert -file  "C:\Program Files\Java\jdk-13.0.2\lib\security\certificateFile.cer"   -alias chooseAname -keystore  "C:\Program Files\Java\jdk-13.0.2\lib\security\cacerts"
Hilal Aissani
fonte