Установление безопасного соединения с TLS¶
Fabric поддерживает защищенную связь между узлами через TLS. TLS-соединение может использовать как одностороннюю (только сервер), так и двустороннюю (сервер и клиент) аутентификацию.
Настройка TLS для пир-узлов¶
Пир-узел является и TLS-сервером, и TLS-клиентов. Первым он является, когда другой узел, приложение или CLI устанавливает с ним соединение, а последним — когда он сам устанавливает это соединение с другим пиром или ордерером.
Чтобы включить TLS на пир-узле, необходимо установить следующие параметры конфигурации:
- peer.tls.enabled = true
- peer.tls.cert.file = полный путь к файлу, содержащему серверный сертификат
- peer.tls.key.file = полный путь к файлу, содержащему серверный приватный ключ
- peer.tls.rootcert.file = полный путь к файлу, содержащему цепочку сертификатов CA, выдавшего серверный сертификат
По умолчанию, если TLS включен на узле, то аутентификация клиентов выключена. Это означает, что пир-узел не будет проверять сертификаты клиентов (другого пира, приложения или CLI) во время TLS-рукопожатия. Чтобы включить аутентификацию клиентов, установите параметр peer.tls.clientAuthRequired на true , и peer.tls.clientRootCAs.files на файлы цепочек CA, содержащие сертификаты CA, выдающие TLS-сертификаты клиентам вашей организации.
По умолчанию, узел будет использовать одни и те же сертификат и ключ в роли сервера и в роли клиента. Чтобы в роли клиента использовать другую пару сертификат+ключ, используйте параметры peer.tls.clientCert.file и peer.tls.clientKey.file .
TLS может также быть настроен через следующие переменные окружения:
- CORE_PEER_TLS_ENABLED = true
- CORE_PEER_TLS_CERT_FILE = полный путь к серверному сертификату
- CORE_PEER_TLS_KEY_FILE = полный путь к серверному приватному ключу
- CORE_PEER_TLS_ROOTCERT_FILE = полный путь к файлу с цепочкой CA
- CORE_PEER_TLS_CLIENTAUTHREQUIRED = true
- CORE_PEER_TLS_CLIENTROOTCAS_FILES = полный путь к файлу с цепочкой CA клиентов
- CORE_PEER_TLS_CLIENTCERT_FILE = полный путь к клиентскому сертификату
- CORE_PEER_TLS_CLIENTKEY_FILE = полный путь к клиентскому приватному ключу
Когда включен аутентификация клиентов, клиенту требуется послать свой сертификат во время TLS-рукопожатия, иначе рукопожатие провалится и пир закроет соединение.
Когда пир присоединяется к каналу, корневые цепочки CA сертификатов участников канала считываются пиром из конфигурационного блока и добавляются в структуру данных, содержащую корневые CA-сертификаты TLS клиентов и серверов. Так peer-to-peer и peer-to-orderer коммуникация должна сработать беcшовно.
Настройка TLS для ордерер-узлов¶
Чтобы включить TLS на ордеринг-узлах, установите следующие параметры конфигурации:
- General.TLS.Enabled = true
- General.TLS.PrivateKey = полный путь к файлу, содержащему серверный приватный ключ
- General.TLS.Certificate = полный путь к файлу, содержащему серверный сертификат
- General.TLS.RootCAs = полный путь к файлу, содержащему цепочку сертификатов CA, выдавшего серверные сертификаты
По умолчанию, TLS-аутентификация клиентов выключена, как и в случае с пиром. Чтобы включить аутентификацию клиентов, установите следующие параметры конфига:
- General.TLS.ClientAuthRequired = true
- General.TLS.ClientRootCAs = полный путь к файлу, содержащему цепочку CA, выдавшего файлы клиентам
TLS может также быть настроен через следующие переменные окружения:
- ORDERER_GENERAL_TLS_ENABLED = true
- ORDERER_GENERAL_TLS_PRIVATEKEY = полный путь к файлу, содержащему серверный приватный ключ
- ORDERER_GENERAL_TLS_CERTIFICATE = полный путь к файлу, содержащему серверный сертификат
- ORDERER_GENERAL_TLS_ROOTCAS = полный путь к файлу, содержащему цепочку сертификатов CA, выдавшего серверные сертификаты
- ORDERER_GENERAL_TLS_CLIENTAUTHREQUIRED = true
- ORDERER_GENERAL_TLS_CLIENTROOTCAS = полный путь к файлу, содержащему цепочку CA, выдавшего файлы клиентам
Configuring TLS for the peer CLI¶
Следующие переменные окружения должны быть установлены при использовании CLI-команд для взаимодействия с пиром с включенным TLS:
- CORE_PEER_TLS_ENABLED = true
- CORE_PEER_TLS_ROOTCERT_FILE = полный путь к файлу, содержащему цепочку сертификатов CA, выдавшего серверные сертификаты
Если на удаленном сервере также включена аутентификация клиентов, в дополнение к переменным выше необходимо установить следующие:
- CORE_PEER_TLS_CLIENTAUTHREQUIRED = true
- CORE_PEER_TLS_CLIENTCERT_FILE = полный путь к клиентскому сертификату
- CORE_PEER_TLS_CLIENTKEY_FILE = полный путь к клиентскому приватному ключу
При использовании команд, подсоединяющихся к ордерер-службе, например peer channel
Если на ордерере также включена аутентификация клиентов, в дополнение к переменным выше необходимо установить следующие:
Отладка связанных с TLS проблем¶
Перед тем как начать отлаживать такие проблемы, советуется включить GRPC debug на обеих сторонах соединения для получения дополнительной информации. Для того, чтобы включить GRPC debug , установите переменную окружения FABRIC_LOGGING_SPEC так, чтобы она включала grpc=debug . Например, чтобы установить стандартный уровень логирования на INFO и уровень логирования gRPC на DEBUG , установите такую спецификацию логирования: grpc=debug:info .
Если вы видите сообщение об ошибке remote error: tls: bad certificate на стороне клиента, обычно это означает, что TLS-сервер включил аутентификацию клиента и сервер либо вообще не получил сертификата клиента, либо получил невалидный сертификат, которому он не доверяет. Проверьте, что клиент отправляет свой сертификат и что этот сертификат был подписан CA, которому доверяет пир или ордерер.
Если вы видите сообщение об ошибке remote error: tls: bad certificate в логах вашего чейнкода, проверьте, что чейнкод был собран с chaincode shim версии Fabric v1.1 или новее.
© Copyright Hyperledger 2020.
This work is licensed under a Creative Commons Attribution 4.0 International License Revision 33015615 .
Настройка TLS-соединений на сервере отчетов, работающем в собственном режиме
Основной режим служб Reporting Services использует для установки зашифрованных подключений к серверу отчетов службу HTTP SSL. Протокол TLS ранее назывался SSL. Если в локальном хранилище сертификатов на компьютере сервера отчетов установлен файл сертификата (.cer), можно привязать сертификат к резервированию URL-адреса служб отчетности, чтобы обеспечить поддержку соединений сервера отчетов по зашифрованному каналу.
Если используется режим интеграции служб Reporting Services с SharePoint, см. дополнительные сведения в документации по SharePoint. Например, руководство по включению TLS в веб-приложении SharePoint 2010.
Поскольку службы IIS также используют HTTP-службу SSL, возникает ряд важных проблем взаимодействия, которые необходимо учитывать при запуске служб IIS и служб Reporting Services на одном компьютере. Ознакомьтесь с разделом «Проблемы взаимодействия со службами IIS», где приводятся рекомендации по решению данных проблем.
Требования к сертификату сервера
Сертификат сервера должен быть установлен на компьютере (клиентские сертификаты не поддерживаются). Службы Reporting Services не содержат функций запроса, формирования, загрузки или установки сертификата. В Windows Server, начиная с версии 2012, доступна оснастка «Сертификаты», с помощью которой можно запрашивать сертификаты из доверенного центра сертификации.
Для тестовых целей можно сформировать локальный сертификат. Если используется программа MakeCert и пример команды в качестве шаблона, то перед выполнением команды задайте в качестве узла имя сервера и удалите все разрывы строки. Если команда выполняется в DOS-окне, то может понадобиться увеличить размер оконного буфера, чтобы в него вошла вся команда.
Если службы IIS и Reporting Services работают вместе на одном компьютере, для установки сертификата на компьютер можно использовать консольное приложение «Диспетчер IIS». Оно включает возможности создания и упаковки запроса файла сертификата (CRT) для последующей обработки надежным центром сертификации. Центр сертификации создаст файл сертификата (CER) и вышлет его обратно. Установку файла сертификата в локальное хранилище можно выполнить при помощи консоли управления службами IIS. Дополнительные сведения см. в разделе Использование SSL для шифрования конфиденциальных данных на веб-узле TechNet.
Проблемы взаимодействия со службами IIS
Присутствие на одном компьютере служб IIS и служб Reporting Services оказывает значительное влияние на TLS-соединения с сервером отчетов:
- Если установлены службы IIS, то должна быть постоянно запущена служба W3SVC. HTTP-служба SSL создает зависимость от служб IIS, если обнаружит, что они запущены. Это означает, что если службы IIS и Reporting Services установлены на одном компьютере и URL-адреса серверов отчетов настроены на TLS-соединения, то должна быть запущена служба W3SVC.
- Удаление службы IIS может временно нарушить работу службы по привязанному к TLS-соединению URL-адресу сервера отчетов. По этой причине рекомендуется перезапустить компьютер после удаления служб IIS. Перезагрузка компьютера необходима для очистки всех сеансов TLS из кэша. В некоторых операционных системах время кэширования TLS-сеансов составляет до 10 часов, в результате чего URL-адрес https:// продолжает работать даже после удаления привязки TLS из резервирования URL-адресов в компоненте HTTP.SYS. При перезагрузке компьютера все открытые подключения, использующие канал, закрываются.
Привязка TLS к резервированию URL-адресов служб Reporting Services
Следующие шаги не содержат инструкций для запроса формирования, загрузки или установки сертификата. Сертификат должен быть установлен и доступен для использования. Главное, что при этом требуется, — правильно задать свойства сертификата, получить его из центра сертификации и пользоваться средствами и программами для запроса и установки сертификата.
Привязку сертификата можно выполнить при помощи программы настройки служб Reporting Services. Если сертификат установлен в хранилище локального компьютера правильно, программа настройки служб Reporting Services обнаружит его и отобразит в списке Сертификаты SSL на страницах URL-адрес веб-службы и URL-адрес веб-портала.
Настройка URL-адреса сервера отчетов для TLS
- Запустите программу настройки служб Reporting Services и подключитесь к серверу отчетов.
- Щелкните URL-адрес веб-службы.
- Разверните список TLS/SSL-сертификатов. Reporting Services производят в локальном хранилище поиск сертификатов проверки подлинности сервера. Если сертификат установлен, но его нет в списке, то может понадобиться перезапустить службу. Это можно сделать с помощью кнопок Стоп и Пуск на странице Состояние сервера отчетов в программе настройки служб Reporting Services (верхняя страница).
- Выберите сертификат.
- Нажмите кнопку Применить.
- Щелкните URL-адрес, чтобы проверить работоспособность.
Для тестирования URL-адреса необходима настройка базы данных сервера отчетов. Если база данных сервера отчетов еще не создана, то это необходимо сделать до начала тестирования URL-адреса.
Резервирования URL-адресов для веб-портала и веб-служб сервера отчетов настраиваются независимо. Вы также можете настроить доступ к веб-порталу через канал с TLS-шифрованием, сделав следующее.
- Перейдите по URL-адресу веб-портала.
- Выберите Дополнительно.
- В разделе Несколько HTTPS-удостоверений для выбранного сейчас компонента Reporting Services выберите Добавить.
- Выберите сертификат, а затем щелкните ОК и Применить.
- Проверьте URL-адрес.
Хранение привязок к сертификату
Привязки к сертификату хранятся в файле HTTP.SYS. Представление определенных пользователем привязок также сохраняется в разделе URLReservations файла RSReportServer.config. Настройки в файле конфигурации являются только представлением фактических значений, указанных в другом месте. Изменять значения непосредственно в файле конфигурации нельзя. Параметры настройки появятся в файле только в результате использования программы настройки служб Reporting Services или поставщика инструментария управления Windows (WMI) для привязки сертификата.
Если настройка привязки выполняется при помощи TLS/SSL-сертификата в службах Reporting Services, а в дальнейшем потребуется удалить сертификат из компьютера, обеспечьте удаление привязки из служб Reporting Services перед удалением сертификата из компьютера. В противном случае будет невозможно удалить привязку при помощи программы настройки служб Reporting Services или WMI и появится уведомление об ошибке «Недопустимый параметр». Если сертификат уже удален из компьютера, можно использовать средство Httpcfg.exe для удаления привязки из компонента HTTP.SYS. Дополнительные сведения о Httpcfg.exe см. в документации по продукту Windows.
Привязки TLS являются общими ресурсами в Microsoft Windows. Изменения, проведенные в диспетчере конфигурации служб Reporting Services или других программах наподобие диспетчера IIS, могут отразиться на работе других приложений, работающих на этом же компьютере. Рекомендуется пользоваться для изменения привязок тем же средством, которое использовалось для их создания. Например, если привязки TLS создавались с помощью Configuration Manager, рекомендуется работать с ними в той же программе в течение всего срока их службы. Если же для создания привязок использовался диспетчер IIS, рекомендуется выполнять все дальнейшие операции с этими привязками с помощью диспетчера IIS. Если службы IIS установлены на компьютере до установки служб Reporting Services, рекомендуется проверить конфигурацию TLS в IIS перед настройкой служб Reporting Services.
Простая настройка взаимной проверки подлинности клиента и сервера с использованием TLS
Это руководство посвящено настройке защиты приложений с помощью TLS-аутентификации. При таком подходе возможность работы пользователей с приложением зависит от имеющихся у них сертификатов. То есть — разработчик может самостоятельно принимать решения о том, каким пользователям разрешено обращаться к приложению.

В учебном проекте, который будет здесь разобран, показаны основные настройки сервера и клиента. Их взаимодействие изначально осуществляется посредством HTTP. А это значит, что данные между ними передаются в незашифрованном виде. Наша задача заключается в том, чтобы обеспечить шифрование всего того, чем обмениваются клиент и сервер.
Мы рассмотрим следующие вопросы:
- Запуск сервера
- Отправка приветствия серверу (без шифрования)
- Включение HTTPS на сервере (односторонний TLS)
- Аутентификация клиента (двусторонний TLS)
- Установление двустороннего TLS-соединения с использованием доверенного удостоверяющего центра.
- Автоматизация различных подходов к аутентификации
- Идентификационные данные объекта: хранилище KeyStore, хранящее пару ключей — закрытый (private) и открытый (public).
- TrustStore: хранилище KeyStore, содержащее один или большее количество сертификатов (открытых ключей). Это хранилище содержит список доверенных сертификатов. Оно хранит данные о приложениях, которым доверяет наше приложение.
- Односторонняя аутентификация (односторонний TLS, односторонний SSL): HTTPS-соединение, при установке которого клиент проверяет сертификат противоположной стороны.
- Двусторонняя аутентификация (двусторонний TLS, двусторонний SSL, взаимная аутентификация): HTTPS-соединение, при установке которого клиент и противоположная сторона проверяют сертификаты друг друга.
- Работа с keytool
- Работа с openssl
- Настройка HTTP-клиентов
- Обзор свойств Spring-приложения
1. Запуск сервера
Для того чтобы организовать работу сервера — нам понадобится следующее:
- Java 11
- Maven 3.5.0
- Eclipse, Intellij IDEA (или любой другой текстовой редактор вроде VIM)
- Доступ к терминалу
- Копия этого проекта
В данном проекте содержится Maven-обёртка, поэтому запустить его можно и не устанавливая Maven. Тут будут приведены сведения и о стандартных командах, рассчитанных на mvn, и о командах, ориентированных на использование Maven-обёртки.
Если вы хотите запустить этот проект с использованием Java 8 — вы можете переключиться на более старую его версию с использованием нижеприведённой команды.
git checkout tags/java-8-compatible
При работе с этой версией проекта рекомендовано следовать инструкциям, подготовленным специально для него. Найти их можно здесь.
Сервер можно привести в рабочее состояние, вызвав метод main класса App или выполнив следующую команду в корневой директории проекта:
cd server/ && mvn spring-boot:run
Вот команда, рассчитанная на Maven-обёртку:
cd server-with-spring-boot/ && ./../mvnw spring-boot:run
2. Отправка приветствия серверу (без шифрования)
Сейчас сервер работает на порте, используемом по умолчанию (8080) без шифрования. С помощью следующей команды, задействующей curl , можно обратиться к конечной точке hello :
curl -i -XGET http://localhost:8080/api/hello
Ответ должен выглядеть примерно так:
HTTP/1.1 200 Content-Type: text/plain;charset=UTF-8 Content-Length: 5 Date: Sun, 11 Nov 2018 14:21:50 GMT Hello
Обратиться к серверу можно и с использованием клиента, код которого находится в директории client . Клиент зависит от других компонентов проекта. Поэтому, прежде чем его запускать, нужно выполнить в корневой директории проекта команду mvn install или ./mvnw install .
В клиенте реализован интеграционный тест, основанный на Cucumber. Его можно запустить, обратившись к классу ClientRunnerIT из IDE, или выполнив в корневой директории следующую команду:
cd client/ && mvn exec:java
При использовании Maven-обёртки это будет такая команда:
cd client/ && ./../mvnw exec:java
Тут имеется файл Hello.feature, который описывает шаги интеграционного теста. Этот файл можно найти в папке ресурсов теста клиентского проекта.
Есть и другой метод запуска и клиента, и сервера. Он представлен следующей командой, выполняемой в корневой директории проекта:
mvn clean verify
Вариант этой команды для Maven-обёртки выглядит так:
./mvnw clean verify
Клиент, по умолчанию, отправляет запросы к localhost , так как он рассчитан на то, что сервер выполняется на том же компьютере, что и он сам. Если сервер работает на другой машине — соответствующий URL можно передать клиенту при запуске, воспользовавшись следующим аргументом VM:
-Durl=http://[HOST]:[PORT]
3. Включение HTTPS на сервере (односторонний TLS)
Теперь давайте разберёмся с тем, как защитить сервер с помощью TLS. Сделать это можно, добавив соответствующие свойства в файл application.yml , хранящий настройки приложения.
Речь идёт о следующих настройках:
server: port: 8443 ssl: enabled: true
Возможно, тут у вас появится вопрос о причинах изменения номера порта сервера на 8443 . Дело в том, что tomcat-серверы, поддерживающие HTTPS, принято размещать на порте 8443. А серверы, поддерживающие HTTP — на порте 8080 . Поэтому при настройке подобного соединения можно использовать и порт 8080 , но поступать так не рекомендуется. Тут можно почитать подробности о том, какие номера портов используются в разных ситуациях.
Для того чтобы вышеописанные настройки вступили в силу — сервер надо перезапустить. Возможно, при этом вы увидите следующее исключение:
IllegalArgumentException: Resource location must not be null
Причина его появления заключается в том, что серверу, для установки защищённого соединения с внешними сущностями, нужно хранилище ключей с сертификатом сервера. Сервер может предоставить более подробную информацию об этом в том случае, если воспользоваться следующими аргументами VM:
-Djavax.net.debug=SSL,keymanager,trustmanager,ssl:handshake
Для того решения этой проблемы нужно создать хранилище ключей, содержащее открытый и закрытый ключи для сервера. Открытый ключ будет передаваться пользователям. Так они смогут зашифровать данные, передаваемые серверу. Зашифрованные данные могут быть расшифрованы с использованием закрытого ключа сервера. Закрытый ключ сервера нельзя никому передавать, так как, имея этот ключ, злоумышленник может перехватить зашифрованные данные, которыми обмениваются клиент и сервер, и расшифровать их.
Создать хранилище ключей с открытым и закрытым ключами можно с помощью следующей команды:
keytool -v -genkeypair -dname "CN=Hakan,OU=Amsterdam,O=Thunderberry,C=NL" -keystore shared-server-resources/src/main/resources/identity.jks -storepass secret -keypass secret -keyalg RSA -keysize 2048 -alias server -validity 3650 -deststoretype pkcs12 -ext KeyUsage=digitalSignature,dataEncipherment,keyEncipherment,keyAgreement -ext ExtendedKeyUsage=serverAuth,clientAuth -ext SubjectAlternativeName:c=DNS:localhost,IP:127.0.0.1
Теперь нужно сообщить серверу о том, где именно находится хранилище ключей, и указать пароли. Сделаем это, отредактировав наш файл application.yml :
server: port: 8443 ssl: enabled: true key-store: classpath:identity.jks key-password: secret key-store-password: secret
Замечательно! Только что мы настроили TLS-шифрование соединений между сервером и клиентом! Испытать сервер можно так:
curl -i --insecure -v -XGET https://localhost:8443/api/hello
Клиент можно запустить и прибегнув к классу ClientRunnerIT.
В результате можно будет увидеть следующее сообщение:
java.net.ConnectException: Connection refused (Connection refused)
Возникает такое ощущение, что клиент пытается поприветствовать сервер, а сервер ему найти не удаётся. Проблема заключается в том, что клиент пытается обратиться к серверу, работающему на порте 8080 , а сервер ждёт запросов на порте 8443 . Исправим это, внеся некоторые изменения в класс Constants . А именно — найдём эту строку:
private static final String DEFAULT_SERVER_URL = "http://localhost:8080";
И приведём её к такому виду:
private static final String DEFAULT_SERVER_URL = "https://localhost:8443";
Попробуем снова запустить клиент. Это приведёт к выдаче такого сообщения:
javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Дело тут в том, что клиент собирается наладить обмен данными по HTTPS. Он, при выполнении процедуры рукопожатия, получает сертификат сервера, который он пока не может распознать. А это значит, что нам ещё нужно создать хранилище TrustStore. В таких хранилищах находятся доверенные сертификаты. Клиент сопоставляет то, что он получает в ходе процедуры рукопожатия, с тем, что есть в TrustStore. Если полученный им сертификат входит в список доверенных сертификатов — процедура продолжается. А прежде чем создавать TrustStore — нужно обзавестись сертификатом сервера.
Экспортировать сертификат сервера можно такой командой:
keytool -v -exportcert -file shared-server-resources/src/main/resources/server.cer -alias server -keystore shared-server-resources/src/main/resources/identity.jks -storepass secret -rfc
Теперь можно создать TrustStore для клиента и импортировать туда сертификат сервера такой командой:
keytool -v -importcert -file shared-server-resources/src/main/resources/server.cer -alias server -keystore client/src/test/resources/truststore.jks -storepass secret -noprompt
TrustStore для клиента мы создали, но сам клиент пока об этом не знает. А это значит, что клиенту надо сообщить о том, что ему следует пользоваться TrustStore, указав адрес хранилища и пароль. Клиенту надо сообщить и о том, что включена аутентификация. Всё это делается путём приведения файла application.yml клиентского приложения к такому виду:
client: ssl: one-way-authentication-enabled: true two-way-authentication-enabled: false trust-store: truststore.jks trust-store-password: secret
4. Аутентификация клиента (двусторонний TLS)
Следующий шаг нашей работы заключается такой настройке сервера, чтобы он требовал бы аутентификации клиентов. Благодаря этим настройкам мы принудим клиентов идентифицировать себя. При таком подходе сервер тоже сможет проверить подлинность клиента, и то, входит ли он в число доверенных сущностей. Включить аутентификацию клиентов можно, воспользовавшись свойством client-auth , сообщив серверу о том, что ему нужно проверять клиентов.
Приведём файл сервера application.yml к такому виду:
server: port: 8443 ssl: enabled: true key-store: classpath:identity.jks key-password: secret key-store-password: secret client-auth: need
Если после этого запустить клиент, то он выдаст следующее сообщение об ошибке:
javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
Это указывает на то, что клиент не обладает подходящим сертификатом. Точнее — у клиента пока вообще нет сертификата. Поэтому создадим сертификат следующей командой:
keytool -v -genkeypair -dname "CN=Suleyman,OU=Altindag,O=Altindag,C=NL" -keystore client/src/test/resources/identity.jks -storepass secret -keypass secret -keyalg RSA -keysize 2048 -alias client -validity 3650 -deststoretype pkcs12 -ext KeyUsage=digitalSignature,dataEncipherment,keyEncipherment,keyAgreement -ext ExtendedKeyUsage=serverAuth,clientAuth
Нам ещё нужно создать TrustStore для сервера. Но, прежде чем создавать это хранилище, нужно иметь сертификат клиента. Экспортировать его можно так:
keytool -v -exportcert -file client/src/test/resources/client.cer -alias client -keystore client/src/test/resources/identity.jks -storepass secret -rfc
Теперь создадим TrustStore сервера, в котором будет сертификат клиента:
keytool -v -importcert -file client/src/test/resources/client.cer -alias client -keystore shared-server-resources/src/main/resources/truststore.jks -storepass secret -noprompt
Мы создали для клиента дополнительное хранилище ключей, но клиент об этом не знает. Сообщим ему сведения об этом хранилище. Кроме того, клиенту нужно сообщить о том, что включена двусторонняя аутентификация.
Приведём файл application.yml клиента к такому виду:
client: ssl: one-way-authentication-enabled: false two-way-authentication-enabled: true key-store: identity.jks key-password: secret key-store-password: secret trust-store: truststore.jks trust-store-password: secret
Сервер тоже не знает о только что созданном для него TrustStore. Приведём его файл application.yml к такому виду:
server: port: 8443 ssl: enabled: true key-store: classpath:identity.jks key-password: secret key-store-password: secret trust-store: classpath:truststore.jks trust-store-password: secret client-auth: need
Если снова запустить клиент — можно будет убедиться в том, что тест завершается успешно, и что клиент получает данные от сервера в защищённом виде.
Примите поздравления! Только что вы настроили двусторонний TLS!
5. Установление двустороннего TLS-соединения с использованием доверенного удостоверяющего центра
Есть и другой способ организации двусторонней аутентификации. Он основан на использовании доверенного удостоверяющего центра. У такого подхода есть сильные и слабые стороны.
- Клиентам не нужно добавлять в свои хранилища сертификат сервера.
- Серверу не нужно добавлять в своё хранилище все сертификаты клиентов.
- Меньше времени уходит на поддержку такой конфигурации, так как срок действия может истечь лишь у сертификата удостоверяющего центра.
- Разработчик теряет контроль над тем, каким приложениям разрешено обращаться к его приложению. Разрешение даётся любому приложению, у которого есть подписанный сертификат от удостоверяющего центра.
1. Создание удостоверяющего центра
Обычно работают с уже существующими удостоверяющими центрами, которым, для подписи, нужно передавать сертификаты. Здесь же мы создадим собственный удостоверяющий центр и подпишем с его помощью сертификаты клиента и сервера. Для создания удостоверяющего центра воспользуемся такой командой:
keytool -v -genkeypair -dname "CN=Root-CA,OU=Certificate Authority,O=Thunderberry,C=NL" -keystore root-ca/identity.jks -storepass secret -keypass secret -keyalg RSA -keysize 2048 -alias root-ca -validity 3650 -deststoretype pkcs12 -ext KeyUsage=digitalSignature,keyCertSign -ext BasicConstraints=ca:true,PathLen:3
Ещё можно воспользоваться существующим удостоверяющим центром.
2. Создание файла запроса на подпись сертификата
Для того чтобы подписать сертификат — нужен .csr-файл (Certificate Signing Request, файл запроса на подпись сертификата). Создать его можно с помощью особой команды.
Вот её вариант для сервера:
keytool -v -certreq -file shared-server-resources/src/main/resources/server.csr -keystore shared-server-resources/src/main/resources/identity.jks -alias server -keypass secret -storepass secret -keyalg rsa
Вот — эта команда для клиента:
keytool -v -certreq -file client/src/test/resources/client.csr -keystore client/src/test/resources/identity.jks -alias client -keypass secret -storepass secret -keyalg rsa
Такой файл нужен удостоверяющему центру для подписи сертификата. Следующий шаг нашей работы заключается в подписании сертификата.
3. Подписание сертификата с помощью запроса на подпись сертификата
Вот соответствующая команда для клиента:
keytool -v -gencert -infile client/src/test/resources/client.csr -outfile client/src/test/resources/client-signed.cer -keystore root-ca/identity.jks -storepass secret -alias root-ca -ext KeyUsage=digitalSignature,dataEncipherment,keyEncipherment,keyAgreement -ext ExtendedKeyUsage=serverAuth,clientAuth
Вот команда для сервера:
keytool -v -gencert -infile shared-server-resources/src/main/resources/server.csr -outfile shared-server-resources/src/main/resources/server-signed.cer -keystore root-ca/identity.jks -storepass secret -alias root-ca -ext KeyUsage=digitalSignature,dataEncipherment,keyEncipherment,keyAgreement -ext ExtendedKeyUsage=serverAuth,clientAuth -ext SubjectAlternativeName:c=DNS:localhost,IP:127.0.0.1
4. Замена неподписанного сертификата подписанным
В хранилище идентификационных данных сервера и клиента всё ещё хранится неподписанный сертификат. Сейчас можно заменить его на подписанный. У инструмента keytool есть одна не вполне понятная особенность. А именно — он не позволяет напрямую импортировать в хранилище подписанный сертификат. Если попытаться это сделать — будет выведено сообщение об ошибке. Сертификат, подписанный удостоверяющим центром, должен быть представлен в файле identity.jks .
Экспортируем подписанный сертификат:
keytool -v -exportcert -file root-ca/root-ca.pem -alias root-ca -keystore root-ca/identity.jks -storepass secret -rfc
Выполним на клиенте следующие команды:
keytool -v -importcert -file root-ca/root-ca.pem -alias root-ca -keystore client/src/test/resources/identity.jks -storepass secret -noprompt keytool -v -importcert -file client/src/test/resources/client-signed.cer -alias client -keystore client/src/test/resources/identity.jks -storepass secret keytool -v -delete -alias root-ca -keystore client/src/test/resources/identity.jks -storepass secret
На сервере выполним такие команды:
keytool -v -importcert -file root-ca/root-ca.pem -alias root-ca -keystore shared-server-resources/src/main/resources/identity.jks -storepass secret -noprompt keytool -v -importcert -file shared-server-resources/src/main/resources/server-signed.cer -alias server -keystore shared-server-resources/src/main/resources/identity.jks -storepass secret keytool -v -delete -alias root-ca -keystore shared-server-resources/src/main/resources/identity.jks -storepass secret
5. Организация взаимодействия клиента и сервера, основанного исключительно на доверии к удостоверяющему центру
Теперь нужно настроить клиент и сервер так, чтобы они доверяли бы только удостоверяющему центру. Сделать это можно, импортировав сертификат удостоверяющего центра в хранилища TrustStore клиента и сервера.
Сделаем это, выполнив на клиенте следующую команду:
keytool -v -importcert -file root-ca/root-ca.pem -alias root-ca -keystore client/src/test/resources/truststore.jks -storepass secret -noprompt
На сервере выполним такую команду:
keytool -v -importcert -file root-ca/root-ca.pem -alias root-ca -keystore shared-server-resources/src/main/resources/truststore.jks -storepass secret -noprompt
В хранилищах TrustStore всё ещё хранятся собственные сертификаты клиента и сервера. Эти сертификаты нужно удалить.
Выполним на клиенте такую команду:
keytool -v -delete -alias server -keystore client/src/test/resources/truststore.jks -storepass secret
Вот — команда для сервера:
keytool -v -delete -alias client -keystore shared-server-resources/src/main/resources/truststore.jks -storepass secret
Если снова запустить клиент — можно видеть успешное прохождение теста. А это значит, что клиент и сервер успешно обмениваются данными, используя сертификаты, подписанные удостоверяющим центром.
6. Автоматизация различных подходов к аутентификации
Всё, о чём мы говорили выше, можно автоматизировать с помощью скриптов, которые находятся в папке script рассматриваемого нами проекта. Для запуска скриптов можете воспользоваться следующими командами:
- ./configure-one-way-authentication — настройка односторонней аутентификации.
- ./configure-two-way-authentication-by-trusting-each-other my-company-name — настройка двусторонней аутентификации.
- ./configure-two-way-authentication-by-trusting-root-ca my-company-name — настройка двусторонней аутентификации с использованием удостоверяющего центра.
Протестированные клиенты
Ниже приведён список протестированных клиентов. Настройки для HTTP-клиента, написанного на чистом Java, можно найти в классе ClientConfig. В директории service нашего проекта содержатся отдельные HTTP-клиенты, выполняющие демонстрационные запросы. Настройки HTTP-клиентов, основанных на Kotlin и Scala, включены в состав проекта в виде вложенных классов. Все примеры клиентов используют одну и ту же базовую конфигурацию SSL, созданную в классе SSLConfig.
- Apache HttpClient → Настройки клиента | Пример запроса
- Apache HttpAsyncClient → Настройки клиента | Пример запроса
- Apache 5 HttpClient → Настройки клиента | Пример запроса
- Apache 5 HttpAsyncClient → Настройки клиента | Пример запроса
- JDK HttpClient → Настройки клиента | Пример запроса
- Old JDK HttpClient → Настройки клиента и пример запроса
- Netty Reactor → Настройки клиента | Пример запроса
- Jetty Reactive HttpClient → Настройки клиента | Пример запроса
- Spring RestTemplate → Настройки клиента | Пример запроса
- Spring WebFlux WebClient Netty → Настройки клиента | Пример запроса
- Spring WebFlux WebClient Jetty → Настройки клиента | Пример запроса
- OkHttp → Настройки клиента | Пример запроса
- Клиент Jersey → Настройки клиента | Пример запроса
- Старый клиент Jersey → Настройки клиента | Пример запроса
- Google HttpClient → Настройки клиента | Пример запроса
- Unirest → Настройки клиента | Пример запроса
- Retrofit → Настройки клиента | Пример запроса
- Асинхронный Http-клиент → Настройки клиента | Пример запроса
- Feign → Настройки клиента | Пример запроса
- Methanol → Настройки клиента | Пример запроса
- Vertx Webclient → Настройки клиента и пример запроса
- Fuel → Настройки клиента и пример запроса
- Http4k с Apache 4 → Настройки клиента | Пример запроса
- Http4k с Async Apache 4 → Настройки клиента | Пример запроса
- Http4k с Apache 5 → Настройки клиента | Пример запроса
- Http4k с Async Apache 5 → Настройки клиента | Пример запроса
- Http4k с Java Net → Настройки клиента | Пример запроса
- Http4k с Jetty → Настройки клиента | Пример запроса
- Http4k с OkHttp → Настройки клиента | Пример запроса
- Kohttp → Настройки клиента и пример запроса
- Ktor с движком Android → Настройки клиента | Пример запроса
- Ktor с движком Apache → Настройки клиента | Пример запроса
- Ktor c CIO-движком (I/O на основе корутин) → Настройки клиента | Пример запроса
- Ktor с движком Okhttp → Настройки клиента | Пример запроса
- Twitter Finagle → Настройки клиента | Пример запроса
- Twitter Finagle Featherbed → Настройки клиента и пример запроса
- HTTP-клиент Akka → Настройки клиента | Пример запроса
- Dispatch Reboot → Настройки клиента и пример запроса
- ScalaJ / Simplified Http Client → Настройки клиента и пример запроса
- Sttp → Настройки клиента и пример запроса
- Requests-Scala → Настройки клиента и пример запроса
- Клиент Http4s Blaze → Настройки клиента | Пример запроса
- Клиент Http4s Java Net → Настройки клиента | Пример запроса

Настройка режима шифрования SSL/TLS
При настройке режима шифрованной связи SSL/TLS можно изменять уровни безопасности.
Режим шифрованной связи
Используя режим шифрованной связи, вы можете задать шифрованую связь.
| Режим шифрованной связи | Описание |
|---|---|
| Только шифротекст | Разрешает только шифрованную связь. Если шифрование невозможно, соединение с аппаратом не устанавливается. |
| Приоритет шифротекста | Устанавливает шифрованное соединение, если шифрование возможно. Если шифрование невозможно, аппарат соединяется без шифрования. |
| Шиф./Незашифр.тек. | Устанавливает соединение с шифрованием или без него в соответствии с настройкой. |
После установки сертификата сервера укажите режим шифрования передачи SSL/TLS. При настройке этой установки вы можете изменить уровень безопасности.
Войдите в систему с панели управления в качестве администратора сети.
Нажмите [Параметры системы] .
Нажмите [Пар.инте.] .
Нажмите [След.] .
Нажмите [Разрешить соединение SSL/TLS] .
Выберите необходимый зашифрованный режим связи. Выберите [Только шифротекст] , [Приор.Шифр.текста] или [Шиф./Незашифр.тек.] в качестве режима связи.
Нажмите [OK] .
Выйдите из системы.
- Режим шифрованной связи SSL/TLS можно также указать с помощью Web Image Monitor. Для получения подробных сведений см. справку по Web Image Monitor.