Самостоятельный SSL-сертификат Tomcat Server/Client

У меня есть сервер Apache Tomcat 6.x, работающий с самоподписанным сертификатом SSL. Я хочу, чтобы клиент представил свой сертификат на сервер, чтобы я мог аутентифицировать их на основе базы данных пользователей. Я все это работаю на примере, который я нашел в Интернете, но в примере появились консервированные сертификаты и хранилище данных JKS с предварительной сборкой. Я хочу создать собственное хранилище данных со своими сертификатами, но мне не повезло.

Как создать хранилище данных для Tomcat? Как создать самозаверяющий сертификат для Tomcat?

Как создать самозаверяющий сертификат для клиента?
Как заставить Tomcat доверять подписи клиента?

Я уже много часов играю с java keytool.

Ответ 1

Наконец-то получил решение моей проблемы, поэтому я опубликую результаты здесь, если кто-нибудь застрянет.

Спасибо Майклу Мартину Michael Software Thoughts and Ramblings Я обнаружил, что:

keytool по умолчанию использует DSA алгоритм при генерации самоподписанный сертификат. Более ранние версии Firefox принял эти ключи без проблема. С Firefox 3 beta 5, используя DSA не работает, но использование RSA делает. Передача "-keyalg RSA" при генерации самозаверяющий сертификат создает сертифицировать Firefox 3 beta 5 полностью принимает.

Я просто установил этот флаг, очистил все кеши в FireFox, и он работал как шарм! Я использую это как тестовую настройку для своего проекта, и мне нужно поделиться этим с другими людьми, поэтому я написал небольшую партию script, которая создает два сертификата SSL. Можно добавить в программу Tomcat, а другой - файл .p12, который можно импортировать в FireFox/IE. Спасибо!

Использование: первый аргумент командной строки - это имя пользователя клиента. Все пароли являются "паролем" (без котировок). Измените любой из жестко закодированных битов, чтобы удовлетворить ваши потребности.

@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

Результаты состоят из двух файлов. Один из них называется server.jks, который вы бросаете в Tomcat и другой файл с именем {username}.p12, который вы импортируете в свой браузер. Файл server.jks имеет сертификат клиента, добавленный как доверенный сертификат.

Я надеюсь, что кто-то найдет это полезным.

И вот XML, который нужно добавить в ваш файл Tomcat conf/sever.xml(тестируется только на 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"
/>

Для 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" />    

Ответ 2

Чтобы включить аутентификацию клиента, вам нужно указать "хранилище доверия" для Tomcat: хранилище ключей, содержащее сертификаты от корневых центров сертификации, которым вы доверяете, каждый из которых помечен как "trustEntry".

Это определяется атрибутами элемента Connector: truststoreFile, truststorePass (который по умолчанию имеет значение keystorePass) и truststoreType (по умолчанию это "JKS" ).

Если клиент использует самозаверяющий сертификат, то его "корневым" ЦС является сам сертификат; из этого следует, что вам нужно импортировать самозаверяющий сертификат клиента в хранилище доверия Tomcat.

Если у вас много клиентов, это быстро станет хлопот. В этом случае вы можете захотеть ознакомиться с подписью сертификатов для своих клиентов. Команда Java keytool не может этого сделать, но все необходимые утилиты командной строки доступны в OpenSSL. Или вы могли бы взглянуть на что-то вроде EJBCA в больших масштабах.

Еще лучше попросите своих клиентов использовать существующий бесплатный СА, например startcom.org. Это не всегда работает для сертификатов сервера, поскольку сертификат StartCom не включен во все браузеры, но эта ситуация отменена, и корневой сертификат StartCom можно легко импортировать в хранилище доверия Tomcat.

Ответ 3

Создать сертификат:

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

Введите все данные для самоподписанного сертификата, которые вам нужны, затем отредактируйте Tomcat server.xml и укажите свойства хранилища ключей на соединителе SSL, например:

<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" />

или следуйте за документами Tomcat...

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

Ответ 4

Предыдущие ответы полезны для меня, но не имеют версии инструмента для оболочки. Поэтому я написал один.

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

Для tomcat8 можно добавить следующую конфигурацию в 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"
    />