Yêu cầu 400 không hợp lệ – Lỗi chứng chỉ SSL

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

Dấu hiệu

Ứng dụng khách nhận được phản hồi HTTP 400 – Yêu cầu không hợp lệ kèm theo thông báo "Lỗi chứng chỉ SSL". Lỗi này thường do Bộ định tuyến biên gửi trong chế độ thiết lập TLS hai chiều được bật cho kết nối đến Apigee Edge.

Thông báo Lỗi

Ứng dụng Client sẽ nhận được mã phản hồi sau:

HTTP/1.1 400 Bad Request

Tiếp theo là trang lỗi HTML bên dưới:

<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>

Nguyên nhân có thể dẫn đến vấn đề này

Sau đây là những nguyên nhân có thể gây ra vấn đề này:

Nguyên nhân Nội dung mô tả Hướng dẫn khắc phục sự cố áp dụng cho
Chứng chỉ ứng dụng khách đã hết hạn Chứng chỉ do ứng dụng gửi đã hết hạn. Người dùng Edge Private Cloud và Public Cloud
Ứng dụng gửi Chứng chỉ không chính xác Lỗi này sẽ xảy ra nếu chứng chỉ do ứng dụng khách gửi không khớp với chứng chỉ được lưu trữ trong truststore của Bộ định tuyến Edge. Người dùng Edge Private Cloud và Public Cloud
Thiếu Chứng chỉ gốc của máy khách trong Truststore Lỗi này sẽ xảy ra nếu chứng chỉ gốc do CA của máy khách ký bị thiếu trong truststore của bộ định tuyến Edge. Người dùng Edge Private Cloud và Public Cloud
Chứng chỉ ứng dụng không được tải trong Bộ định tuyến biên Lỗi này sẽ xảy ra nếu các chứng chỉ ứng dụng được tải lên truststore không được tải trên Bộ định tuyến. Người dùng Edge Private Cloud

Nguyên nhân: Chứng chỉ ứng dụng đã hết hạn

Vấn đề này thường xảy ra đối với TLS 2 chiều, khi chứng chỉ do máy khách gửi đã hết hạn. Trong TLS 2 chiều, cả ứng dụng và máy chủ đều trao đổi chứng chỉ công khai để hoàn tất quy trình bắt tay. Ứng dụng xác thực chứng chỉ máy chủ và máy chủ xác thực chứng chỉ ứng dụng.

Trong Edge, TLS 2 chiều được triển khai tại máy chủ ảo, trong đó chứng chỉ máy chủ được thêm vào Kho khoá và chứng chỉ máy khách được thêm vào kho lưu trữ đáng tin cậy.

Trong quá trình bắt tay TLS, nếu phát hiện thấy chứng chỉ máy khách đã hết hạn, thì máy chủ sẽ gửi 400 – Yêu cầu không hợp lệ kèm theo thông báo "Lỗi chứng chỉ SSL".

Chẩn đoán

  1. Đăng nhập vào giao diện người dùng Edge và xem cấu hình Máy chủ ảo cụ thể (Quản trị > Máy chủ ảo) mà yêu cầu API đang được thực hiện hoặc sử dụng API quản lý Lấy máy chủ ảo để lấy định nghĩa về Máy chủ ảo cụ thể.

    Thông thường, máy chủ ảo cho giao tiếp TLS hai chiều sẽ có dạng như sau:

    <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>
  2. Xác định thông tin tham chiếu Truststore được dùng trong Máy chủ ảo. Trong ví dụ trên, tên tham chiếu Truststore là myTruststoreRef.

  3. Xác định Truststore được chỉ đến bằng Truststore reference.
    1. Trong giao diện người dùng Edge, hãy chuyển đến Quản trị > Môi trường > Thông tin tham chiếu và tìm tên thông tin tham chiếu Truststore.
    2. Ghi lại tên trong cột Tham chiếu cho tài liệu tham khảo Truststore cụ thể. Đây sẽ là tên Truststore của bạn.

      Giao diện người dùng Edge cho thấy danh sách các tài liệu tham khảo
      Hình 1

      Trong ví dụ trên, hãy lưu ý rằng myTruststoreRef có tham chiếu đến myTruststore. Do đó, tên Truststore là myTruststore.

  4. Trong Quản trị > Môi trường > Kho khoá TLS trong giao diện người dùng Edge, hãy chuyển đến Kho khoá TLS và tìm Truststore trong bước 3.
  5. Chọn chứng chỉ trong Truststore cụ thể (được xác định ở bước 3 ở trên) như minh hoạ dưới đây:

    Hình 2

    Chứng chỉ có bí danh client-cert-markw trong ví dụ trên cho thấy chứng chỉ đó đã hết hạn.

  6. Kiểm tra xem chứng chỉ có hết hạn hay không đối với bí danh chứng chỉ cho truststore của bạn.
  7. Nếu chứng chỉ chưa hết hạn, hãy chuyển sang Các bước chẩn đoán thường gặp đối với các nguyên nhân khác.

Độ phân giải

Mua một chứng chỉ mới và tải chứng chỉ đó lên:

  1. Tạo một kho lưu trữ đáng tin cậy mới, ví dụ: myNewTruststore.
  2. Tải chứng chỉ mới lên truststore mới tạo.
  3. Sửa đổi thông tin tham chiếu truststore được dùng trong Máy chủ ảo cụ thể để trỏ đến truststore mới bằng các bước được cung cấp trong phần Sửa đổi thông tin tham chiếu.

    Trong ví dụ được mô tả ở trên, hãy trỏ tham chiếu myTruststoreRef đến myNewTruststore.

Các bước chẩn đoán thường gặp đối với các nguyên nhân khác

  1. Để điều tra vấn đề này, bạn sẽ cần thu thập các gói TCP/IP bằng công cụ tcpdump.
    1. Nếu là người dùng Đám mây riêng, bạn có thể ghi lại các gói TCP/IP trên ứng dụng khách hoặc Bộ định tuyến.
    2. Nếu bạn là người dùng Đám mây công khai, hãy ghi lại các gói TCP/IP trên ứng dụng khách.
    3. Sau khi quyết định vị trí mà bạn muốn thu thập các gói TCP/IP, hãy dùng lệnh tcpdump sau đây để thu thập các gói TCP/IP:

      tcpdump -i any -s 0 host <IP address> -w <File name>

      Lưu ý: Nếu bạn đang lấy các gói TCP/IP trên Bộ định tuyến, hãy sử dụng địa chỉ IP công khai của ứng dụng khách trong lệnh tcpdump.

      Nếu bạn đang lấy các gói TCP/IP trên ứng dụng khách, hãy sử dụng địa chỉ IP công khai của tên máy chủ được dùng trong Máy chủ ảo trong lệnh tcpdump.

      Hãy tham khảo tcpdump để biết thêm thông tin về công cụ này và các biến thể khác của lệnh này.

  2. Phân tích các gói TCP/IP được thu thập bằng công cụ Wireshark hoặc công cụ tương tự mà bạn quen dùng.

Sau đây là kết quả phân tích dữ liệu mẫu về các gói TCP/IP bằng công cụ Wireshark:

  1. Gói số 30 trong tcpdump (hình ảnh bên dưới) cho thấy Ứng dụng khách (nguồn) đã gửi một "Thông báo Xin chào của ứng dụng khách" đến Bộ định tuyến (đích).
  2. Gói số 34 cho thấy Bộ định tuyến xác nhận thông báo Xin chào từ ứng dụng khách.
  3. Bộ định tuyến gửi "Server Hello" trong gói số 35, sau đó gửi chứng chỉ của bộ định tuyến và cũng yêu cầu ứng dụng khách gửi chứng chỉ của ứng dụng trong gói số 38.
  4. Trong gói #38, khi Bộ định tuyến gửi gói "Certificate Request" (Yêu cầu chứng chỉ), hãy kiểm tra phần "Distinguished Names" (Tên riêng biệt) cung cấp thông tin chi tiết về chứng chỉ máy khách, chuỗi và cơ quan cấp chứng chỉ mà Bộ định tuyến (máy chủ) chấp nhận.
  5. Hình 3
  6. Ứng dụng khách sẽ gửi chứng chỉ của mình trong Gói số 41. Kiểm tra phần Certificate Verify (Xác minh chứng chỉ) trong gói số 41 và xác định chứng chỉ do ứng dụng khách gửi.

    Hình 4
  7. Xác minh xem chủ thể và tổ chức phát hành của chứng chỉ và chuỗi chứng chỉ do ứng dụng khách gửi (gói số 41) có khớp với chứng chỉ được chấp nhận và chuỗi chứng chỉ của Bộ định tuyến (gói số 38) hay không. Nếu có sự không khớp thì đó là nguyên nhân gây ra lỗi này. Do đó, Bộ định tuyến (Máy chủ) sẽ gửi Cảnh báo được mã hoá (gói số 57), sau đó là FIN, ACK (gói 58) đến Ứng dụng khách và cuối cùng kết nối sẽ bị chấm dứt.
  8. Sự không khớp giữa chứng chỉ và chuỗi chứng chỉ có thể là do các trường hợp được mô tả trong các phần sau.

Nguyên nhân: Ứng dụng gửi chứng chỉ không chính xác

Điều này thường xảy ra nếu chủ đề/tổ chức phát hành của chứng chỉ và/hoặc chuỗi chứng chỉ do ứng dụng khách gửi không khớp với chứng chỉ và/hoặc chuỗi chứng chỉ được lưu trữ trong truststore của Bộ định tuyến (Máy chủ).

Chẩn đoán

  1. Đăng nhập vào giao diện người dùng Edge và xem cấu hình Máy chủ ảo cụ thể (Quản trị > Máy chủ ảo) mà yêu cầu API đang được thực hiện, hoặc sử dụng API quản lý Lấy API máy chủ ảo để lấy định nghĩa về Máy chủ ảo cụ thể.

    Thông thường, máy chủ ảo cho giao tiếp TLS hai chiều sẽ có dạng như sau:

        <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>
  2. Xác định thông tin tham chiếu Truststore được dùng trong Máy chủ ảo.

    Trong ví dụ trên, tên tham chiếu Truststore là myCompanyTruststoreRef.

  3. Xác định Truststore được chỉ định theo tài liệu tham khảo Truststore.
    1. Trong giao diện người dùng Edge, hãy chuyển đến Quản trị > Môi trường tham chiếu và tìm tên tham chiếu Truststore.
    2. Ghi lại tên trong cột Tham chiếu cho tài liệu tham khảo Truststore cụ thể. Đây sẽ là tên Truststore của bạn.

      Giao diện người dùng Edge cho thấy tài liệu tham khảo truststore.
      Hình 5

      Trong ví dụ trên, lưu ý rằng myCompanyTruststoreRef có tham chiếu đến myCompanyTruststore. Do đó, tên Truststore là myCompanyTruststore.

  4. Lấy các chứng chỉ được lưu trữ trong Truststore (xác định ở bước trước) bằng cách sử dụng các API sau:
    1. Liệt kê các chứng chỉ cho API kho khoá hoặc kho tin cậy.

      API này liệt kê tất cả các chứng chỉ trong Truststore cụ thể.

    2. Lấy thông tin chi tiết về chứng chỉ từ API kho khoá hoặc kho lưu trữ đáng tin cậy.

      API này trả về thông tin về một chứng chỉ cụ thể trong Truststore cụ thể.

  5. Kiểm tra xem nhà phát hành và chủ đề của từng chứng chỉ và chuỗi chứng chỉ được lưu trữ trong myCompanyTruststore có khớp với chứng chỉ và chuỗi chứng chỉ như trong Gói TCP/IP (tham khảo gói số 38) ở trên hay không. Nếu có sự không khớp, thì điều đó cho thấy các chứng chỉ được tải lên truststore không được tải trong Bộ định tuyến biên. Chuyển đến Nguyên nhân: Chứng chỉ ứng dụng không được tải trong Bộ định tuyến Edge.
  6. Nếu không có sự không khớp nào ở Bước 5, thì điều đó cho thấy ứng dụng khách không gửi đúng Chứng chỉ và chuỗi của chứng chỉ đó.

Độ phân giải

Đảm bảo rằng ứng dụng khách gửi đúng chứng chỉ và chuỗi chứng chỉ đó đến Edge.

Nguyên nhân: Thiếu Chứng chỉ gốc của ứng dụng trong Truststore

Lỗi này sẽ xảy ra nếu chứng chỉ gốc do CA của máy khách ký bị thiếu trong truststore của bộ định tuyến Edge.

Chẩn đoán

  1. Đăng nhập vào giao diện người dùng Edge rồi xem cấu hình máy chủ ảo cụ thể mà yêu cầu API đang được thực hiện (Quản trị > Máy chủ ảo > virtual_host) hoặc sử dụng API Lấy máy chủ ảo để lấy định nghĩa về máy chủ ảo cụ thể.

    Thông thường, máy chủ ảo cho giao tiếp TLS hai chiều sẽ có dạng như sau:

        <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>
  2. Xác định thông tin tham chiếu truststore được dùng trong máy chủ ảo. Trong ví dụ trước, tên tham chiếu truststore là myCompanyTruststoreRef.
  3. Xác định truststore thực tế mà tham chiếu truststore đang sử dụng.
  4. Trong giao diện người dùng Edge, hãy chuyển đến Quản trị > Môi trường > Thông tin tham chiếu rồi tìm kiếm tên thông tin tham chiếu truststore.
  5. Tên truststore cho thông tin tham chiếu truststore cụ thể nằm trong cột Reference (Thông tin tham chiếu).

    Hình 6

    Trong ví dụ này, hãy lưu ý rằng myCompanyTruststoreRefmyCompanyTruststore trong cột Tham chiếu. Do đó, tên truststore là myCompanyTruststore.

  6. Lấy các chứng chỉ được lưu trữ trong truststore (xác định ở bước trước) bằng cách sử dụng các API sau:
    1. Liệt kê các chứng chỉ cho API kho khoá hoặc kho tin cậy. API này liệt kê tất cả các chứng chỉ trong truststore.
    2. Lấy thông tin chi tiết về chứng chỉ từ API kho khoá hoặc kho lưu trữ đáng tin cậy. API này trả về thông tin về một chứng chỉ cụ thể trong truststore.
  7. Kiểm tra xem chứng chỉ có chứa một chuỗi hoàn chỉnh hay không, bao gồm cả chứng chỉ gốc do ứng dụng cụ thể gửi như trong Gói TCP/IP (xem Hình 4). Truststore phải bao gồm chứng chỉ gốc cũng như chứng chỉ lá hoặc chứng chỉ lá và chứng chỉ trung gian của máy khách. Nếu thiếu chứng chỉ gốc hợp lệ của ứng dụng trong truststore, thì đó là nguyên nhân gây ra lỗi.

    Tuy nhiên, nếu chuỗi chứng chỉ hoàn chỉnh của ứng dụng, bao gồm cả chứng chỉ gốc, có trong kho lưu trữ đáng tin cậy, thì điều đó cho thấy các chứng chỉ được tải lên kho lưu trữ đáng tin cậy có thể không được tải trong Bộ định tuyến biên. Nếu đó là trường hợp này, hãy xem Nguyên nhân: Chứng chỉ máy khách không được tải trong Bộ định tuyến biên.

Độ phân giải

Đảm bảo rằng chứng chỉ chính xác của ứng dụng khách, bao gồm cả chứng chỉ gốc, có trong truststore của bộ định tuyến Apigee Edge.

Nguyên nhân: Chứng chỉ ứng dụng không được tải trong Bộ định tuyến Edge

  1. Nếu bạn là người dùng Đám mây công khai, hãy liên hệ với Nhóm hỗ trợ Apigee Edge.
  2. Nếu bạn là người dùng Đám mây riêng, hãy làm theo hướng dẫn bên dưới trên mỗi Bộ định tuyến:
    1. Kiểm tra xem tệp /opt/nginx/conf.d/OrgName_envName_vhostName-client.pem có tồn tại cho máy chủ ảo cụ thể hay không. Nếu tệp không tồn tại, hãy chuyển đến phần Giải pháp bên dưới.
    2. Nếu tệp tồn tại, hãy dùng lệnh openssl bên dưới để lấy thông tin chi tiết về các chứng chỉ có trên Bộ định tuyến biên:
      openssl -in <OrgName_envName_vhostName-client.pem> -text -noout
    3. Kiểm tra tổ chức phát hành, chủ đề và ngày hết hạn của chứng chỉ. Nếu bất kỳ thông tin nào trong số này không khớp với thông tin đã quan sát được trong Truststore trong Giao diện người dùng Edge hoặc khi sử dụng API quản lý, thì đó là nguyên nhân gây ra lỗi.
    4. Có thể Bộ định tuyến không tải lại các chứng chỉ đã tải lên.

Độ phân giải

Khởi động lại Bộ định tuyến để đảm bảo các Chứng chỉ mới nhất được tải bằng cách làm theo bước bên dưới:

apigee-service edge-router restart

Chạy lại các API và kiểm tra kết quả. Nếu vấn đề vẫn tiếp diễn, hãy chuyển đến phần Thu thập thông tin chẩn đoán.

Thu thập thông tin chẩn đoán

Nếu vấn đề vẫn tiếp diễn ngay cả sau khi bạn làm theo hướng dẫn ở trên, vui lòng thu thập thông tin chẩn đoán sau đây. Liên hệ và chia sẻ thông tin bạn thu thập được với Nhóm hỗ trợ Apigee Edge:

  1. Nếu bạn là người dùng Đám mây công khai, hãy cung cấp những thông tin sau:
    1. Tên tổ chức
    2. Tên môi trường
    3. Tên Proxy API
    4. Tên máy chủ ảo
    5. Tên bí danh máy chủ lưu trữ
    6. Hoàn tất lệnh curl để tái tạo lỗi
    7. Các gói TCP/IP được thu thập trên Ứng dụng
  2. Nếu bạn là người dùng Đám mây riêng, hãy cung cấp những thông tin sau:
    1. Tên máy chủ ảo và định nghĩa của tên máy chủ ảo bằng cách sử dụng API Lấy máy chủ ảo
    2. Tên bí danh máy chủ lưu trữ
    3. Thông báo lỗi hoàn chỉnh đã quan sát được
    4. Các gói TCP/IP được thu thập trên Ứng dụng khách hoặc Bộ định tuyến.
    5. Đầu ra của List the certificates from the keystore API (Liệt kê các chứng chỉ từ API kho khoá) API và cả thông tin chi tiết của từng Chứng chỉ thu được bằng cách sử dụng Get cert details API (API Nhận thông tin chi tiết về chứng chỉ).
  3. Thông tin chi tiết về những phần trong Sổ tay này mà bạn đã thử và mọi thông tin chi tiết khác sẽ giúp chúng tôi đẩy nhanh quá trình giải quyết vấn đề này.