Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает ответ на запрос HTTP 400 — Bad с сообщением « Ошибка сертификата SSL ». Эта ошибка обычно отправляется Edge Router при двусторонней настройке 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 частного и публичного облака |
Отсутствует корневой сертификат клиента в хранилище доверенных сертификатов | Эта ошибка возникает, если корневой сертификат, подписанный ЦС клиента, отсутствует в хранилище доверенных сертификатов маршрутизатора Edge. | Пользователи Edge частного и публичного облака |
Сертификаты клиента не загружены в пограничный маршрутизатор | Эта ошибка возникает, если сертификаты клиента, загруженные в хранилище доверенных сертификатов, не загружены на маршрутизатор. | Пользователи Edge Private Cloud |
Причина: истек срок действия сертификата клиента.
Эта проблема обычно возникает для двустороннего TLS , когда срок действия сертификата, отправленного клиентом, истек. В двустороннем TLS клиент и сервер обмениваются своими общедоступными сертификатами для выполнения рукопожатия. Клиент проверяет сертификат сервера, а сервер проверяет сертификат клиента.
В Edge двусторонний TLS реализован на виртуальном хосте , где сертификат сервера добавляется в хранилище ключей, а сертификат клиента — в хранилища доверенных сертификатов.
Если во время установления связи TLS будет обнаружено, что срок действия сертификата клиента истек, сервер отправит запрос 400 — Bad с сообщением « Ошибка сертификата SSL ».
Диагностика
Войдите в пользовательский интерфейс Edge и просмотрите конкретную конфигурацию виртуального хоста ( Администратор > Виртуальные хосты ), для которой выполняется запрос API, или используйте 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 перейдите в раздел «Администратор» > «Среды» > «Ссылки» и найдите имя ссылки на хранилище доверенных сертификатов.
Обратите внимание на имя конкретной ссылки на хранилище доверенных сертификатов в столбце «Ссылка» . Это будет ваше имя хранилища доверенных сертификатов.
Обратите внимание, что в приведенном выше примере myTruststoreRef имеет ссылку на myTruststore . Таким образом, имя хранилища доверенных сертификатов — myTruststore .
- В разделе «Администратор» > «Среды» > «Хранилища ключей TLS» в пользовательском интерфейсе Edge перейдите к «Хранилища ключей TLS» и найдите хранилище доверенных сертификатов, найденное на шаге № 3.
Выберите сертификат в конкретном хранилище доверенных сертификатов (определенном на шаге 3 выше), как показано ниже:
Сертификат с псевдонимом
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 и определите сертификат, отправленный клиентским приложением.
- Убедитесь, что субъект и эмитент сертификата и его цепочка, отправленные клиентским приложением (пакет № 41), совпадают с принятым сертификатом и его цепочкой от Маршрутизатора (пакет № 38). Если есть несоответствие, то это и есть причина данной ошибки. Следовательно, маршрутизатор (сервер) отправляет зашифрованное предупреждение (пакет № 57), за которым следуют FIN, ACK (пакет 58) клиентскому приложению, и в конечном итоге соединение разрывается.
- Несоответствие сертификата и его цепочки может быть вызвано сценариями, описанными в следующих разделах.
Причина: клиент отправил неправильный сертификат.
Обычно это происходит, если субъект/эмитент сертификата и/или его цепочки, отправленного клиентским приложением, не соответствует сертификату и/или его цепочке, хранящимся в хранилище доверенных сертификатов Маршрутизатора (Сервера).
Диагностика
Войдите в пользовательский интерфейс Edge и просмотрите конкретную конфигурацию виртуального хоста ( Администратор > Виртуальные хосты ), для которой выполняется запрос API, или используйте 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 перейдите в раздел «Администратор» > «Ссылки на среды» и найдите имя ссылки на хранилище доверенных сертификатов.
Обратите внимание на имя конкретной ссылки на хранилище доверенных сертификатов в столбце «Ссылка» . Это будет ваше имя хранилища доверенных сертификатов.
Обратите внимание, что в приведенном выше примере myCompanyTruststoreRef имеет ссылку на myCompanyTruststore. Таким образом, имя хранилища доверенных сертификатов — myCompanyTruststore.
- Получите сертификаты, хранящиеся в хранилище доверенных сертификатов (определенном на предыдущем шаге), используя следующие API:
Перечислите сертификаты для API хранилища ключей или хранилища доверенных сертификатов .
Этот API перечисляет все сертификаты в конкретном хранилище доверенных сертификатов.
Получите сведения о сертификате из хранилища ключей или API хранилища доверенных сертификатов .
Этот API возвращает информацию о конкретном сертификате в конкретном хранилище доверенных сертификатов.
- Проверьте, совпадают ли эмитент и субъект каждого сертификата и его цепочки, хранящихся в myCompanyTruststore , с сертификатом и его цепочкой, как показано в пакетах TCP/IP (см. пакет № 38) выше. Если есть несоответствие, это означает, что сертификаты, загруженные в хранилище доверенных сертификатов, не загружаются в пограничный маршрутизатор. Перейдите к причине: сертификаты клиента не загружены в пограничный маршрутизатор .
- Если на шаге №5 не было обнаружено несоответствий, это означает, что клиентское приложение отправило неправильный сертификат и его цепочку.
Разрешение
Убедитесь, что клиентское приложение отправляет в Edge правильный сертификат и его цепочку.
Причина: в хранилище доверенных сертификатов отсутствует корневой сертификат клиента.
Эта ошибка возникает, если корневой сертификат, подписанный ЦС клиента, отсутствует в хранилище доверенных сертификатов маршрутизатора Edge.
Диагностика
Войдите в пользовательский интерфейс Edge и просмотрите конкретную конфигурацию виртуального хоста, для которой выполняется запрос API ( Администратор > Виртуальные хосты > virtual_host ), или используйте 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 перейдите в раздел «Администратор» > «Среды» > «Ссылки» и найдите имя ссылки на хранилище доверенных сертификатов.
Имя хранилища доверенных сертификатов для конкретной ссылки на хранилище доверенных сертификатов указано в столбце «Ссылка» .
Обратите внимание, что в этом примере 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 и поделитесь собранной информацией:
- Если вы являетесь пользователем Public Cloud, предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя прокси API
- Имя виртуального хоста
- Псевдоним хоста
- Завершите команду Curl, чтобы воспроизвести ошибку.
- Пакеты TCP/IP, перехваченные клиентским приложением
- Если вы являетесь пользователем частного облака, предоставьте следующую информацию:
- Имя виртуального хоста и его определение с помощью API получения виртуального хоста
- Псевдоним хоста
- Обнаружено полное сообщение об ошибке
- Пакеты TCP/IP, перехваченные клиентским приложением или маршрутизатором.
- Вывод списка сертификатов из API хранилища ключей , а также сведений о каждом сертификате, полученном с помощью API получения сведений о сертификате .
- Подробная информация о том, какие разделы этого руководства вы пробовали, а также любые другие сведения, которые помогут нам ускорить решение этой проблемы.