Установление безопасного соединения с 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 <create|update|fetch> или or peer chaincode <invoke>, следующие аргументы командной строки должны быть указаны, если на ордерере включен TLS:

  • –tls

Если на ордерере также включена аутентификация клиентов, в дополнение к переменным выше необходимо установить следующие:

  • –clientauth

Отладка связанных с 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 или новее.