Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Symptom
Сбой подтверждения TLS/SSL происходит, когда клиент и сервер не могут установить связь с помощью протокола TLS/SSL. Когда эта ошибка возникает в Apigee Edge, клиентское приложение получает статус HTTP 503 с сообщением Сервис недоступен. Эта ошибка возникает при любом вызове API, в котором происходит сбой подтверждения TLS/SSL.
Сообщения об ошибках
HTTP/1.1 503 Service Unavailable
Это сообщение об ошибке также может появиться при сбое рукопожатия TLS/SSL:
Received fatal alert: handshake_failure
Возможные причины
TLS (безопасность транспортного уровня, предшественником которого является SSL) – это стандартная технология безопасности для установления зашифрованного соединения между веб-сервером и веб-клиентом, например браузером или приложением. Рукопожатие – это процесс, который позволяет клиенту и серверу TLS/SSL установить набор секретных ключей, с помощью которых они могут обмениваться данными. В процессе обмена данными клиент и сервер:
- Согласуйте версию протокола.
- Выберите криптографический алгоритм.
- Выполнять аутентификацию друг друга, обмениваясь цифровыми сертификатами и проверяя их.
Если подтверждение TLS/SSL прошло успешно, клиент и сервер TLS/SSL безопасно передают друг другу данные. В противном случае при сбое рукопожатия TLS/SSL соединение будет разорвано, а клиент получит ошибку 503 Service Unavailable.
Возможные причины сбоя рукопожатия TLS/SSL:
| Cause | Описание | Кто может выполнять инструкции по устранению неполадок |
|---|---|---|
| Несоответствие протокола | Протокол, используемый клиентом, не поддерживается сервером. | Пользователи частных и общедоступных облаков |
| Несоответствие набора шифров | Набор шифров, используемый клиентом, не поддерживается сервером. | Пользователи частных и общедоступных облаков |
| Неверный сертификат | Имя хоста в URL, используемом клиентом, не совпадает с именем хоста в сертификате, хранящемся на сервере. | Пользователи частных и общедоступных облаков |
| На стороне клиента или сервера хранится неполная или недействительная цепочка сертификатов. | Пользователи частных и общедоступных облаков | |
| Клиент отправляет на сервер или сервер отправляет клиенту неверный или просроченный сертификат. | Пользователи частных и общедоступных облаков | |
| Сервер с поддержкой SNI | На внутреннем сервере включена функция SNI (указание имени сервера), но клиент не может взаимодействовать с серверами SNI. | Только для пользователей частного облака |
Несоответствие протокола
Сбой подтверждения TLS/SSL происходит, если протокол, используемый клиентом, не поддерживается сервером во входящем (северном) или исходящем (южном) подключении. Также ознакомьтесь со статьей О входящих и исходящих подключениях.
диагностика;
- Определите, где произошла ошибка: в северном или южном соединении. Дополнительную информацию о том, как определить источник проблемы, можно найти в разделе Как определить источник проблемы.
- Чтобы получить дополнительную информацию, запустите утилиту
tcpdump:
- Если вы используете частное облако, то можете собирать данные
tcpdumpна нужном клиенте или сервере. Клиентом может быть клиентское приложение (для входящих или северных подключений) или обработчик сообщений (для исходящих или южных подключений). Сервер может быть пограничным маршрутизатором (для входящих или северных подключений) или внутренним сервером (для исходящих или южных подключений) в зависимости от того, что вы определили на шаге 1. - Если вы используете общедоступное облако, то можете собирать данные
tcpdumpтолько в клиентском приложении (для входящих или северных подключений) или на бэкенд-сервере (для исходящих или южных подключений), поскольку у вас нет доступа к пограничному маршрутизатору или Message Processor.
Подробнее о том, как использовать командуtcpdump -i any -s 0 host IP address -w File name
tcpdump, можно узнать из данных tcpdump. - Если вы используете частное облако, то можете собирать данные
- Проанализируйте данные
tcpdumpс помощью Wireshark или другого похожего инструмента. - Ниже приведен пример анализа
tcpdump с помощью Wireshark:
- В этом примере ошибка рукопожатия TLS/SSL произошла между Message Processor и бэкенд-сервером (исходящее или южное подключение).
- Сообщение № 4 в приведенном ниже выводе
tcpdumpпоказывает, что Message Processor (источник) отправил сообщение "Client Hello" на бэкенд-сервер (назначение).

Если вы выберете сообщение
Client Hello, то увидите, что Message Processor использует протокол TLSv1.2, как показано ниже:
- В сообщении № 5 показано, что бэкенд-сервер подтверждает получение сообщения "Client Hello" от Message Processor.
- Внутренний сервер немедленно отправляет Fatal Alert : Close Notify обработчику сообщений (сообщение № 6). Это означает, что рукопожатие TLS/SSL не выполнено и подключение будет закрыто.
Если посмотреть на сообщение № 6, можно увидеть, что причина сбоя при подключении TLS/SSL заключается в том, что серверная часть поддерживает только протокол TLSv1.0, как показано ниже:

- Из-за несоответствия между протоколом, используемым Message Processor, и бэкенд-сервером, бэкенд-сервер отправил сообщение Fatal Alert Message: Close Notify.
Разрешение
Message Processor работает на Java 8 и по умолчанию использует протокол TLSv1.2. Если сервер не поддерживает протокол TLSv1.2, вы можете устранить проблему одним из следующих способов:
- Обновите серверную часть, чтобы она поддерживала протокол TLSv1.2. Это рекомендуемое решение, поскольку протокол TLSv1.2 более безопасен.
- Если вы не можете обновить внутренний сервер прямо сейчас, вы можете заставить процессор сообщений использовать протокол TLSv1.0 для связи с внутренним сервером, выполнив следующие действия:
- Если вы не указали целевой сервер в определении TargetEndpoint прокси, задайте для элемента
ProtocolзначениеTLSv1.0, как показано ниже:<TargetEndpoint name="default"> … <HTTPTargetConnection> <SSLInfo> <Enabled>true</Enabled> <Protocols> <Protocol>TLSv1.0</Protocol> </Protocols> </SSLInfo> <URL>https://myservice.com</URL> </HTTPTargetConnection> … </TargetEndpoint> - Если вы настроили целевой сервер для прокси, используйте этот API управления, чтобы задать протокол TLSv1.0 в конфигурации целевого сервера.
- Если вы не указали целевой сервер в определении TargetEndpoint прокси, задайте для элемента
Несоответствие шифров
Сбой рукопожатия TLS/SSL может произойти, если алгоритм набора шифров, используемый клиентом, не поддерживается сервером во входящем (северном) или исходящем (южном) подключении в Apigee Edge. Также ознакомьтесь со статьей О входящих и исходящих подключениях.
диагностика;
- Определите, где произошла ошибка: в северном или южном подключении. Дополнительную информацию можно найти в разделе Как определить источник проблемы.
- Чтобы получить дополнительную информацию, запустите утилиту
tcpdump:
- Если вы используете частное облако, то можете собирать данные
tcpdumpна нужном клиенте или сервере. Клиентом может быть клиентское приложение (для входящих или северных подключений) или обработчик сообщений (для исходящих или южных подключений). Сервер может быть пограничным маршрутизатором (для входящих или северных подключений) или внутренним сервером (для исходящих или южных подключений) в зависимости от того, что вы определили на шаге 1. - Если вы используете общедоступное облако, то можете собирать данные
tcpdumpтолько в клиентском приложении (для входящих или северных подключений) или на бэкенд-сервере (для исходящих или южных подключений), поскольку у вас нет доступа к пограничному маршрутизатору или Message Processor.
Подробнее о том, как использовать командуtcpdump -i any -s 0 host IP address -w File name
tcpdump, можно узнать из данных tcpdump. - Если вы используете частное облако, то можете собирать данные
- Проанализируйте
tcpdumpданные с помощью инструмента Wireshark или любого другого инструмента, с которым вы знакомы. - Ниже приведен пример анализа выходных данных
tcpdumpс помощью Wireshark:- В этом примере сбой рукопожатия TLS/SSL произошел между клиентским приложением и пограничным маршрутизатором (северное подключение). Выходные данные
tcpdumpбыли собраны на пограничном маршрутизаторе. Сообщение № 4 в приведенном ниже выводе
tcpdumpпоказывает, что клиентское приложение (источник) отправило сообщение "Client Hello" маршрутизатору Edge (назначение).
Если выбрать сообщение Client Hello, вы увидите, что клиентское приложение использует протокол TLSv1.2.

- В сообщении № 5 показано, что пограничный маршрутизатор подтверждает получение сообщения "Client Hello" от клиентского приложения.
- Пограничный маршрутизатор немедленно отправляет клиентскому приложению критическое оповещение : сбой рукопожатия (сообщение № 6). Это означает, что рукопожатие TLS/SSL не выполнено и подключение будет закрыто.
- Если посмотреть подробную информацию о сообщении № 6, можно увидеть следующее:
- Пограничный маршрутизатор поддерживает протокол TLSv1.2. Это означает, что протокол соответствует между клиентским приложением и пограничным маршрутизатором.
Однако маршрутизатор Edge по-прежнему отправляет клиентскому приложению критическое оповещение: ошибка подтверждения, как показано на скриншоте ниже.

- Ошибка может быть вызвана одной из следующих проблем:
- Клиентское приложение не использует алгоритмы набора шифров, поддерживаемые маршрутизатором Edge.
- Пограничный маршрутизатор поддерживает SNI, но клиентское приложение не отправляет имя сервера.
- В сообщении № 4 в выходных данных
tcpdumpперечислены алгоритмы набора шифров, поддерживаемые клиентским приложением, как показано ниже:
- Список алгоритмов набора шифров, поддерживаемых маршрутизатором Edge, приведен в файле
/opt/nginx/conf.d/0-default.conf. В этом примере маршрутизатор Edge поддерживает только алгоритмы набора шифров с высоким уровнем шифрования. - Клиентское приложение не использует ни один из алгоритмов набора шифров High Encryption. Это несоответствие является причиной сбоя рукопожатия TLS/SSL.
- Поскольку маршрутизатор Edge поддерживает SNI, прокрутите вывод
tcpdumpдо сообщения № 4 и убедитесь, что клиентское приложение правильно отправляет имя сервера, как показано на рисунке ниже:

- Если имя действительно, можно сделать вывод, что ошибка рукопожатия TLS/SSL произошла из-за того, что алгоритмы набора шифров, используемые клиентским приложением, не поддерживаются маршрутизатором Edge.
- В этом примере сбой рукопожатия TLS/SSL произошел между клиентским приложением и пограничным маршрутизатором (северное подключение). Выходные данные
Разрешение
Убедитесь, что клиент использует алгоритмы набора шифров, которые поддерживаются сервером. Чтобы устранить проблему, описанную в предыдущем разделе "Диагностика", скачайте и установите пакет Java Cryptography Extension (JCE) и добавьте его в установку Java для поддержки алгоритмов набора шифров High Encryption.
Неверный сертификат
Сбой рукопожатия TLS/SSL происходит, если в хранилище ключей или доверенном хранилище есть неправильные сертификаты, либо во входящем (северном), либо в исходящем (южном) подключении в Apigee Edge. Также ознакомьтесь со статьей О входящих и исходящих подключениях.
Если проблема на стороне клиента, вы можете увидеть разные сообщения об ошибках в зависимости от причины.
В следующих разделах приведены примеры сообщений об ошибках и инструкции по диагностике и устранению этой проблемы.
Сообщения об ошибках
В зависимости от причины сбоя рукопожатия TLS/SSL вы можете увидеть разные сообщения об ошибках. Ниже приведен пример сообщения об ошибке, которое может появиться при вызове прокси-сервера API:
* SSL certificate problem: Invalid certificate chain * Closing connection 0 curl: (60) SSL certificate problem: Invalid certificate chain More details here: http://curl.haxx.se/docs/sslcerts.html
Возможные причины
Обычно это происходит по следующим причинам:
| Cause | Описание | Кто может выполнять инструкции по устранению неполадок |
| Несоответствие имени хоста |
Имя хоста, используемое в URL, не совпадает с сертификатом в хранилище ключей маршрутизатора. Например, несоответствие возникает, если имя хоста, используемое в URL, – myorg.domain.com, а в сертификате в качестве общего имени указано CN=something.domain.com..
|
Пользователи частного и общедоступного облака Edge |
| Неполная или неправильная цепочка сертификатов | Цепочка сертификатов неполная или неверная. | Только для пользователей частного и общедоступного облака Edge |
| Сервер или клиент отправил сертификат с истекшим сроком действия или неизвестный сертификат | Сервер или клиент отправляет просроченный или неизвестный сертификат через северное или южное подключение. | Пользователи Edge Private Cloud и Edge Public Cloud |
Несовпадение имени хоста
диагностика;
- Запишите имя хоста, используемое в URL, который возвращается при следующем вызове API управления Edge:
Пример:curl -v https://myorg.domain.com/v1/getinfo
curl -v https://api.enterprise.apigee.com/v1/getinfo
- Получите CN, используемый в сертификате, который хранится в определенном хранилище ключей. Чтобы получить информацию о сертификате, можно использовать следующие API управления Edge:
-
Получите название сертификата в хранилище ключей:
Если вы используете Private Cloud, воспользуйтесь Management API следующим образом:
Если вы используете общедоступное облако, используйте Management API следующим образом:curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
curl -v https://api.enterprise.apigee.com/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
-
Получите сведения о сертификате в хранилище ключей с помощью Management API Edge.
Если вы используете частное облако:
Если вы пользователь общедоступного облака:curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
curl -v https://api.enterprise.apigee.com/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
Пример сертификата::
"certInfo": [ { "basicConstraints": "CA:FALSE", "expiryDate": 1456258950000, "isValid": "No", "issuer": "SERIALNUMBER=07969287, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O=\"GoDaddy.com, Inc.\", L=Scottsdale, ST=Arizona, C=US", "publicKey": "RSA Public Key, 2048 bits", "serialNumber": "07:bc:a7:39:03:f1:56", "sigAlgName": "SHA1withRSA", "subject": "CN=something.domain.com, OU=Domain Control Validated, O=something.domain.com", "validFrom": 1358287055000, "version": 3 },
В названии субъекта основного сертификата в качестве общего имени указано значение
something.domain.com..Поскольку имя хоста, используемое в URL запроса к API (см. шаг 1 выше), и имя субъекта в сертификате не совпадают, происходит сбой рукопожатия TLS/SSL.
-
Получите название сертификата в хранилище ключей:
Разрешение
Эту проблему можно устранить двумя способами:
- Получите сертификат (если у вас его ещё нет), в котором в поле CN субъекта есть подстановочный знак, а затем загрузите новую полную цепочку сертификатов в хранилище ключей. Пример:
"subject": "CN=*.domain.com, OU=Domain Control Validated, O=*.domain.com",
- Получите сертификат (если у вас его ещё нет) с существующим именем субъекта, но используйте your-org.your-domain в качестве альтернативного имени субъекта, а затем загрузите полную цепочку сертификатов в хранилище ключей.
Ссылки
Хранилища ключей и доверенных сертификатов
Неполная или неверная цепочка сертификатов
диагностика;
- Получите CN, используемый в сертификате, который хранится в определенном хранилище ключей. Чтобы получить информацию о сертификате, можно использовать следующие API управления Edge:
-
Получите название сертификата в хранилище ключей:
Если вы пользователь частного облака:
Если вы пользователь общедоступного облака:curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
curl -v https://api.enterprise.apigee.com/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
-
Получите информацию о сертификате в хранилище ключей:
Если вы используете частное облако:
Если вы пользователь общедоступного облака:curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
curl -v https://api.enterprise.apigee.com/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
- Проверьте сертификат и его цепочку и убедитесь, что они соответствуют требованиям, указанным в статье Как работают цепочки сертификатов. Если цепочка сертификатов, хранящаяся в хранилище ключей, неполная или недействительная, то вы увидите ошибку рукопожатия TLS/SSL.
- На изображении ниже показан пример сертификата с недействительной цепочкой сертификатов, в которой промежуточный и корневой сертификаты не совпадают.
Пример промежуточного и корневого сертификатов, в которых издатель и субъект не совпадают

-
Получите название сертификата в хранилище ключей:
Разрешение
- Получите сертификат (если у вас его ещё нет), который включает полную и действительную цепочку сертификатов.
- Выполните следующую команду openssl, чтобы проверить, правильно ли настроена цепочка сертификатов и является ли она полной:
openssl verify -CAfile root-cert -untrusted intermediate-cert main-cert
- Загрузите проверенную цепочку сертификатов в хранилище ключей.
Сервер или клиент отправил сертификат с истекшим сроком действия или неизвестный сертификат
Если сервер или клиент отправляет неправильный или просроченный сертификат при подключении к северному или южному интерфейсу, другая сторона (сервер или клиент) отклоняет сертификат, что приводит к сбою подтверждения TLS/SSL.
диагностика;
- Определите, где произошла ошибка: в северном или южном соединении. Дополнительную информацию о том, как определить источник проблемы, можно найти в разделе Как определить источник проблемы.
- Чтобы получить дополнительную информацию, запустите утилиту
tcpdump:
- Если вы используете частное облако, то можете собирать данные
tcpdumpна нужном клиенте или сервере. Клиентом может быть клиентское приложение (для входящих или северных подключений) или обработчик сообщений (для исходящих или южных подключений). Сервер может быть пограничным маршрутизатором (для входящих или северных подключений) или внутренним сервером (для исходящих или южных подключений) в зависимости от того, что вы определили на шаге 1. - Если вы используете общедоступное облако, то можете собирать данные
tcpdumpтолько в клиентском приложении (для входящих или северных подключений) или на бэкенд-сервере (для исходящих или южных подключений), поскольку у вас нет доступа к пограничному маршрутизатору или Message Processor.
Подробнее о том, как использовать командуtcpdump -i any -s 0 host IP address -w File name
tcpdump, можно узнать из данных tcpdump. - Если вы используете частное облако, то можете собирать данные
- Проанализируйте данные
tcpdumpс помощью Wireshark или аналогичного инструмента. - По результатам команды
tcpdumpопределите хост (клиент или сервер), который отклоняет сертификат на этапе проверки. - Вы можете получить сертификат, отправленный с другой стороны, из выходных данных
tcpdump, если данные не зашифрованы. Это поможет сравнить сертификат с сертификатом, доступным в хранилище доверенных сертификатов. - Ознакомьтесь с примером
tcpdumpдля SSL-соединения между Message Processor и внутренним сервером.Пример
tcpdumpс ошибкой "Неизвестный сертификат"
- Message Processor (клиент) отправляет бэкенд-серверу (сервер) "Client Hello" в сообщении № 59.
- Сервер отправляет сообщение "Server Hello" обработчику сообщений в сообщении 61.
- Они взаимно проверяют используемые алгоритмы протокола и набора шифров.
- Бэкенд-сервер отправляет сертификат и сообщение Server Hello Done в Message Processor в сообщении № 68.
- Message Processor отправляет критическое оповещение "Описание: сертификат Неизвестно" в сообщении № 70.
- Если посмотреть на сообщение № 70, то кроме предупреждения, показанного ниже, никаких дополнительных сведений нет:

- Проверьте сообщение № 68, чтобы получить информацию о сертификате, отправленном серверной частью, как показано на следующем изображении:

- Сертификат внутреннего сервера и вся его цепочка доступны в разделе "Сертификаты", как показано на рисунке выше.
- Если сертификат неизвестен маршрутизатору (северное направление) или Message Processor (южное направление), как показано на примере выше, выполните следующие действия:
- Получите сертификат и его цепочку, хранящиеся в определенном хранилище доверенных сертификатов. (См. конфигурацию виртуального хоста для маршрутизатора и конфигурацию целевой конечной точки для процессора сообщений.) Чтобы получить информацию о сертификате, можно использовать следующие API:
-
Получите название сертификата в хранилище доверенных сертификатов:
curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/truststore-name/certs
-
Как получить информацию о сертификате в хранилище доверенных сертификатов
curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/truststore-name/certs/cert-name
-
Получите название сертификата в хранилище доверенных сертификатов:
- Проверьте, совпадает ли сертификат, хранящийся в доверенном хранилище маршрутизатора (северное направление) или процессора сообщений (южное направление), с сертификатом, хранящимся в хранилище ключей клиентского приложения (северное направление) или целевого сервера (южное направление), или с сертификатом, полученным из выходных данных команды
tcpdump. Если они не совпадают, это и является причиной сбоя рукопожатия TLS/SSL.
- Получите сертификат и его цепочку, хранящиеся в определенном хранилище доверенных сертификатов. (См. конфигурацию виртуального хоста для маршрутизатора и конфигурацию целевой конечной точки для процессора сообщений.) Чтобы получить информацию о сертификате, можно использовать следующие API:
- Если клиентское приложение (на северном направлении) или целевой сервер (на южном направлении) не распознает сертификат, выполните следующие действия:
- Получите полную цепочку сертификатов, используемую в сертификате, хранящемся в определенном хранилище ключей. (См. конфигурацию виртуального хоста для маршрутизатора и конфигурацию целевой конечной точки для Message Processor.) Чтобы получить информацию о сертификате, можно использовать следующие API:
-
Получите название сертификата в хранилище ключей:
curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs
-
Чтобы получить информацию о сертификате в хранилище ключей:
curl -v https://management-server-ip:port/v1/organizations/org-name/environments/env-name/keystores/keystore-name/certs/cert-name
-
Получите название сертификата в хранилище ключей:
- Проверьте, соответствует ли сертификат, хранящийся в хранилище ключей маршрутизатора (северное направление) или Message Processor (южное направление), сертификату, хранящемуся в доверенном хранилище клиентского приложения (северное направление) или целевого сервера (южное направление), или сертификату, полученному из выходных данных
tcpdump. Если они не совпадают, то это и является причиной сбоя рукопожатия SSL.
- Получите полную цепочку сертификатов, используемую в сертификате, хранящемся в определенном хранилище ключей. (См. конфигурацию виртуального хоста для маршрутизатора и конфигурацию целевой конечной точки для Message Processor.) Чтобы получить информацию о сертификате, можно использовать следующие API:
- Если срок действия сертификата, отправленного сервером или клиентом, истек, принимающий клиент или сервер отклонит сертификат и вы увидите следующее сообщение об ошибке в
tcpdump:Предупреждение (уровень: критический, описание: срок действия сертификата истек)
- Убедитесь, что срок действия сертификата в хранилище ключей нужного хоста истек.
Разрешение
Чтобы устранить проблему, описанную в примере выше, загрузите действительный сертификат внутреннего сервера в хранилище доверенных сертификатов на процессоре сообщений.
В таблице ниже приведены инструкции по устранению проблемы в зависимости от ее причины.
| Cause | Описание | Разрешение |
| Срок действия сертификата истек |
NorthBound
|
Загрузите новый сертификат и всю цепочку сертификатов в хранилище ключей на нужном хосте. |
SouthBound
|
Загрузите новый сертификат и всю цепочку сертификатов в хранилище ключей на нужном хосте. | |
| Неизвестный сертификат |
NorthBound
|
Загрузите действительный сертификат в хранилище доверенных сертификатов на нужном хосте. |
SouthBound
|
Загрузите действительный сертификат в хранилище доверенных сертификатов на нужном хосте. |
Сервер с поддержкой SNI
Сбой подтверждения TLS/SSL может произойти, когда клиент взаимодействует с сервером, на котором включена функция SNI (указание имени сервера), но сам клиент не поддерживает SNI. Это может произойти при подключении к северному или южному интерфейсу в Edge.
Сначала вам нужно определить имя хоста и номер порта используемого сервера и проверить, включена ли на нем функция SNI.
Идентификация сервера с поддержкой SNI
- Выполните команду
opensslи попробуйте подключиться к нужному имени хоста сервера (маршрутизатору Edge или внутреннему серверу) без передачи имени сервера, как показано ниже: Вы можете получить сертификаты, но иногда при выполнении команды openssl может произойти сбой подтверждения, как показано ниже:openssl s_client -connect hostname:port
CONNECTED(00000003) 9362:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-64.50.6/src/ssl/s23_clnt.c:593
- Выполните команду
opensslи попробуйте подключиться к нужному имени хоста сервера (пограничному маршрутизатору или серверу внутренней сети), передав имя сервера, как показано ниже:openssl s_client -connect hostname:port -servername hostname
- Если на шаге 1 произойдет сбой подтверждения или сертификаты на шагах 1 и 2 будут разными, это означает, что на указанном сервере включена функция SNI.
Если вы определили, что на сервере включена функция SNI, выполните следующие действия, чтобы проверить, не связана ли ошибка рукопожатия TLS/SSL с тем, что клиент не может подключиться к серверу SNI.
диагностика;
- Определите, где произошла ошибка: в северном или южном соединении. Дополнительную информацию о том, как определить источник проблемы, можно найти в разделе Как определить источник проблемы.
- Чтобы получить дополнительную информацию, запустите утилиту
tcpdump:
- Если вы используете частное облако, то можете собирать данные
tcpdumpна нужном клиенте или сервере. Клиентом может быть клиентское приложение (для входящих или северных подключений) или обработчик сообщений (для исходящих или южных подключений). Сервер может быть пограничным маршрутизатором (для входящих или северных подключений) или внутренним сервером (для исходящих или южных подключений) в зависимости от того, что вы определили на шаге 1. - Если вы используете общедоступное облако, то можете собирать данные
tcpdumpтолько в клиентском приложении (для входящих или северных подключений) или на бэкенд-сервере (для исходящих или южных подключений), поскольку у вас нет доступа к пограничному маршрутизатору или Message Processor.
Подробнее о том, как использовать командуtcpdump -i any -s 0 host IP address -w File name
tcpdump, можно узнать из данных tcpdump. - Если вы используете частное облако, то можете собирать данные
- Проанализируйте выходные данные
tcpdumpс помощью Wireshark или похожего инструмента. - Ниже приведен пример анализа
tcpdumpс помощью Wireshark:- В этом примере сбой подтверждения TLS/SSL произошел между процессором сообщений Edge и внутренним сервером (исходящее подключение).
- Сообщение № 4 в приведенном ниже выводе
tcpdumpпоказывает, что Message Processor (источник) отправил сообщение "Client Hello" на бэкенд-сервер (назначение).
- Если выбрать сообщение "Клиентское приветствие", можно увидеть, что обработчик сообщений использует протокол TLSv1.2.

- В сообщении № 4 показано, что бэкенд-сервер подтверждает сообщение "Client Hello" от Message Processor.
- Внутренний сервер немедленно отправляет критическое оповещение : ошибка подтверждения обработчику сообщений Message Processor (сообщение № 5). Это означает, что рукопожатие TLS/SSL не удалось и подключение будет закрыто.
- Изучите сообщение № 6, чтобы узнать следующую информацию:
- Сервер поддерживает протокол TLSv1.2. Это означает, что протокол, согласованный между Message Processor и бэкенд-сервером, совпадает.
- Однако сервер по-прежнему отправляет обработчику сообщений Fatal Alert: Handshake
Failure, как показано на рисунке ниже.

- Эта ошибка может возникнуть по одной из следующих причин:
- Message Processor не использует алгоритмы набора шифров, поддерживаемые бэкенд-сервером.
- На внутреннем сервере включена функция SNI, но клиентское приложение не отправляет имя сервера.
- Подробнее изучите сообщение № 3 (Client Hello) в выходных данных
tcpdump. Обратите внимание, что Extension: server_name отсутствует, как показано ниже:
- Это подтверждает, что Message Processor не отправил server_name на бэкенд-сервер с поддержкой SNI.
- Это приводит к сбою подтверждения TLS/SSL и тому, что сервер отправляет обработчику сообщений критическое оповещение: сбой подтверждения.
- Убедитесь, что для параметра
jsse.enableSNIExtension propertyв файлеsystem.propertiesзадано значение false в Message Processor, чтобы подтвердить, что Message Processor не может взаимодействовать с сервером с поддержкой SNI.
Разрешение
Чтобы разрешить Message Processor взаимодействовать с серверами, поддерживающими SNI, выполните следующие действия:
- Создайте файл
/opt/apigee/customer/application/message-processor.properties, если он ещё не существует. - Добавьте в этот файл следующую строку:
conf_system_jsse.enableSNIExtension=true - Измените владельца файла на
apigee:apigee:chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- Перезапустите Message Processor.
/opt/apigee/apigee-service/bin/apigee-service message-processor restart
- Если у вас несколько обработчиков сообщений, повторите шаги 1–4 для каждого из них.
Если вы не можете определить причину сбоя рукопожатия TLS/SSL и устранить проблему или вам нужна дополнительная помощь, обратитесь в службу поддержки Apigee Edge. Поделитесь подробной информацией о проблеме и tcpdump.