Сервер/клиент Tomcat Самозаверяющий SSL-сертификат
У меня есть Apache Tomcat 6.X-сервер работает с самоподписанным сертификатом SSL. Я хочу, чтобы клиент представил свой собственный сертификат серверу, чтобы я мог аутентифицировать их на основе базы данных пользователей. У меня все это работает на примере, который я нашел в интернете, но пример пришел с консервированными сертификатами и хранилищем данных JKS перед сборкой. Я хочу создать свое собственное хранилище данных с моими собственными сертификатами, но мне не повезло.
Как создать хранилище данных для Tomcat?
Как Я создаю самозаверяющий сертификат для Tomcat?
Как создать самозаверяющий сертификат для клиента?
Как заставить Tomcat доверять подписи клиента?
Я играл с java keytool в течение многих часов.
4 ответов
наконец-то получил решение моей проблемы, поэтому я опубликую результаты здесь, Если кто-то еще застрянет.
спасибо Майклу Мартину из программные мысли и бессвязные мысли Майкла я обнаружил, что:
keytool по умолчанию использует DSA алгоритм при генерации самозаверяющий сертификат. Более ранние версии Firefox принял эти ключи без проблема. С Firefox 3 beta 5, используя DSA не работает, но использование RSA делает. Проходящий "-keyalg ОГА" при создании самозаверяющий сертификат создает сертификат Firefox 3 beta 5 полностью примет.
Я просто установил этот флаг, очистил все кэши в FireFox, и он работал как шарм! Я использую это как тест-установки для моего проекта, и мне нужно поделиться этим с другими людьми, поэтому я написал маленький скрипт, который создает SSL-сертификатов. Один может быть сброшен в настройку Tomcat, а другой-a .файл 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
результаты представляют собой два файла. Один называется сервер.jks, который вы бросаете в Tomcat и другой файл с именем {username}.p12, который вы импортируете в свой браузер. Сервер.файл 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" />
чтобы включить аутентификацию клиента, необходимо указать " хранилище доверия "для Tomcat: хранилище ключей, содержащее сертификаты от корневых центров сертификации, которым Вы доверяете, каждый из которых помечен как"trustEntry".
это определяется Connector
атрибуты элемента:truststoreFile
, truststorePass
(по умолчанию используется значение keystorePass
), и truststoreType
(по умолчанию "JKS").
если клиент использует самозаверяющий сертификат, то его "корневой" CA является сертификатом из этого следует, что вам необходимо импортировать самозаверяющий сертификат клиента в хранилище доверия Tomcat.
если у вас много клиентов, это быстро станет проблемой. В этом случае может потребоваться изучить возможность подписания сертификатов для клиентов. В Java keytool
команда не может этого сделать, но все необходимые утилиты командной строки доступны в OpenSSL. Или вы могли бы заглянуть во что-то вроде EJBCA в крупном размере.
еще лучше, попросите своих клиентов использовать существующий бесплатный CA, напримерstartcom.org. Это не всегда работает для сертификатов сервера, потому что сертификат StartCom не включен во все браузеры, но эта ситуация обращена вспять, и корневой сертификат StartCom можно легко импортировать в хранилище доверия Tomcat.
создать сертификат:
keytool -genkey -alias tomcat -keyalg RSA -keystore /home/bob/mykeystore
введите все данные для самозаверяющего сертификата, который вам нужен, затем отредактируйте Tomcat сервер.в 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...
предыдущие ответы полезны для меня, но не имеют версии инструмента оболочки. И я написал одну.
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"
/>