browser.certificateProvider

Descrizione

Utilizza questa API per esporre i certificati alla piattaforma, che può utilizzarli per le autenticazioni TLS.

Autorizzazioni

certificateProvider

Disponibilità

Chrome 46 e versioni successive browser.* da Chrome 148 Solo ChromeOS

Concetti e utilizzo

L'utilizzo tipico di questa API per esporre i certificati client a ChromeOS prevede i seguenti passaggi:

  • L'estensione si registra per gli eventi onCertificatesUpdateRequested e onSignatureRequested.
  • L'estensione chiama setCertificates() per fornire l'elenco iniziale dei certificati dopo l'inizializzazione.
  • L'estensione monitora le modifiche nell'elenco dei certificati disponibili e chiama setCertificates() per informare il browser di ogni modifica.
  • Durante un TLS handshake, il browser riceve una richiesta di certificato client. Con un evento onCertificatesUpdateRequested, il browser chiede all'estensione di segnalare tutti i certificati che fornisce attualmente.
  • L'estensione invia un report con i certificati attualmente disponibili utilizzando il metodo setCertificates().
  • Il browser associa tutti i certificati disponibili alla richiesta di certificato client dall'host remoto. Le corrispondenze vengono presentate all'utente in una finestra di dialogo di selezione.
  • L'utente può selezionare un certificato e approvare o interrompere l'autenticazione.
Finestra di dialogo di selezione del certificato
Finestra di dialogo di selezione del certificato.
  • Se l'utente interrompe l'autenticazione o se nessun certificato corrisponde alla richiesta, l'autenticazione client TLS viene interrotta.
  • In caso contrario, se l'utente approva l'autenticazione con un certificato fornito da questa estensione, il browser richiede all'estensione di firmare i dati per continuare il TLS handshake. La richiesta viene inviata come evento onSignatureRequested.
  • Questo evento contiene i dati di input, dichiara l'algoritmo da utilizzare per generare la firma e fa riferimento a uno dei certificati segnalati da questa estensione. L'Estensione deve creare una firma per i dati forniti utilizzando la chiave privata associata al certificato di riferimento. La creazione della firma potrebbe richiedere l'aggiunta di un DigestInfo e il padding del risultato prima della firma effettiva.
  • L'estensione invia la firma al browser utilizzando il metodo reportSignature(). Se non è stato possibile calcolare la firma, il metodo deve essere chiamato senza firma.
  • Se la firma è stata fornita, il browser completa il TLS handshake.

La sequenza effettiva dei passaggi può essere diversa. Ad esempio, all'utente non verrà chiesto di selezionare un certificato se viene utilizzata la policy aziendale per la selezione automatica di un certificato (vedi AutoSelectCertificateForUrls e Policy di Chrome per gli utenti).

Nell'estensione, questo può essere simile allo snippet seguente:

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

Tipi

Algorithm

Chrome 86 e versioni successive browser.* da Chrome 148

Tipi di algoritmi di firma crittografica supportati.

Enum

"RSASSA_PKCS1_v1_5_MD5_SHA1"
Specifica l'algoritmo di firma RSASSA PKCS#1 v1.5 con l'hashing MD5-SHA-1. L'estensione non deve anteporre un prefisso DigestInfo, ma solo aggiungere la spaziatura interna PKCS#1. Questo algoritmo è deprecato e non verrà mai richiesto da Chrome a partire dalla versione 109.

"RSASSA_PKCS1_v1_5_SHA1"
Specifica l'algoritmo di firma RSASSA PKCS#1 v1.5 con la funzione hash SHA-1.

"RSASSA_PKCS1_v1_5_SHA256"
Specifica l'algoritmo di firma RSASSA PKCS#1 v1.5 con la funzione hash SHA-256.

"RSASSA_PKCS1_v1_5_SHA384"
Specifica l'algoritmo di firma RSASSA PKCS#1 v1.5 con la funzione di hashing SHA-384.

"RSASSA_PKCS1_v1_5_SHA512"
Specifica l'algoritmo di firma RSASSA PKCS#1 v1.5 con la funzione di hashing SHA-512.

"RSASSA_PSS_SHA256"
Specifica l'algoritmo di firma RSASSA PSS con la funzione hash SHA-256, la funzione di generazione della maschera MGF1 e il salt della stessa dimensione dell'hash.

"RSASSA_PSS_SHA384"
Specifica l'algoritmo di firma RSASSA PSS con la funzione di hashing SHA-384, la funzione di generazione della maschera MGF1 e il salt della stessa dimensione dell'hash.

"RSASSA_PSS_SHA512"
Specifica l'algoritmo di firma RSASSA PSS con la funzione hash SHA-512, la funzione di generazione della maschera MGF1 e il sale della stessa dimensione dell'hash.

CertificateInfo

Proprietà

  • certificato

    ArrayBuffer

    Deve essere la codifica DER di un certificato X.509. Al momento sono supportati solo i certificati delle chiavi RSA.

  • supportedHashes

    Deve essere impostato su tutti gli hash supportati per questo certificato. Questa estensione verrà richiesta solo per le firme dei digest calcolati con uno di questi algoritmi di hashing. L'ordine deve essere decrescente in base alla preferenza di hash.

CertificatesUpdateRequest

Chrome 86 e versioni successive browser.* da Chrome 148

Proprietà

  • certificatesRequestId

    numero

    Identificatore della richiesta da passare a setCertificates.

ClientCertificateInfo

Chrome 86 e versioni successive browser.* da Chrome 148

Proprietà

  • certificateChain

    ArrayBuffer[]

    L'array deve contenere la codifica DER del certificato client X.509 come primo elemento.

    Deve includere esattamente un certificato.

  • supportedAlgorithms

    Tutti gli algoritmi supportati per questo certificato. All'estensione verranno richieste solo le firme che utilizzano uno di questi algoritmi.

Error

Chrome 86 e versioni successive browser.* da Chrome 148

Tipi di errori che l'estensione può segnalare.

Valore

"GENERAL_ERROR"

Hash

Deprecato. Sostituito da Algorithm.

Enum

"MD5_SHA1"
Specifica gli algoritmi di hashing MD5 e SHA1.

"SHA1"
Specifica l'algoritmo di hashing SHA1.

"SHA256"
Specifica l'algoritmo di hashing SHA256.

"SHA384"
Specifica l'algoritmo di hashing SHA384.

"SHA512"
Specifica l'algoritmo di hashing SHA512.

PinRequestErrorType

Browser Chrome 57 e versioni successive .* da Chrome 148

I tipi di errori che possono essere presentati all'utente tramite la funzione requestPin.

Enum

"INVALID_PIN"
Specifica che il PIN non è valido.

"INVALID_PUK"
Specifica che il PUK non è valido.

"MAX_ATTEMPTS_EXCEEDED"
Specifica che è stato superato il numero massimo di tentativi.

"UNKNOWN_ERROR"
Specifica che l'errore non può essere rappresentato dai tipi precedenti.

PinRequestType

Browser Chrome 57 e versioni successive .* da Chrome 148

Il tipo di codice richiesto dall'estensione con la funzione requestPin.

Enum

"PIN"
Specifica che il codice richiesto è un PIN.

"PUK"
Specifica che il codice richiesto è un PUK.

PinResponseDetails

Browser Chrome 57 e versioni successive .* da Chrome 148

Proprietà

  • userInput

    stringa facoltativa

    Il codice fornito dall'utente. Vuoto se l'utente ha chiuso la finestra di dialogo o se si è verificato un altro errore.

ReportSignatureDetails

Chrome 86 e versioni successive browser.* da Chrome 148

Proprietà

  • errore

    "GENERAL_ERROR"
     facoltativo

    Errore che si è verificato durante la generazione della firma, se presente.

  • signRequestId

    numero

    Identificatore della richiesta ricevuto tramite l'evento onSignatureRequested.

  • firma

    ArrayBuffer facoltativo

    La firma, se generata correttamente.

RequestPinDetails

Browser Chrome 57 e versioni successive .* da Chrome 148

Proprietà

  • attemptsLeft

    number optional

    Il numero di tentativi rimanenti. Questo viene fornito in modo che qualsiasi UI possa presentare queste informazioni all'utente. Chrome non dovrebbe applicare questa regola, ma l'estensione dovrebbe chiamare stopPinRequest con errorType = MAX_ATTEMPTS_EXCEEDED quando viene superato il numero di richieste di PIN.

  • errorType

    Il modello di errore visualizzato dall'utente. Questo campo deve essere impostato se la richiesta precedente non è andata a buon fine, per informare l'utente del motivo dell'errore.

  • requestType

    PinRequestType facoltativo

    Il tipo di codice richiesto. Il valore predefinito è PIN.

  • signRequestId

    numero

    L'ID assegnato da Chrome in SignRequest.

SetCertificatesDetails

Chrome 86 e versioni successive browser.* da Chrome 148

Proprietà

  • certificatesRequestId

    number optional

    Se viene chiamato in risposta a onCertificatesUpdateRequested, deve contenere il valore certificatesRequestId ricevuto. In caso contrario, non deve essere impostato.

  • clientCertificates

    Elenco dei certificati client attualmente disponibili.

  • errore

    "GENERAL_ERROR"
     facoltativo

    Errore che si è verificato durante l'estrazione dei certificati, se presente. Questo errore verrà mostrato all'utente quando appropriato.

SignatureRequest

Chrome 86 e versioni successive browser.* da Chrome 148

Proprietà

  • algoritmo

    Algoritmo di firma da utilizzare.

  • certificato

    ArrayBuffer

    La codifica DER di un certificato X.509. L'estensione deve firmare input utilizzando la chiave privata associata.

  • input

    ArrayBuffer

    Dati da firmare. Tieni presente che i dati non sono sottoposti ad hashing.

  • signRequestId

    numero

    Identificatore della richiesta da passare a reportSignature.

SignRequest

Proprietà

  • certificato

    ArrayBuffer

    La codifica DER di un certificato X.509. L'estensione deve firmare digest utilizzando la chiave privata associata.

  • digest

    ArrayBuffer

    Il digest che deve essere firmato.

  • hash

    Si riferisce all'algoritmo di hashing utilizzato per creare digest.

  • signRequestId

    numero

    Browser Chrome 57 e versioni successive .* da Chrome 148

    L'ID univoco che deve essere utilizzato dall'estensione se deve chiamare un metodo che lo richiede, ad esempio requestPin.

StopPinRequestDetails

Browser Chrome 57 e versioni successive .* da Chrome 148

Proprietà

  • errorType

    Il modello di errore. Se presente, viene mostrato all'utente. Destinato a contenere il motivo dell'interruzione del flusso se è stato causato da un errore, ad esempio MAX_ATTEMPTS_EXCEEDED.

  • signRequestId

    numero

    L'ID assegnato da Chrome in SignRequest.

Metodi

reportSignature()

Chrome 86 e versioni successive browser.* da Chrome 148
browser.certificateProvider.reportSignature(
  details: ReportSignatureDetails,
)
: Promise<void>

Deve essere chiamato in risposta a onSignatureRequested.

L'estensione deve infine chiamare questa funzione per ogni evento onSignatureRequested; l'implementazione dell'API smetterà di attendere questa chiamata dopo un po' di tempo e risponderà con un errore di timeout quando questa funzione viene chiamata.

Parametri

Resi

  • Promise<void>

    Browser Chrome 96+ .* da Chrome 148

requestPin()

Browser Chrome 57 e versioni successive .* da Chrome 148
browser.certificateProvider.requestPin(
  details: RequestPinDetails,
)
: Promise<PinResponseDetails | undefined>

Richiede il PIN all'utente. È consentita una sola richiesta in corso alla volta. Le richieste inviate mentre è in corso un altro flusso vengono rifiutate. È responsabilità dell'estensione riprovare più tardi se è in corso un altro flusso.

Parametri

  • Contiene i dettagli della finestra di dialogo richiesta.

Resi

  • Promise<PinResponseDetails | undefined>

    Browser Chrome 96+ .* da Chrome 148

    Restituisce una promessa che si risolve quando il PIN viene fornito dall'utente. Rifiuta con un errore se la richiesta della finestra di dialogo non va a buon fine (ad esempio, la finestra di dialogo è stata annullata dall'utente o non è stato consentito mostrarla).

setCertificates()

Chrome 86 e versioni successive browser.* da Chrome 148
browser.certificateProvider.setCertificates(
  details: SetCertificatesDetails,
)
: Promise<void>

Imposta un elenco di certificati da utilizzare nel browser.

L'estensione deve chiamare questa funzione dopo l'inizializzazione e a ogni modifica dell'insieme di certificati attualmente disponibili. L'estensione deve chiamare questa funzione anche in risposta a onCertificatesUpdateRequested ogni volta che viene ricevuto questo evento.

Parametri

Resi

  • Promise<void>

    Browser Chrome 96+ .* da Chrome 148

    Restituisce una promessa che viene risolta al completamento.

stopPinRequest()

Browser Chrome 57 e versioni successive .* da Chrome 148
browser.certificateProvider.stopPinRequest(
  details: StopPinRequestDetails,
)
: Promise<void>

Interrompe la richiesta di PIN avviata dalla funzione requestPin.

Parametri

  • Contiene i dettagli sul motivo dell'interruzione del flusso di richieste.

Resi

  • Promise<void>

    Browser Chrome 96+ .* da Chrome 148

    Restituisce una Promise che si risolve quando la richiesta di chiusura della finestra di dialogo del PIN è completata.

Eventi

onCertificatesUpdateRequested

Chrome 86 e versioni successive browser.* da Chrome 148
browser.certificateProvider.onCertificatesUpdateRequested.addListener(
  callback: function,
)

Questo evento viene attivato se i certificati impostati tramite setCertificates non sono sufficienti o se il browser richiede informazioni aggiornate. L'estensione deve chiamare setCertificates con l'elenco aggiornato dei certificati e il certificatesRequestId ricevuto.

Parametri

onSignatureRequested

Chrome 86 e versioni successive browser.* da Chrome 148
browser.certificateProvider.onSignatureRequested.addListener(
  callback: function,
)

Questo evento viene attivato ogni volta che il browser deve firmare un messaggio utilizzando un certificato fornito da questa estensione tramite setCertificates.

L'estensione deve firmare i dati di input di request utilizzando l'algoritmo e la chiave privata appropriati e restituirli chiamando reportSignature con il signRequestId ricevuto.

Parametri