Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Симптом
Клиентское приложение получает ответ HTTP 400 — Bad request с сообщением « Ошибка SSL-сертификата ». Эта ошибка обычно отправляется пограничным маршрутизатором в рамках двусторонней TLS-связи, включенной для входящего соединения с Apigee Edge.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 400 Bad Request
Далее следует HTML-страница с ошибкой:
<html>
<head>
<title>400 The SSL certificate error</title>
</head>
<body bgcolor="white">
<center> <h1>400 Bad Request</h1>
</center>
<center>The SSL certificate error</center>
<hr>
<center>nginx</center>
</body>
</html>Возможные причины
Возможные причины этой проблемы следующие:
| Причина | Описание | Инструкции по устранению неполадок, применимые для |
| Истек срок действия клиентского сертификата | Сертификат, отправленный клиентом, устарел. | Пользователи частных и публичных облачных решений на периферии сети |
| Клиент отправил некорректный сертификат. | Эта ошибка возникает, если сертификат, отправленный клиентским приложением, не совпадает с сертификатом, хранящимся в хранилище доверенных сертификатов маршрутизатора Edge. | Пользователи частных и публичных облачных решений на периферии сети |
| Отсутствует корневой сертификат клиента в хранилище доверенных сертификатов. | Эта ошибка возникает, если в хранилище доверенных сертификатов маршрутизатора Edge отсутствует корневой сертификат клиента, подписанный центром сертификации. | Пользователи частных и публичных облачных решений на периферии сети |
| Клиентские сертификаты не загружены в пограничный маршрутизатор. | Эта ошибка возникает, если клиентские сертификаты, загруженные в хранилище доверенных сертификатов, не загружены на маршрутизатор. | Пользователи Edge Private Cloud |
Причина: истек срок действия клиентского сертификата.
Эта проблема обычно возникает при использовании двухстороннего TLS-соединения , когда срок действия сертификата, отправленного клиентом, истек. В двухстороннем TLS-соединении клиент и сервер обмениваются своими открытыми сертификатами для выполнения рукопожатия. Клиент проверяет сертификат сервера, а сервер проверяет сертификат клиента.
В Edge двусторонняя TLS-протоколизация реализуется на виртуальном хосте , где сертификат сервера добавляется в хранилище ключей, а сертификат клиента — в хранилище доверенных сертификатов.
Если в процессе установления TLS-соединения будет обнаружено, что срок действия клиентского сертификата истек, сервер отправит код ошибки 400 — Bad request с сообщением « Ошибка SSL-сертификата ».
Диагноз
Войдите в пользовательский интерфейс Edge и просмотрите конфигурацию конкретного виртуального хоста ( Администрирование > Виртуальные хосты ), для которого выполняется запрос к API, или используйте API управления виртуальными хостами, чтобы получить определение конкретного виртуального хоста.
Как правило, виртуальный хост для двусторонней TLS-связи выглядит следующим образом:
<VirtualHost name="myTLSVHost"> <HostAliases> <HostAlias>api.myCompany.com</HostAlias> </HostAliases> <Port>443</Port> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://myKeystoreRef</KeyStore> <KeyAlias>myKeyAlias</KeyAlias> <TrustStore>ref://myTruststoreRef</TrustStore> </SSLInfo> </VirtualHost>Определите ссылку на хранилище доверенных сертификатов, используемую в виртуальном хосте. В приведенном выше примере имя ссылки на хранилище доверенных сертификатов — myTruststoreRef.
- Определите хранилище доверенных сертификатов, на которое указывает ссылка на хранилище доверенных сертификатов.
- В пользовательском интерфейсе Edge перейдите в раздел Администрирование > Среды > Ссылки и найдите имя ссылки на хранилище доверенных сертификатов.
Обратите внимание на имя в столбце «Ссылка» для конкретной ссылки на хранилище доверенных сертификатов. Это будет имя вашего хранилища доверенных сертификатов.

Рисунок 1 В приведенном выше примере обратите внимание, что myTruststoreRef содержит ссылку на myTruststore . Следовательно, имя хранилища доверенных сертификатов — myTruststore .
- В интерфейсе Edge в разделе «Администрирование» > «Среды» > «Хранилища ключей TLS» перейдите в раздел «Хранилища ключей TLS» и найдите хранилище доверенных сертификатов, найденное на шаге № 3.
Выберите сертификат в конкретном хранилище доверенных сертификатов (определенном на шаге №3 выше), как показано ниже:

Рисунок 2 В приведенном выше примере сертификат с псевдонимом
client-cert-markwпоказывает, что срок его действия истек.- Проверьте, не истек ли срок действия псевдонима сертификата для вашего хранилища доверенных сертификатов.
- Если срок действия сертификата не истек, перейдите к общим шагам диагностики для других причин .
Разрешение
Получите новый сертификат и загрузите его:
- Создайте новое хранилище доверенных сертификатов, например, myNewTruststore.
- Загрузите новый сертификат в только что созданное хранилище доверенных сертификатов.
Измените ссылку на хранилище доверенных сертификатов, используемую в конкретном виртуальном хосте, чтобы она указывала на новое хранилище, используя шаги, описанные в разделе «Изменение ссылки» .
В приведенном выше примере укажите в качестве ссылки myTruststoreRef путь к myNewTruststore.
Общие этапы диагностики других причин
- Для исследования этой проблемы вам потребуется перехватить TCP/IP-пакеты с помощью инструмента tcpdump .
- Если вы используете частное облако , вы можете перехватывать TCP/IP-пакеты на клиентском приложении или маршрутизаторе.
- Если вы используете публичное облако , то перехватывайте TCP/IP-пакеты на клиентском приложении.
После того, как вы определились с местом, где хотите перехватывать TCP/IP-пакеты, используйте следующую команду tcpdump для захвата TCP/IP-пакетов:
tcpdump -i any -s 0 host <IP address> -w <File name>
Примечание: Если вы регистрируете TCP/IP-пакеты на маршрутизаторе, используйте публичный IP-адрес клиентского приложения в команде
tcpdump.Если вы анализируете TCP/IP-пакеты на стороне клиентского приложения, используйте публичный IP-адрес имени хоста, указанного в виртуальном хосте, в команде
tcpdump.Для получения дополнительной информации об этом инструменте и других вариантах этой команды обратитесь к документации tcpdump .
- Проанализируйте собранные TCP/IP-пакеты с помощью инструмента Wireshark или аналогичного инструмента, с которым вы знакомы.
Вот анализ данных тестовых TCP/IP-пакетов, выполненный с помощью инструмента Wireshark:
- Пакет № 30 в дампе tcpdump (изображение ниже) показывает, что клиентское приложение (источник) отправило сообщение "Client Hello" маршрутизатору (получателю).
- Пакет № 34 показывает, что маршрутизатор подтверждает получение сообщения Client Hello от клиентского приложения.
- Маршрутизатор отправляет сообщение "Server Hello" в пакете № 35, затем отправляет свой сертификат и запрашивает у клиентского приложения отправку своего сертификата в пакете № 38.
- В пакете № 38, куда маршрутизатор отправляет пакет «Запрос сертификата» , проверьте раздел «Отличительные имена», в котором содержится информация о клиентском сертификате, его цепочке и центрах сертификации, принятых маршрутизатором (сервером).
Клиентское приложение отправляет свой сертификат в пакете № 41. Проверьте раздел « Проверка сертификата» в пакете № 41 и определите, какой сертификат был отправлен клиентским приложением.

Рисунок 4 - Проверьте, совпадают ли субъект и издатель сертификата и его цепочки, отправленных клиентским приложением (пакет № 41), с принятым сертификатом и его цепочкой от маршрутизатора (пакет № 38). Если есть несоответствие, это и является причиной ошибки. Поэтому маршрутизатор (сервер) отправляет клиентскому приложению зашифрованное оповещение (пакет № 57), за которым следуют FIN и ACK (пакет № 58), и в конечном итоге соединение разрывается.
- Несоответствие сертификата и его цепочки может быть вызвано сценариями, описанными в следующих разделах.

Причина: Клиент отправил некорректный сертификат.
Это обычно происходит, если субъект/эмитент сертификата и/или его цепочки, отправленных клиентским приложением, не совпадает с сертификатом и/или его цепочкой, хранящимися в хранилище доверенных сертификатов маршрутизатора (сервера).
Диагноз
Войдите в пользовательский интерфейс Edge и просмотрите конфигурацию конкретного виртуального хоста ( Администрирование > Виртуальные хосты ), для которого выполняется запрос к API, или используйте API управления виртуальными хостами, чтобы получить определение конкретного виртуального хоста.
Как правило, виртуальный хост для двусторонней TLS-связи выглядит следующим образом:
<VirtualHost name="myTLSVHost"> <HostAliases> <HostAlias>api.myCompany.com</HostAlias> </HostAliases> <Port>443</Port> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://myKeystoreRef</KeyStore> <KeyAlias>myKeyAlias</KeyAlias> <TrustStore>ref://myCompanyTruststoreRef</TrustStore> </SSLInfo> </VirtualHost>- Определите ссылку на хранилище доверенных сертификатов, используемое в виртуальном хосте.
В приведенном выше примере имя ссылки на хранилище доверенных сертификатов — myCompanyTruststoreRef.
- Определите хранилище доверенных сертификатов, на которое указывает ссылка на хранилище доверенных сертификатов.
- В пользовательском интерфейсе Edge перейдите в раздел Администрирование > Ссылки на среды и найдите имя ссылки на хранилище доверенных сертификатов.
Обратите внимание на имя в столбце «Ссылка» для конкретной ссылки на хранилище доверенных сертификатов. Это будет имя вашего хранилища доверенных сертификатов.

Рисунок 5 В приведенном выше примере обратите внимание, что myCompanyTruststoreRef содержит ссылку на myCompanyTruststore. Следовательно, имя хранилища доверенных сертификатов — myCompanyTruststore.
- Получите сертификаты, хранящиеся в хранилище доверенных сертификатов (определенном на предыдущем шаге), используя следующие API:
Вывести список сертификатов для API хранилища ключей или хранилища доверенных сертификатов .
Этот API отображает список всех сертификатов в конкретном хранилище доверенных сертификатов.
Получите сведения о сертификате из API хранилища ключей или хранилища доверенных сертификатов .
Этот API возвращает информацию о конкретном сертификате в конкретном хранилище доверенных сертификатов.
- Проверьте, совпадают ли данные издателя и субъекта каждого сертификата и его цепочки, хранящихся в myCompanyTruststore , с данными сертификата и его цепочки, указанными в пакетах TCP/IP (см. пакет № 38) выше. Если обнаружено несоответствие, это указывает на то, что сертификаты, загруженные в хранилище доверенных сертификатов, не загружаются в пограничный маршрутизатор. Перейти к разделу «Причина: Клиентские сертификаты не загружены в пограничный маршрутизатор» .
- Если на шаге №5 не было обнаружено несоответствий, это означает, что клиентское приложение отправило неверный сертификат и его цепочку.
Разрешение
Убедитесь, что клиентское приложение отправляет в Edge корректный сертификат и его цепочку.
Причина: Отсутствует корневой сертификат клиента в хранилище доверенных сертификатов.
Эта ошибка возникает, если в хранилище доверенных сертификатов маршрутизатора Edge отсутствует корневой сертификат клиента, подписанный центром сертификации.
Диагноз
Войдите в пользовательский интерфейс Edge и просмотрите конфигурацию конкретного виртуального хоста, для которого выполняется запрос API ( Администрирование > Виртуальные хосты > virtual_host ), или используйте API Get virtual host, чтобы получить определение конкретного виртуального хоста.
Как правило, виртуальный хост для двусторонней TLS-связи выглядит следующим образом:
<VirtualHost name="myTLSVHost"> <HostAliases> <HostAlias>api.myCompany.com</HostAlias> </HostAliases> <Port>443</Port> <SSLInfo> <Enabled>true</Enabled> <ClientAuthEnabled>true</ClientAuthEnabled> <KeyStore>ref://myKeystoreRef</KeyStore> <KeyAlias>myKeyAlias</KeyAlias> <TrustStore>ref://myCompanyTruststoreRef</TrustStore> </SSLInfo> </VirtualHost>- Определите ссылку на хранилище доверенных сертификатов, используемую в виртуальном хосте. В предыдущем примере имя ссылки на хранилище доверенных сертификатов — myCompanyTruststoreRef.
- Определите, какое именно хранилище доверенных сертификатов используется в ссылке на него.
- В пользовательском интерфейсе Edge перейдите в раздел Администрирование > Среды > Ссылки и найдите имя ссылки на хранилище доверенных сертификатов.
Имя хранилища доверенных сертификатов для конкретной ссылки на хранилище находится в столбце «Ссылка» .

Рисунок 6 В этом примере обратите внимание, что в столбце «Ссылка» в переменной myCompanyTruststoreRef указано имя myCompanyTruststore . Следовательно, имя хранилища доверенных сертификатов — myCompanyTruststore .
- Получите сертификаты, хранящиеся в хранилище доверенных сертификатов (определенном на предыдущем шаге), используя следующие API:
- API для получения списка сертификатов из хранилища ключей или хранилища доверенных сертификатов . Этот API выводит список всех сертификатов в хранилище доверенных сертификатов.
- Получение сведений о сертификате из API хранилища ключей или хранилища доверенных сертификатов . Этот API возвращает информацию о конкретном сертификате в хранилище доверенных сертификатов.
Проверьте, содержит ли сертификат полную цепочку, включая корневой сертификат, отправленный конкретным клиентом, как это видно в пакетах TCP/IP (см. рисунок 4 ). Хранилище доверенных сертификатов должно включать корневой сертификат, а также конечный сертификат клиента или конечный и промежуточный сертификаты. Если в хранилище доверенных сертификатов отсутствует действительный корневой сертификат клиента, это и является причиной ошибки.
Однако, если полная цепочка сертификатов клиента, включая корневой сертификат, существует в хранилище доверенных сертификатов, это указывает на то, что сертификаты, загруженные в хранилище доверенных сертификатов, возможно, не загружены в пограничный маршрутизатор. В этом случае см. раздел «Причина: Сертификаты клиента не загружены в пограничный маршрутизатор» .
Разрешение
Убедитесь, что в хранилище доверенных сертификатов маршрутизатора Apigee Edge имеется правильный клиентский сертификат, включая корневой сертификат.
Причина: Клиентские сертификаты не загружены в пограничный маршрутизатор.
- Если вы используете публичное облако , обратитесь в службу поддержки Apigee Edge .
- Если вы используете частное облако , следуйте приведенным ниже инструкциям на каждом маршрутизаторе:
- Проверьте, существует ли файл
/opt/nginx/conf.d/OrgName_envName_vhostName-client.pemдля конкретного виртуального хоста. Если файл отсутствует, перейдите к разделу «Решение» ниже. - Если файл существует, используйте приведенную ниже команду
openssl, чтобы получить подробную информацию о сертификатах, доступных на пограничном маршрутизаторе:openssl -in <OrgName_envName_vhostName-client.pem> -text -noout
- Проверьте издателя, субъект и срок действия сертификата. Если какой-либо из этих параметров не совпадает с данными, полученными в хранилище доверенных сертификатов в пользовательском интерфейсе Edge или с помощью API управления, то это и является причиной ошибки.
- Возможно, маршрутизатор не перезагрузил загруженные сертификаты.
- Проверьте, существует ли файл
Разрешение
Чтобы убедиться в загрузке последних сертификатов, перезагрузите маршрутизатор, выполнив следующие действия:
apigee-service edge-router restart
Повторно запустите API и проверьте результаты. Если проблема сохраняется, перейдите в раздел «Сбор диагностической информации» .
Сбор диагностической информации
Если проблема сохраняется даже после выполнения вышеуказанных инструкций, пожалуйста, соберите следующую диагностическую информацию. Свяжитесь со службой поддержки Apigee Edge и поделитесь собранной информацией:
- Если вы являетесь пользователем публичного облака, предоставьте следующую информацию:
- Название организации
- Название среды
- Имя API-прокси
- Имя виртуального хоста
- Псевдоним хоста
- Выполните команду curl для воспроизведения ошибки.
- TCP/IP-пакеты, перехваченные клиентским приложением.
- Если вы являетесь пользователем частного облака, предоставьте следующую информацию:
- Имя виртуального хоста и его определение с помощью API получения виртуального хоста.
- Псевдоним хоста
- Полное сообщение об ошибке.
- TCP/IP-пакеты, перехваченные клиентским приложением или маршрутизатором.
- Результат выполнения команды `List`: список сертификатов из хранилища ключей API , а также подробные сведения о каждом сертификате, полученные с помощью команды `Get cert details API` .
- Пожалуйста, укажите, какие разделы этого руководства вы уже пробовали, а также любые другие замечания, которые помогут нам ускорить решение этой проблемы.