browser.certificateProvider

Mô tả

Sử dụng API này để hiển thị chứng chỉ cho nền tảng có thể sử dụng các chứng chỉ này để xác thực TLS.

Quyền

certificateProvider

Phạm vi cung cấp

Chrome 46 trở lên browser.* kể từ Chrome 148 Chỉ ChromeOS

Khái niệm và cách sử dụng

Cách sử dụng thông thường của API này để hiển thị chứng chỉ ứng dụng cho ChromeOS bao gồm các bước sau:

  • Tiện ích đăng ký các sự kiện onCertificatesUpdateRequested và onSignatureRequested.
  • Tiện ích gọi setCertificates() để cung cấp danh sách chứng chỉ ban đầu sau khi khởi chạy.
  • Tiện ích này giám sát các thay đổi trong danh sách chứng chỉ có sẵn và gọi setCertificates() để thông báo cho trình duyệt về mọi thay đổi như vậy.
  • Trong quá trình bắt tay TLS, trình duyệt sẽ nhận được yêu cầu chứng chỉ ứng dụng. Với sự kiện onCertificatesUpdateRequested, trình duyệt sẽ yêu cầu Tiện ích báo cáo tất cả chứng chỉ mà tiện ích hiện đang cung cấp.
  • Tiện ích báo cáo lại bằng các chứng chỉ hiện có, sử dụng phương thức setCertificates().
  • Trình duyệt so khớp tất cả chứng chỉ hiện có với yêu cầu chứng chỉ ứng dụng khách từ máy chủ từ xa. Các kết quả trùng khớp sẽ được hiển thị cho người dùng trong hộp thoại lựa chọn.
  • Người dùng có thể chọn một chứng chỉ và từ đó phê duyệt hoặc huỷ quy trình xác thực.
Hộp thoại chọn chứng chỉ
Hộp thoại chọn chứng chỉ.
  • Nếu người dùng huỷ quy trình xác thực hoặc không có chứng chỉ nào khớp với yêu cầu, thì quy trình xác thực ứng dụng TLS sẽ bị huỷ.
  • Nếu không, nếu người dùng phê duyệt việc xác thực bằng chứng chỉ do Tiện ích này cung cấp, thì trình duyệt sẽ yêu cầu Tiện ích ký dữ liệu để tiếp tục quá trình bắt tay TLS. Yêu cầu được gửi dưới dạng sự kiện onSignatureRequested.
  • Sự kiện này chứa dữ liệu đầu vào, khai báo thuật toán phải được dùng để tạo chữ ký và tham chiếu đến một trong các chứng chỉ mà Tiện ích này đã báo cáo. Tiện ích phải tạo chữ ký cho dữ liệu đã cho bằng khoá riêng tư liên kết với chứng chỉ được tham chiếu. Để tạo chữ ký, bạn có thể phải thêm DigestInfo và đệm kết quả trước khi ký thực tế.
  • Tiện ích gửi lại chữ ký cho trình duyệt bằng phương thức reportSignature(). Nếu không thể tính toán chữ ký, thì phương thức này phải được gọi mà không có chữ ký.
  • Nếu chữ ký được cung cấp, trình duyệt sẽ hoàn tất quá trình bắt tay TLS.

Trình tự thực tế của các bước có thể khác nhau. Ví dụ: người dùng sẽ không được yêu cầu chọn chứng chỉ nếu chính sách doanh nghiệp tự động chọn chứng chỉ được sử dụng (xem AutoSelectCertificateForUrls và Chính sách của Chrome dành cho người dùng).

Trong Tiện ích, điều này có thể giống như đoạn mã sau:

function collectAvailableCertificates() {
  // Return all certificates that this Extension can currently provide.
  // For example:
  return [{
    certificateChain: [new Uint8Array(...)],
    supportedAlgorithms: ['RSASSA_PKCS1_v1_5_SHA256']
  }];
}

// The Extension calls this function every time the currently available list of
// certificates changes, and also once after the Extension's initialization.
function onAvailableCertificatesChanged() {
  browser.certificateProvider.setCertificates({
    clientCertificates: collectAvailableCertificates()
  });
}

function handleCertificatesUpdateRequest(request) {
  // Report the currently available certificates as a response to the request
  // event. This is important for supporting the case when the Extension is
  // unable to detect the changes proactively.
  browser.certificateProvider.setCertificates({
    certificatesRequestId: request.certificatesRequestId,
    clientCertificates: collectAvailableCertificates()
  });
}

// Returns a private key handle for the given DER-encoded certificate.
// |certificate| is an ArrayBuffer.
function getPrivateKeyHandle(certificate) {...}

// Digests and signs |input| with the given private key. |input| is an
// ArrayBuffer. |algorithm| is an Algorithm.
// Returns the signature as ArrayBuffer.
function signUnhashedData(privateKey, input, algorithm) {...}

function handleSignatureRequest(request) {
  // Look up the handle to the private key of |request.certificate|.
  const key = getPrivateKeyHandle(request.certificate);
  if (!key) {
    // Handle if the key isn't available.
    console.error('Key for requested certificate no available.');

    // Abort the request by reporting the error to the API.
    browser.certificateProvider.reportSignature({
      signRequestId: request.signRequestId,
      error: 'GENERAL_ERROR'
    });
    return;
  }

  const signature = signUnhashedData(key, request.input, request.algorithm);
  browser.certificateProvider.reportSignature({
    signRequestId: request.signRequestId,
    signature: signature
  });
}

browser.certificateProvider.onCertificatesUpdateRequested.addListener(
    handleCertificatesUpdateRequest);
browser.certificateProvider.onSignatureRequested.addListener(
    handleSignatureRequest);

Loại

Algorithm

Chrome 86 trở lên browser.* kể từ Chrome 148

Các loại thuật toán chữ ký mật mã được hỗ trợ.

Enum

"RSASSA_PKCS1_v1_5_MD5_SHA1"
Chỉ định thuật toán chữ ký RSASSA PKCS#1 v1.5 với hàm băm MD5-SHA-1. Tiện ích không được thêm tiền tố DigestInfo mà chỉ thêm khoảng đệm PKCS#1. Thuật toán này không còn được dùng nữa và Chrome sẽ không bao giờ yêu cầu thuật toán này kể từ phiên bản 109.

"RSASSA_PKCS1_v1_5_SHA1"
Chỉ định thuật toán chữ ký RSASSA PKCS#1 phiên bản 1.5 bằng hàm băm SHA-1.

"RSASSA_PKCS1_v1_5_SHA256"
Chỉ định thuật toán chữ ký RSASSA PKCS#1 v1.5 bằng hàm băm SHA-256.

"RSASSA_PKCS1_v1_5_SHA384"
Chỉ định thuật toán chữ ký RSASSA PKCS#1 phiên bản 1.5 bằng hàm băm SHA-384.

"RSASSA_PKCS1_v1_5_SHA512"
Chỉ định thuật toán chữ ký RSASSA PKCS#1 phiên bản 1.5 bằng hàm băm SHA-512.

"RSASSA_PSS_SHA256"
Chỉ định thuật toán chữ ký RSASSA PSS bằng hàm băm SHA-256, hàm tạo mặt nạ MGF1 và muối có cùng kích thước với hàm băm.

"RSASSA_PSS_SHA384"
Chỉ định thuật toán chữ ký RSASSA PSS bằng hàm băm SHA-384, hàm tạo mặt nạ MGF1 và muối có cùng kích thước với hàm băm.

"RSASSA_PSS_SHA512"
Chỉ định thuật toán chữ ký RSASSA PSS bằng hàm băm SHA-512, hàm tạo mặt nạ MGF1 và muối có cùng kích thước với hàm băm.

CertificateInfo

Thuộc tính

  • chứng chỉ

    ArrayBuffer

    Phải là mã hoá DER của chứng chỉ X.509. Hiện tại, chúng tôi chỉ hỗ trợ chứng chỉ của khoá RSA.

  • supportedHashes

    Phải được đặt thành tất cả hàm băm được hỗ trợ cho chứng chỉ này. Tiện ích này sẽ chỉ được yêu cầu chữ ký của các bản tóm tắt được tính toán bằng một trong các thuật toán băm này. Thứ tự này phải theo thứ tự ưu tiên băm giảm dần.

CertificatesUpdateRequest

Chrome 86 trở lên browser.* kể từ Chrome 148

Thuộc tính

  • certificatesRequestId

    số

    Giá trị nhận dạng yêu cầu được truyền đến setCertificates.

ClientCertificateInfo

Chrome 86 trở lên browser.* kể từ Chrome 148

Thuộc tính

  • certificateChain

    ArrayBuffer[]

    Mảng phải chứa mã hoá DER của chứng chỉ ứng dụng X.509 làm phần tử đầu tiên.

    Tệp này phải chứa đúng một chứng chỉ.

  • supportedAlgorithms

    Tất cả thuật toán được hỗ trợ cho chứng chỉ này. Tiện ích sẽ chỉ được yêu cầu chữ ký bằng một trong các thuật toán này.

Error

Chrome 86 trở lên browser.* kể từ Chrome 148

Các loại lỗi mà tiện ích có thể báo cáo.

Giá trị

"GENERAL_ERROR"

Hash

Không dùng nữa. Được thay thế bằng Algorithm.

Enum

"MD5_SHA1"
Chỉ định thuật toán băm MD5 và SHA1.

"SHA1"
Chỉ định thuật toán băm SHA1.

"SHA256"
Chỉ định thuật toán băm SHA256.

"SHA384"
Chỉ định thuật toán băm SHA384.

"SHA512"
Chỉ định thuật toán băm SHA512.

PinRequestErrorType

Chrome 57 trở lên browser.* kể từ Chrome 148

Các loại lỗi có thể xuất hiện cho người dùng thông qua hàm requestPin.

Enum

"INVALID_PIN"
Cho biết mã PIN không hợp lệ.

"INVALID_PUK"
Cho biết mã PUK không hợp lệ.

"MAX_ATTEMPTS_EXCEEDED"
Chỉ định rằng số lần thử tối đa đã vượt quá.

"UNKNOWN_ERROR"
Chỉ định rằng lỗi không thể được biểu thị bằng các loại ở trên.

PinRequestType

Chrome 57 trở lên browser.* kể từ Chrome 148

Loại mã mà tiện ích yêu cầu bằng hàm requestPin.

Enum

"PIN"
Chỉ định mã được yêu cầu là mã PIN.

"PUK"
Chỉ định mã được yêu cầu là mã PUK.

PinResponseDetails

Chrome 57 trở lên browser.* kể từ Chrome 148

Thuộc tính

  • userInput

    chuỗi không bắt buộc

    Mã do người dùng cung cấp. Trống nếu người dùng đóng hộp thoại hoặc xảy ra một số lỗi khác.

ReportSignatureDetails

Chrome 86 trở lên browser.* kể từ Chrome 148

Thuộc tính

  • error

    "GENERAL_ERROR"
     không bắt buộc

    Lỗi xảy ra khi tạo chữ ký (nếu có).

  • signRequestId

    số

    Giá trị nhận dạng yêu cầu đã nhận được thông qua sự kiện onSignatureRequested.

  • Chữ ký

    Không bắt buộc ArrayBuffer

    Chữ ký, nếu được tạo thành công.

RequestPinDetails

Chrome 57 trở lên browser.* kể từ Chrome 148

Thuộc tính

  • attemptsLeft

    number không bắt buộc

    Số lần thử còn lại. Thông tin này được cung cấp để mọi giao diện người dùng đều có thể hiển thị thông tin này cho người dùng. Chrome không cần thực thi việc này, thay vào đó, tiện ích nên gọi stopPinRequest bằng errorType = MAX_ATTEMPTS_EXCEEDED khi vượt quá số lượng yêu cầu mã PIN.

  • errorType

    PinRequestErrorType không bắt buộc

    Mẫu lỗi hiển thị cho người dùng. Bạn nên đặt giá trị này nếu yêu cầu trước đó không thành công, để thông báo cho người dùng về lý do không thành công.

  • requestType

    PinRequestType không bắt buộc

    Loại mã được yêu cầu. Mã PIN là phương thức mặc định.

  • signRequestId

    số

    Mã nhận dạng do Chrome cung cấp trong SignRequest.

SetCertificatesDetails

Chrome 86 trở lên browser.* kể từ Chrome 148

Thuộc tính

  • certificatesRequestId

    number không bắt buộc

    Khi được gọi để phản hồi onCertificatesUpdateRequested, phải chứa giá trị certificatesRequestId đã nhận. Nếu không, bạn không nên đặt tham số này.

  • clientCertificates

    Danh sách chứng chỉ máy khách hiện có.

  • error

    "GENERAL_ERROR"
     không bắt buộc

    Lỗi xảy ra khi trích xuất chứng chỉ (nếu có). Lỗi này sẽ xuất hiện cho người dùng khi thích hợp.

SignatureRequest

Chrome 86 trở lên browser.* kể từ Chrome 148

Thuộc tính

  • thuật toán

    Thuật toán chữ ký sẽ được sử dụng.

  • chứng chỉ

    ArrayBuffer

    Mã hoá DER của chứng chỉ X.509. Tiện ích phải ký input bằng khoá riêng tư được liên kết.

  • input

    ArrayBuffer

    Dữ liệu cần ký. Xin lưu ý rằng dữ liệu này không được băm.

  • signRequestId

    số

    Giá trị nhận dạng yêu cầu được truyền đến reportSignature.

SignRequest

Thuộc tính

  • chứng chỉ

    ArrayBuffer

    Mã hoá DER của chứng chỉ X.509. Tiện ích phải ký digest bằng khoá riêng tư được liên kết.

  • chuỗi đại diện

    ArrayBuffer

    Bản tóm tắt phải được ký.

  • hàm băm

    Đề cập đến thuật toán băm được dùng để tạo digest.

  • signRequestId

    số

    Chrome 57 trở lên browser.* kể từ Chrome 148

    Mã nhận dạng duy nhất mà tiện ích sẽ sử dụng nếu cần gọi một phương thức yêu cầu mã nhận dạng đó, ví dụ: requestPin.

StopPinRequestDetails

Chrome 57 trở lên browser.* kể từ Chrome 148

Thuộc tính

  • errorType

    PinRequestErrorType không bắt buộc

    Mẫu lỗi. Nếu có, thông tin này sẽ hiển thị cho người dùng. Dùng để chứa lý do dừng luồng nếu nguyên nhân là do lỗi, ví dụ: MAX_ATTEMPTS_EXCEEDED.

  • signRequestId

    số

    Mã nhận dạng do Chrome cung cấp trong SignRequest.

Phương thức

reportSignature()

Chrome 86 trở lên browser.* kể từ Chrome 148
browser.certificateProvider.reportSignature(
  details: ReportSignatureDetails,
)
: Promise<void>

Phải được gọi để phản hồi onSignatureRequested.

Tiện ích phải gọi hàm này cho mọi sự kiện onSignatureRequested; quá trình triển khai API sẽ ngừng chờ lệnh gọi này sau một khoảng thời gian và phản hồi bằng lỗi hết thời gian chờ khi hàm này được gọi.

Thông số

Giá trị trả về

  • Promise<void>

    Chrome 96 trở lên browser.* kể từ Chrome 148

requestPin()

Chrome 57 trở lên browser.* kể từ Chrome 148
browser.certificateProvider.requestPin(
  details: RequestPinDetails,
)
: Promise<PinResponseDetails | undefined>

Yêu cầu người dùng cung cấp mã PIN. Mỗi lần, bạn chỉ được gửi một yêu cầu đang chờ xử lý. Các yêu cầu được đưa ra trong khi một quy trình khác đang diễn ra sẽ bị từ chối. Tiện ích có trách nhiệm thử lại sau nếu một quy trình khác đang diễn ra.

Thông số

  • chi tiết

    Chứa thông tin chi tiết về hộp thoại được yêu cầu.

Giá trị trả về

  • Promise<PinResponseDetails | undefined>

    Chrome 96 trở lên browser.* kể từ Chrome 148

    Trả về một Lời hứa sẽ được thực hiện khi người dùng cung cấp mã PIN. Từ chối kèm theo lỗi nếu yêu cầu hộp thoại không hoàn tất thành công (ví dụ: hộp thoại bị người dùng huỷ hoặc không được phép hiển thị).

setCertificates()

Chrome 86 trở lên browser.* kể từ Chrome 148
browser.certificateProvider.setCertificates(
  details: SetCertificatesDetails,
)
: Promise<void>

Đặt danh sách chứng chỉ để sử dụng trong trình duyệt.

Tiện ích phải gọi hàm này sau khi khởi chạy và mỗi khi có thay đổi trong tập hợp chứng chỉ hiện có. Tiện ích cũng phải gọi hàm này để phản hồi onCertificatesUpdateRequested mỗi khi nhận được sự kiện này.

Thông số

  • Chứng chỉ cần đặt. Chứng chỉ không hợp lệ sẽ bị bỏ qua.

Giá trị trả về

  • Promise<void>

    Chrome 96 trở lên browser.* kể từ Chrome 148

    Trả về một Lời hứa sẽ giải quyết khi hoàn tất.

stopPinRequest()

Chrome 57 trở lên browser.* kể từ Chrome 148
browser.certificateProvider.stopPinRequest(
  details: StopPinRequestDetails,
)
: Promise<void>

Dừng yêu cầu ghim do hàm requestPin bắt đầu.

Thông số

Giá trị trả về

  • Promise<void>

    Chrome 96 trở lên browser.* kể từ Chrome 148

    Trả về một Lời hứa sẽ được thực hiện khi yêu cầu đóng hộp thoại mã PIN hoàn tất.

Sự kiện

onCertificatesUpdateRequested

Chrome 86 trở lên browser.* kể từ Chrome 148
browser.certificateProvider.onCertificatesUpdateRequested.addListener(
  callback: function,
)

Sự kiện này được kích hoạt nếu chứng chỉ được đặt qua setCertificates không đủ hoặc trình duyệt yêu cầu thông tin cập nhật. Tiện ích phải gọi setCertificates bằng danh sách chứng chỉ đã cập nhật và certificatesRequestId đã nhận.

Thông số

onSignatureRequested

Chrome 86 trở lên browser.* kể từ Chrome 148
browser.certificateProvider.onSignatureRequested.addListener(
  callback: function,
)

Sự kiện này kích hoạt mỗi khi trình duyệt cần ký một thông báo bằng chứng chỉ do tiện ích này cung cấp thông qua setCertificates.

Tiện ích phải ký dữ liệu đầu vào từ request bằng thuật toán và khoá riêng tư thích hợp, đồng thời trả về dữ liệu đó bằng cách gọi reportSignature bằng signRequestId đã nhận được.

Thông số