На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Java FAQ
1. Данный раздел предназначен только для публикации готовых статей, с вопросами обращайтесь в соответствующие подразделы.
2. Все вопросы, связанные с ошибками или неточностями в представленных материалах направляйте модераторам персональным сообщением.
3. Все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут доступны остальным участникам после одобрения модераторами.
Модераторы: dark_barker, wind
  
> Настройка SSL для Tomcat
    Читаем документацию Tomcat 5.5 (SSL Configuration HOW-TO и Apache Tomcat Configuration Reference - The HTTP Connector), делаем, как написано (c дополнениями и уточнениями, т. к. в документации рассчитывают на стандартный keystore, поставляемый с jre/jdk):
    • Создаём keystore с ключом:
      ExpandedWrap disabled
        >keytool -genkey -alias tomcat -keyalg RSA -keystore mystore
        Enter keystore password:  mystorepassword
        What is your first and last name?
          [Unknown]:  firstname lastname
        What is the name of your organizational unit?
          [Unknown]:  organizationalunit
        What is the name of your organization?
          [Unknown]:  organization
        What is the name of your City or Locality?
          [Unknown]:  city
        What is the name of your State or Province?
          [Unknown]:  state
        What is the two-letter country code for this unit?
          [Unknown]:  ru
        Is CN=firstname lastname, OU=organizationalunit, O=organization, L=city, ST=state, C=ru correct?
          [no]:  yes
         
        Enter key password for <tomcat>
                (RETURN if same as keystore password):
         
        >
      Обратите внимание на то, что для ключа пароль не был введён (в этом случае используется пароль хранилища). В принципе, можно было бы указать отдельный пароль для ключа в конфигурации, но в текущей документации я почему-то такого параметра не нашёл.
    • Конфигурируем SSL-коннектор (фрагмент server.xml):
      ExpandedWrap disabled
        <Connector port="8443" maxHttpHeaderSize="8192"
                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                 enableLookups="false" disableUploadTimeout="true"
                 acceptCount="100" scheme="https" secure="true"
                 clientAuth="false" sslProtocol="TLS"
                 keystoreFile="mystore" keystorePass="mystorepassword" keystoreType="JKS"
                 keyAlias="tomcat"/>
      Содержимое до атрибута "keystoreFile" взято из закоментированного примера там же, в server.xml.

    Всё, можно запускать Tomcat, SSL уже работает. Осталось разобраться с двухфазовым SSL.

    Механизм проверки очень прост: необходимо, чтобы у сервера нашелся ключ, subject distinguished name которого будет совпадать с issuer distinguished name проверяемого ключа (при этом клиент не обязательно должен обладать таким ключом, т. к. можно в диалоговом режиме подтвердить доверие). Когда используются ключи, выданные центром сертификации, у нас уже есть публичный ключ центра и свой, подписанный этим центром. В случае с самоподписанным ключом (именно такие ключи по создаёт keytool) необходимо, чтобы публичный ключ используемый клиентом, был в truststore сервера.

    Я приведу пример для второго случая.
    • Ключ для сервера у меня уже есть, теперь нужен ключ для клиента:
      ExpandedWrap disabled
        >keytool -genkey -alias client -keyalg RSA -keystore myclientstore -storetype PKCS12
        Enter keystore password:  myclientstorepassword
        What is your first and last name?
          [Unknown]:  client
        What is the name of your organizational unit?
          [Unknown]:  orgunit
        What is the name of your organization?
          [Unknown]:  org
        What is the name of your City or Locality?
          [Unknown]:  locality
        What is the name of your State or Province?
          [Unknown]:  state
        What is the two-letter country code for this unit?
          [Unknown]:  RU
        Is CN=client, OU=orgunit, O=org, L=locality, ST=state, C=RU correct?
          [no]:  yes
         
        Enter key password for <client>
                (RETURN if same as keystore password):
      Обратите внимание на то, что я задал другой тип хранилища - мой браузер не понимает формата JKS.
    • Теперь нужно поместить публичный ключ в truststore сервера. Для этого я импортирую его из полученного хранилища:
      ExpandedWrap disabled
        >keytool -export -alias client -keyalg RSA -keystore myclientstore -storetype PKCS12 -file clientcert
        Enter keystore password:  myclientstorepassword
        Certificate stored in file <clientcert>
    • Полученный файл я импортирую в новое хранилище для сервера (это и будет truststore):
      ExpandedWrap disabled
        >keytool -import -alias client -keyalg RSA -keystore mytruststore -storetype JKS -file clientcert
        Enter keystore password:  mytruststorepassword
        Owner: CN=client, OU=orgunit, O=org, L=locality, ST=state, C=RU
        Issuer: CN=client, OU=orgunit, O=org, L=locality, ST=state, C=RU
        Serial number: 462a2361
        Valid from: Sat Apr 21 18:44:49 MSD 2007 until: Fri Jul 20 18:44:49 MSD 2007
        Certificate fingerprints:
                 MD5:  78:55:83:13:3A:4F:DB:CA:1A:60:5E:A4:87:1D:EC:93
                 SHA1: 7A:A7:7C:C6:71:2B:82:74:9C:4F:C7:3D:FA:14:AD:2A:E5:BF:39:2F
        Trust this certificate? [no]:  yes
        Certificate was added to keystore
    • Дополняю конфигурацию сервера. Теперь конфигурация SSL-коннектора выглядит так:
      ExpandedWrap disabled
        <Connector port="8443" maxHttpHeaderSize="8192"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" disableUploadTimeout="true"
                   acceptCount="100" scheme="https" secure="true"
                   clientAuth="true" sslProtocol="TLS"
                   keystoreFile="mystore" keystorePass="mystorepassword" keystoreType="JKS"
                   keyAlias="tomcat"
                   truststoreFile="mytruststore" truststorePass="mytruststorepassword" truststoreType="JKS"/>
    • Перезапускаю сервер. Теперь мне осталось зарегистрировать свои ключи в браузере. Я использую Оперу, поэтому в меню Tools выбираю пункт Preferences, далее вкладку Advanced, пункт списка Security, нажимаю Manage certificates; импортирую файл myclientstore.

    Всё, теперь можно открывать в браузере https://localhost:8443.


    Если вы хотите, чтобы браузер не спрашивал каждый раз о доверии серверу, нужно экпортировать публичный ключ из хранилища mystore и зарегистрировать его в браузере, как ключ доверенного центра сертификации.


    Гораздо более простой вариант (для тестов) - использовать одно и то же хранилище для всего (нужно только выбрать верный формат). Тогда не нужно будет ничего никуда импортировать/экспортировать.
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0209 ]   [ 16 queries used ]   [ Generated: 26.04.24, 22:36 GMT ]