SSL SSL e armazenamento de chaves cert

165

Como meu programa java sabe onde está o meu keystore que contém o certificado? Ou então, como digo ao meu programa java onde procurar o keystore?

Depois de especificar o keystore de alguma maneira, como especificar o certificado a ser usado para autenticar o servidor no cliente?

deborah
fonte
Para evitar o uso da configuração System.setProperty (as abordagens abaixo), consulte: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , como construir o KeyManagerFactory for SSLContext
Marek- A-

Respostas:

111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
DaveH
fonte
4
alguém sabe como referenciar isso em uma caixa do windows? System.setProperty ("javax.net.ssl.trustStore", "C: \ Arquivos de Programas (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); não está funcionando para mim :(
simgineer 17/07/2013
4
No Windows, o nome do caminho especificado deve usar barras, /, no lugar de barras invertidas, \.
Droidman 04/03
Isso funcionou? Usei o mesmo código em que meu arquivo 'jks' contém um certificado da CA. Mas ainda recebo javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Erro de transporte: 403 Erro: erro proibido quando chamo o código do cliente através dos stubs gerados pelo SOAP. Alguma ideia?
james2611nov
1
Há também uma propriedade do sistema de senha (javax.net.ssl.trustStorePassword). Também pode ser transmitido como argumentos da JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword Consulte docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
real
@ james2611nov: Se você está recebendo um erro HTTP 403 (ou qualquer outra resposta HTTP) chamando um terminal HTTPS, isso significa que você passou com êxito pela configuração do TLS: as interações HTTP ocorrem apenas quando o canal TLS está configurado ( caso contrário, eles não poderiam ser protegidos). Então - sim, esta resposta aparentemente funcionou para você. :-)
ruakh
295

As propriedades SSL são configuradas no nível da JVM por meio das propriedades do sistema. Ou seja, você pode defini-los quando executa o programa (java -D ....) ou pode defini-los no código executando System.setProperty.

As chaves específicas que você precisa definir estão abaixo:

javax.net.ssl.keyStore - local do arquivo keystore Java que contém o próprio certificado e chave privada de um processo de aplicativo. No Windows, o nome do caminho especificado deve usar barras, /, no lugar de barras invertidas.

javax.net.ssl.keyStorePassword - Senha para acessar a chave privada do arquivo keystore especificado por javax.net.ssl.keyStore. Essa senha é usada duas vezes: Para desbloquear o arquivo de armazenamento de chaves (senha de armazenamento) e Descriptografar a chave privada armazenada no armazenamento de chaves (senha de chave).

javax.net.ssl.trustStore - local do arquivo keystore Java que contém a coleção de certificados de CA confiáveis ​​por este processo de aplicativo (armazenamento confiável). No Windows, o nome do caminho especificado deve usar barras /, no lugar de barras invertidas \,.

Se um local de armazenamento confiável não for especificado usando essa propriedade, a implementação do SunJSSE procurará e utilizará um arquivo de armazenamento de chaves nos seguintes locais (em ordem):

  1. $JAVA_HOME/lib/security/jssecacerts
  2. $JAVA_HOME/lib/security/cacerts

javax.net.ssl.trustStorePassword - Senha para desbloquear o arquivo keystore (senha de armazenamento) especificado por javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType - (Opcional) Para o formato de arquivo keystore Java, essa propriedade possui o valor jks (ou JKS). Você normalmente não especifica essa propriedade, porque seu valor padrão já é jks.

javax.net.debug - Para ativar o log da camada SSL / TLS, configure essa propriedade como ssl.

Karthik Ramachandran
fonte
17
Seria mais apropriado vincular ao documento do qual isso é citado. Eu acho que é isso: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
de Bruno
4
O documento oficial deve ser o Guia de Referência do JSSE
aleung
4
O JDK7 docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/… é mais apropriado agora.
Rick-777
11
Para quem desejar editar o armazenamento confiável do sistema, a senha padrão é "changeit": community.oracle.com/thread/1540678?start=0&tstart=0
cwc
+1 para o prop javax.net.ssl.trustStorePassword. Eu estava olhando em volta por um tempo e este foi o primeiro a mencionar.
Jgreen # 519
22

Apenas uma palavra de cautela. Se você estiver tentando abrir um keystore JKS existente no Java 9 em diante, precisará mencionar também as seguintes propriedades com o valor "JKS":

javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType

O motivo é que o tipo de keystore padrão, conforme prescrito no arquivo java.security, foi alterado para pkcs12 de jks a partir do Java 9 em diante.

Sankar Natarajan
fonte
11

Primeiro de tudo, existem dois tipos de keystores.

Individual e Geral

O aplicativo usará o indicado na inicialização ou o padrão do sistema.

Será uma pasta diferente se o JRE ou JDK estiver em execução ou se você verificar a pessoal ou a "global".

Eles também são criptografados

Em resumo, o caminho será como:

$JAVA_HOME/lib/security/cacerts para o "geral", que tem toda a autoridade de certificação para as autoridades e é bastante importante.

Carlos Garcia
fonte
Os tipos são 'keystore' e 'truststore'. Por favor, não invente terminologia redundante.
Marquês de Lorne
9

você também pode mencionar o caminho em tempo de execução usando as -Dpropriedades abaixo

-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks

No meu aplicativo apache spark, eu costumava fornecer o caminho de certs e keystore usando a --confopção e extraJavaoptionsno envio de spark como abaixo

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
Balakumaran Muralidharan
fonte