SSL SSL e Keystore cert

Como meu programa java sabe onde meu armazenamento de chaves contém o certificado? Ou como posso dizer ao meu programa java onde procurar o keystore?

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

    System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file); 

    As propriedades SSL são configuradas no nível da JVM por meio das propriedades do sistema. O que significa que você pode configurá-los quando você executa o programa (java -D ….) Ou você pode configurá-los no código, fazendo 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 certificado e a 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. Esta senha é usada duas vezes: Para desbloquear o arquivo de armazenamento de chaves (senha de armazenamento) e Para descriptografar a chave privada armazenada no armazenamento de chaves (senha da chave).

    javax.net.ssl.trustStore – Local do arquivo keystore Java que contém a coleção de certificados CA confiáveis ​​por este processo de aplicativo (truststore). 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 usará 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 de armazenamento de chaves (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 registro para a camada SSL / TLS, configure essa propriedade como ssl.

    Primeiro de tudo, existem dois tipos de keystores.

    Individual e Geral

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

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

    Eles também são criptografados

    Em suma, o caminho será como:

    $JAVA_HOME/lib/security/cacerts para o “geral”, que tem toda a CA para as Autoridades e é bastante importante.

    você também pode mencionar o caminho em tempo de execução usando propriedades -D como 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 opção extraJavaoptions e extraJavaoptions em spark-submit 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' 

    Apenas uma palavra de caucanvas. Se você está tentando abrir um keystore JKS existente no Java 9, é necessário mencionar as seguintes propriedades também com valor como “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 do Java 9 em diante.