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.
Chuyển đến tài liệu về Apigee X.
thông tin

Triệu chứng

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

Thông báo lỗi

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

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ể xảy ra

Các nguyên nhân có thể dẫn đến vấn đề này như sau:

Nguyên nhân Mô tả Hướng dẫn khắc phục sự cố có thể áp dụng cho
Chứng chỉ máy khách đã hết hạn Chứng chỉ do ứng dụng gửi đã hết hạn. Người dùng Edge về dịch vụ đám mây riêng tư và công khai
Chứng chỉ do ứng dụng gửi không chính xác Lỗi này được tạo ra nếu chứng chỉ do ứng dụng gửi không khớp với chứng chỉ được lưu trữ trong kho tin cậy của Bộ định tuyến của Edge. Người dùng Edge về dịch vụ đám mây riêng tư và công khai
Thiếu chứng chỉ gốc ứng dụng trong Truststore Lỗi này được tạo ra nếu bị thiếu chứng chỉ gốc có chữ ký của CA trong kho lưu trữ tin cậy của bộ định tuyến Edge. Người dùng Edge về dịch vụ đám mây riêng tư và công khai
Chứng chỉ ứng dụng không được tải trong Bộ định tuyến cạnh Lỗi này được tạo ra nếu các chứng chỉ ứng dụng khách đã 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 khách đã hết hạn

Sự cố này thường xảy ra đối với TLS 2 chiều, khi chứng chỉ mà ứng dụng 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 quá trình bắt tay. Máy khách xác thực chứng chỉ máy chủ và máy chủ xác thực chứng chỉ máy khách.

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 khoá.

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, máy chủ sẽ gửi 400 – Yêu cầu không hợp lệ kèm 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 của Edge và xem cấu hình Máy chủ ảo cụ thể (Quản trị viên > 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ý Nhận API của máy chủ ảo để xem định nghĩa của Máy chủ ảo cụ thể.

    Thông thường, một máy chủ ảo cho hoạt động 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 tham chiếu Truststore 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 trỏ đến bởi tham chiếu Truststore.
    1. Trong giao diện người dùng Edge, hãy chuyển đến mục Quản trị > Môi trường > Tham chiếu rồi tìm tên tham chiếu Truststore.
    2. Hãy ghi lại tên trong cột Reference (Tham chiếu) của tệp tham chiếu 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ệp tham chiếu
      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 mục 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 (Bảo mật tầng truyền tải) rồi tìm Kho khoá bảo mật 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ạ bên dưới:

    Hình 2

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

  6. Kiểm tra xem chứng chỉ đã hết hạn đối với bí danh chứng chỉ cho kho tin cậy của bạn hay chưa.
  7. Nếu chứng chỉ chưa hết hạn thì hãy chuyển sang phần Các bước chẩn đoán phổ biến cho các nguyên nhân khác.

Độ phân giải

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

  1. Tạo một kho lưu trữ 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 tệp tham chiếu trustore dùng trong Máy chủ ảo cụ thể để trỏ đến kho tin cậy mới bằng cách làm theo các bước trong phần Sửa đổi tệp đối chiếu.

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

Các bước chẩn đoán phổ biến cho các nguyên nhân khác

  1. Để điều tra vấn đề này, bạn cần ghi lại 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 tư, bạn có thể thu thập các gói TCP/IP trên ứng dụng hoặc Bộ định tuyến.
    2. Nếu bạn là người dùng Public Cloud (Đám mây công cộng), thì hãy thu thập các gói TCP/IP trên ứng dụng.
    3. Sau khi quyết định vị trí 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 dùng địa chỉ IP công khai của ứng dụng trong lệnh tcpdump.

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

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

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

Dưới đây là dữ liệu phân tích mẫu gói dữ liệu 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 rằng Ứng dụng khách (nguồn) đã gửi thông báo "Client Hello" (Xin chào ứng dụng) đến Bộ định tuyến (đích đến).
  2. Gói số 34 cho thấy Bộ định tuyến xác nhận thông báo Client Hello từ ứng dụng.
  3. Bộ định tuyến gửi "Server Hello" (Xin chào máy chủ) trong gói #35, sau đó gửi chứng chỉ, đồng thời yêu cầu ứng dụng gửi chứng chỉ trong gói #38.
  4. Trong gói số 38, nơi Bộ định tuyến gửi gói "Yêu cầu chứng chỉ", hãy kiểm tra phần "Tên phân biệt". Phần này cung cấp thông tin chi tiết về chứng chỉ ứng dụng khách, chuỗi và tổ chức phát hành chứng chỉ được Bộ định tuyến (máy chủ) chấp nhận.
  5. Hình 3
  6. Ứng dụng khách gửi chứng chỉ trong Gói # 41. Kiểm tra mục Chứng chỉ Xác minh 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 đối tượng, người phát hành chứng chỉ và chuỗi của chứng chỉ đó do ứng dụng gửi (gói số 41) có khớp với chứng chỉ được chấp nhận và chuỗi của chứng chỉ trong Bộ định tuyến hay không (gói số 38). Nếu thông tin không khớp thì đó chính là nguyên nhân gây ra lỗi này. Do đó, Bộ định tuyến (Máy chủ) gửi Cảnh báo đã mã hoá (gói #57), theo sau là FIN, ACK (gói 58) đến Ứng dụng và cuối cùng là kết thúc kết nối.
  8. Việc chứng chỉ và chuỗi của chứng chỉ không khớp có thể do các tình huống được mô tả trong các phần sau đây.

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

Trường hợp này thường xảy ra nếu chủ thể/đơn vị phát hành chứng chỉ và/hoặc chuỗi của chứng chỉ và/hoặc chuỗi của chứng chỉ do ứng dụng gửi không khớp với chứng chỉ và/hoặc chuỗi của chứng chỉ được lưu trữ trong kho lưu trữ tin cậy 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 của Edge và xem cấu hình Máy chủ ảo cụ thể (Quản trị viên > Máy chủ ảo) đang thực hiện yêu cầu API hoặc sử dụng API quản lý Nhận API của máy chủ ảo để xem định nghĩa của Máy chủ ảo cụ thể.

    Thông thường, một máy chủ ảo cho hoạt động 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 tham chiếu Truststore 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 trỏ đến bởi tham chiếu Truststore.
    1. Trong giao diện người dùng Edge, hãy chuyển đến mục Quản trị > Tham chiếu môi trường rồi tìm tên tham chiếu Truststore.
    2. Hãy ghi lại tên trong cột Reference (Tham chiếu) của tệp tham chiếu Truststore cụ thể. Đây sẽ là tên Truststore của bạn.

      Giao diện người dùng Edge cho thấy tham chiếu Truststore.
      Hình 5

      Trong ví dụ trên, hãy 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ác API sau:
    1. Liệt kê các chứng chỉ cho một kho khoá hoặc API Truststore.

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

    2. Nhận thông tin chi tiết về chứng chỉ từ kho khoá hoặc API Truststore.

      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ủ thể 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 của chứng chỉ như trong Gói TCP/IP hay không (xem gói số 38) ở trên. Nếu thông tin không khớp, thì tức là các chứng chỉ được tải lên Truststore chưa được tải trong Bộ định tuyến Edge. Chuyển đến Nguyên nhân: Chứng chỉ máy khách không được tải trong Bộ định tuyến Edge.
  6. Nếu không phát hiện thấy thông tin không khớp nào ở Bước #5, thì tức là ứng dụng khách đã không gửi đúng Chứng chỉ và chuỗi tương ứng.

Độ phân giải

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

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

Lỗi này được tạo ra nếu bị thiếu chứng chỉ gốc có chữ ký của CA trong kho lưu trữ tin cậy của bộ định tuyến Edge.

Chẩn đoán

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

    Thông thường, một máy chủ ảo cho hoạt động 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 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 kho lưu trữ tin cậy thực tế mà tệp tham chiếu kho tin cậy 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 > Tham chiếu rồi tìm tên tham chiếu Truststore.
  5. Tên Truststore cho tham chiếu Truststore cụ thể nằm trong cột Reference (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ác API sau:
    1. Liệt kê các chứng chỉ cho một kho khoá hoặc API Truststore. API này liệt kê tất cả chứng chỉ trong Truststore.
    2. Nhận thông tin chi tiết về chứng chỉ từ kho khoá hoặc API Truststore. 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ỉ trung gian của ứng dụng. Nếu chứng chỉ gốc hợp lệ của ứng dụng bị thiếu 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) tồn tại trong Truststore, thì tức là các chứng chỉ được tải lên kho lưu trữ tin cậy có thể không được tải trong Bộ định tuyến Edge. Nếu trường hợp đó xảy ra, hãy xem Nguyên nhân: Chứng chỉ ứng dụng khách không được tải trong Bộ định tuyến Edge.

Độ phân giải

Đảm bảo rằng chứng chỉ của ứng dụng chính xác, bao gồm cả chứng chỉ gốc, có trong kho tin cậy 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 cạnh

  1. Nếu bạn là người dùng Public Cloud (Đám mây công cộng), hãy liên hệ với Nhóm hỗ trợ API Apigee Edge.
  2. Nếu bạn là người dùng private Cloud (Đám mây riêng tư), hãy làm theo hướng dẫn bên dưới trên từng 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 Độ phân giải bên dưới.
    2. Nếu tệp tồn tại, hãy dùng lệnh openssl dưới đây để tải thông tin chi tiết về các chứng chỉ có trên Bộ định tuyến Edge:
      openssl -in <OrgName_envName_vhostName-client.pem> -text -noout
    3. Kiểm tra nhà phát hành, chủ đề và ngày hết hạn của chứng chỉ. Nếu bất kỳ điều nào trong số này không khớp với những gì quan sát được trong Truststore trong giao diện người dùng Edge hoặc không khớp với API quản lý, thì đó chính là nguyên nhân gây ra lỗi.
    4. Có thể Bộ định tuyến chưa 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 theo bước dưới đây:

apigee-service edge-router restart

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

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

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

  1. Nếu bạn là người dùng Public Cloud, 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 của máy chủ lưu trữ
    6. Hoàn tất lệnh curl để tái hiện lỗi
    7. Gói TCP/IP được ghi lại trên Ứng dụng
  2. Nếu bạn là người dùng Đám mây riêng tư, hãy cung cấp những thông tin sau:
    1. Tên máy chủ ảo và định nghĩa tên máy chủ ảo bằng cách sử dụng Tải API máy chủ ảo
    2. Tên bí danh của máy chủ lưu trữ
    3. Đã phát hiện thấy Thông báo lỗi hoàn chỉnh
    4. Gói TCP/IP được ghi trên Ứng dụng hoặc Bộ định tuyến.
    5. Kết quả của API Liệt kê các chứng chỉ từ API kho khoá cũng như thông tin chi tiết của từng chứng chỉ thu được bằng Lấy API chi tiết chứng chỉ.
  3. Thông tin chi tiết về những phần mà bạn đã thử trong Cẩm nang này và mọi thông tin chi tiết khác sẽ giúp chúng tôi nhanh chóng giải quyết vấn đề này.