Pergunta

Eu tenho um servidor 6.x Apache Tomcat rodando com um certificado SSL auto-assinado. Eu quero que o cliente para apresentar o seu próprio certificado para o servidor para que eu possa autenticá-los com base em um banco de dados de usuários. Eu tenho tudo de trabalho com base em um exemplo que eu encontrei on-line, mas o exemplo veio com certificados enlatados e um pré-build JKS armazenamento de dados. Eu quero criar meu próprio armazenamento de dados com os meus próprios certificados, mas estou tendo nenhuma sorte.

Como faço para criar um armazenamento de dados para Tomcat?
Como faço para criar um certificado auto-assinado para Tomcat?

Como faço para criar um certificado auto-assinado para o cliente?
Como faço para forçar o Tomcat a confiar a assinatura do cliente?

Eu tenho jogado com java keytool por muitas horas agora.

Foi útil?

Solução

Finalmente temos a solução para o meu problema, então vou postar os resultados aqui se alguém fica preso.

Graças à Michael Martin de do Software Pensamentos & Ramblings descobri que Michael:

keytool por padrão usa o DSA ao gerar o algoritmo auto-assinado cert. As versões anteriores do Firefox aceita estas teclas sem problema. Com o Firefox 3 beta 5, usando O DSA não funcionar, mas usando RSA faz. Passando "RSA -keyalg" Ao gerar o certificado auto-assinado cria um cert o Firefox 3 beta 5 totalmente aceita.

Eu simplesmente definir essa bandeira, limpou todos os caches no Firefox e funcionou como um encanto! Eu estou usando isso como um teste-setup para o meu projeto e eu preciso compartilhar isso com outras pessoas, então eu escrevi um script em lotes pouco que cria dois certificados SSL. Um pode ser descartado na configuração Tomcat eo outro é um arquivo .p12 que podem ser importados para o Firefox / IE. Obrigado!

Uso: primeiro argumento de linha de comando é o nome de usuário do cliente. Todas as senhas são "password" (sem as aspas). Alterar qualquer um dos bits codificados para atender às suas necessidades.

@echo off
if "%1" == "" goto usage

keytool -genkeypair -alias servercert -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -keystore server.jks -storepass password
keytool -genkeypair -alias %1 -keystore %1.p12 -storetype pkcs12 -keyalg RSA -dname "CN=%1,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -storepass password
keytool -exportcert -alias %1 -file %1.cer -keystore %1.p12 -storetype pkcs12 -storepass password
keytool -importcert -keystore server.jks -alias %1 -file %1.cer -v -trustcacerts -noprompt -storepass password
keytool -list -v -keystore server.jks -storepass password
del %1.cer
goto end

:usage
echo Need user id as first argument: generate_keystore [username]
goto end

:end
pause

Os resultados são dois arquivos. Um chamado server.jks que você cair em Tomcat e um outro arquivo chamado {username} .p12 que você importar para o seu browser. O arquivo server.jks tem o certificado do cliente adicionado como um cert confiável.

Espero que alguma outra pessoa acha isso útil.

E aqui está o XML que precisa ser adicionado à sua conf arquivo Tomcat / sever.xml (somente testado em no Tomcat 6.x)

<Connector
   clientAuth="true" port="8443" minSpareThreads="5" maxSpareThreads="75"
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100" maxThreads="200"
   scheme="https" secure="true" SSLEnabled="true"
   keystoreFile="${catalina.home}/conf/server.jks"
   keystoreType="JKS" keystorePass="password"
   truststoreFile="${catalina.home}/conf/server.jks"
   truststoreType="JKS" truststorePass="password"
   SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2" sslProtocol="TLS"
/>

Para Tomcat 7:

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" SSLEnabled="true"
           maxThreads="200" scheme="https" secure="true"
           keystoreFile="${catalina.base}/conf/server.jks" keystorePass="password"
           clientAuth="false" sslProtocol="TLS" />    

Outras dicas

Para ativar a autenticação do cliente, você precisa especificar uma "loja de confiança" para Tomcat: um armazenamento de chaves contendo certificados das autoridades de certificação raiz que você confia, cada sinalizado como um "trustEntry"

.

Esta é especificado por atributos do elemento Connector: truststoreFile, truststorePass (cujo padrão é o valor de keystorePass) e truststoreType (cujo padrão é "JKS")

.

Se um cliente está usando um certificado auto-assinado, então o seu "root" CA é o próprio certificado; segue-se, então, que você precisa importar o certificado auto-assinado do cliente no armazenamento de confiança do Tomcat.

Se você tem muitos clientes, isso vai se tornar rapidamente um aborrecimento. Nesse caso, você pode querer olhar para assinar certificados para os seus clientes. O comando keytool Java não pode fazer isso, mas todos os utilitários de linha de comando necessários estão disponíveis no OpenSSL. Ou você pode olhar para algo como EJBCA em grande escala.

Melhor ainda, pergunte a seus clientes para usar uma CA livre existente, como startcom.org . Isso nem sempre funciona para certificados de servidor, porque do Red Hat certificado não está incluído em todos os navegadores, mas esta situação é inversa, eo Red Hat certificado raiz poderia ser facilmente importado para o armazenamento de confiança Tomcat.

Criar certificado:

keytool -genkey -alias tomcat -keyalg RSA -keystore /home/bob/mykeystore

Digite todos os dados para o certificado auto-assinado que você precisa, em seguida, editar Tomcat de server.xml e especificar as propriedades de armazenamento de chave no conector SSL, por exemplo:.

<Connector port="8443" maxHttpHeaderSize="8192"
        maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
        enableLookups="false" disableUploadTimeout="true"
        acceptCount="100" scheme="https" secure="true"
        keystoreFile="/home/bob/mykeystore"
        clientAuth="false" sslProtocol="TLS" />

ou seguir o docs Tomcat ...

http://tomcat.apache.org/tomcat-6.0 -doc / ssl-HOWTO.html

As respostas anteriores são úteis para mim, mas não têm uma versão da ferramenta shell. Então eu escrevi um.

key_gen.sh:

#! /bin/bash
# a key generator for https,

basename=server
key_algorithm=RSA
password_key=123456
password_store=123456
country=US

# clean - pre
rm "${basename}.jks"

# generate server side
keytool -genkeypair -alias "${basename}cert" -keyalg $key_algorithm -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=${country}" -keypass $password_key -keystore "${basename}.jks" -storepass $password_store

Para tomcat8, poderia acrescentar seguinte configuração para server.xml:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
        maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
        clientAuth="false" sslProtocol="TLS"
        acceptCount="75" keystoreFile="${catalina.home}/conf/server.jks" keystorePass="123456"
    />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top