Como criar keystore e armazenamento confiável usando certificado autoassinado?

17

Temos servidor e cliente JAVA se comunicam em uma rede usando SSL. O servidor e o cliente se autenticam mutuamente usando certificados. O tipo de armazenamento de chaves usado pelo servidor e pelo cliente é JKS. O servidor e o cliente carregam seus arquivos de keystore e armazenamento confiável. Os nomes dos arquivos keystore e truststore são: server.keystore, server.truststore, client.keystore e client.truststore. Estou usando certificados autoassinados apenas para teste.

Questões:

Q1 Gostaria de saber por que preciso adicionar os certificados do servidor e do cliente em seus respectivos armazenamentos confiáveis, na etapa 6.

Q2 Posso reduzir as etapas numéricas para obter a mesma coisa? Se sim, então como?

Etapas para criar chave RSA, certificados autoassinados, keystore e armazenamento confiável para um servidor

  1. Gere uma chave RSA privada

    openssl genrsa -out diagserverCA.key 2048
    
  2. Crie um certificado x509

    openssl req -x509 -new -nodes -key diagserverCA.key \
                -sha256 -days 1024 -out diagserverCA.pem
    
  3. Crie um keystore PKCS12 a partir da chave privada e do certificado público.

    openssl pkcs12 -export -name server-cert \
                   -in diagserverCA.pem -inkey diagserverCA.key \
                   -out serverkeystore.p12
    
  4. Converter keystore PKCS12 em um keystore JKS

    keytool -importkeystore -destkeystore server.keystore \
            -srckeystore serverkeystore.p12 -srcstoretype pkcs12 
            -alias server-cert
    
  5. Importe o certificado de um cliente para o armazenamento confiável do servidor.

    keytool -import -alias client-cert \
            -file diagclientCA.pem -keystore server.truststore
    
  6. Importe o certificado de um servidor para o armazenamento confiável do servidor.

    keytool -import -alias server-cert \
            -file diagserverCA.pem -keystore server.truststore
    

Etapas para criar chave privada RSA, certificado autoassinado, keystore e armazenamento confiável para um cliente

  1. Gere uma chave privada

    openssl genrsa -out diagclientCA.key 2048
    
  2. Crie um certificado x509

    openssl req -x509 -new -nodes -key diagclientCA.key \
                -sha256 -days 1024 -out diagclientCA.pem
    
  3. Crie o keystore PKCS12 a partir da chave privada e do certificado público.

    openssl pkcs12 -export -name client-cert \
                   -in diagclientCA.pem -inkey diagclientCA.key \
                   -out clientkeystore.p12
    
  4. Converter um keystore PKCS12 em um keystore JKS

    keytool -importkeystore -destkeystore client.keystore \
            -srckeystore clientkeystore.p12 -srcstoretype pkcs12 \
            -alias client-cert
    
  5. Importe o certificado de um servidor para o armazenamento confiável do cliente.

    keytool -import -alias server-cert -file diagserverCA.pem \
            -keystore client.truststore
    
  6. Importe o certificado de um cliente para o armazenamento confiável do cliente.

    keytool -import -alias client-cert -file diagclientCA.pem \
            -keystore client.truststore
    
vic99
fonte

Respostas:

3

Https normais requerem apenas 1 comando;

keytool -genkeypair

Se o cliente não confia cegamente em nenhum certificado, é necessário copiar o certificado público do servidor para o cliente.

Por que você está usando o openssl?

https://docs.oracle.com/javase/10/tools/keytool.htm

user1133275
fonte
Até que minha edição seja revisada por pares: o sinalizador é -genkeypair e você pode adicionar vários sinalizadores diferentes para personalizar o certificado (por exemplo, -validity 365 ou -dname "cn = Mark Jones, ou = JavaSoft, o = Sun, c = US "). É melhor ver o link na resposta para obter mais detalhes.
Johannes Stadler
1
Graças @JohannesStadler eu aprovei a sua edição e atualizou o link para a versão mais recente java, nota que "Este comando foi nomeado -genkey nas versões anteriores"
user1133275