Personal Security Manager 1.0

API Javascript pour Client Certificate Management

Version 0.3 – 27/10/1999
Commentaires : psmfeedback@netscape.com

Ce document décrit une nouvelle interface API JavaScript pour les opérations de gestion de certificats utilisateur dans un client. JavaScript s'exécute dans le contexte d'une page web gérée par une autorité de certification (AC) ou autorité d'enregistrement (AE). L'interface API permet à l'AC ou l'AE d'indiquer au client d'effectuer des opérations PKI telles que la génération de clés, la création de demandes de certificat, le dépôt de clés sous conditions, l'importation de certificats utilisateur, la récupération de clés et les demandes de révocation.

Ces propriétés et méthodes reflètent le comportement actuel de Personal Security Manager 1.0.

Les messages importés ou générés par ces méthodes JavaScript sont définis dans les projets Internet CRMF, CMMF, et CMC.

Présentation du processus d'émission d'un nouveau certificat

  1. L'utilisateur remplit le formulaire d'inscription
  2. L'action de l'utilisateur lance un script
  3. Le script lance une méthode de génération de clé
  4. Les clés de signature et de chiffrement sont générées
  5. La clé de chiffrement privée est associée avec la clé publique de l'autorité de récupération de clé (ARC) (transmise sous la forme d'un certificat dans le cadre du script et comparée à une copie préinstallée du certificat dans la base de données locale de certificats)
  6. Les clés publiques, la clé de chiffrement privée associée et la chaîne de texte du script (contenant probablement des informations de nom ou d'inscription) sont signées par l'utilisateur
  7. Le blob signé est renvoyé au script
  8. Le script envoie le blob signé et d'autres informations nécessaires à l'AC/AE
  9. L'AC/AE vérifie la signature du blob
  10. L'AC/AE valide l'identité de l'utilisateur
  11. L'AC/AE envoie la clé de chiffrement privée associée à l'ARC
  12. L'ARC renvoie la vérification d'entiercement à l'AC
  13. L'AC crée et signe les certificats
  14. L'AC renvoie les certificats à Communicator

API JavaScript

Propriétés

crypto.algorithms.dh.keySizes
crypto.algorithms.dsa.keySizes
crypto.algorithms.rsa.signing.keySizes
crypto.algorithms.rsa.keyEx.keySizes

keySizes est un tableau décrivant les tailles de clés disponibles pour les opérations et algorithmes particuliers.

Le tableau suivant décrit les tailles de clés prises en charge dans les versions américaine et internationale de Communicator.
 
AlgorithmeTailles de clés de la version américaineTailles de clés de la version internationale
Signature DSA uniquement1024, 20481024, 2048
Signature RSA uniquement1024, 20481024, 2048
Chiffrement RSA uniquement1024, 2048512,1024
Double utilisation de RSA pour la signature et le chiffrement1024, 2048512,1024
Echange de clés DH1024, 2048512,1024

Méthodes

generateCRMFRequest()

crmfObject = crypto.generateCRMFRequest("requestedDN", "regToken", "authenticator","escrowAuthorityCert", "KeyGen Done Code",keySize1, "keyParams1", "keyGenAlg1",..., keySizeN, "keyParamsN", "keyGenAlgN");

Cette méthode génèrera une séquence de requêtes CRMF avec N requêtes. Une requête correspond à chaque biclé générée. Les trois premiers paramètres seront appliqués à chaque requête. Le paramètre "escrowAuthorityCert" ne sera utilisé que pour les requêtes relatives à une clé entiercée. Après le paramètre "escrowAuthorityCert", la méthode utilise du code JavaScript exécuté une fois la requête CRMF prête. Enfin, il existe un ou plusieurs ensembles d'arguments de génération de clés. Chaque génération de clés sera associée à sa propre requête. Toutes les requêtes auront le même DN.
 
ArgumentDescription
"requestedDN"DN formaté RFC1485 à inclure dans la demande de certificat.
"regToken"Valeur utilisée pour authentifier l'utilisateur auprès de l'AC/AE.
"authenticator"Valeur permettant d'authentifier l'utilisateur à l'avenir en cas de non-disponibilité de sa clé privée. Peut être utilisée pour les demandes de révocation ou de récupération de clé.
"escrowAuthorityCert"Si cette valeur est égale à NULL, aucun dépôt de clé ne sera effectué. Cete valeur spécifie le certificat KRA à utiliser pour associer la clé privée entiercée. L'utilisateur sera invité à confirmer à chaque entiercement d'une clé. Seules les clés d'échange seront entiercées. Si une clé à double utilisation est générée, elle ne sera pas entiercée. La valeur de cet argument est un certificat encodé base-64.
"CRMF Generation Done Code"Ce paramètre est un code JavaScript à exécuter une fois la génération CRMF terminée. 
keySizeNTaille en bits de la Nème clé à générer
"keyParamsN"Cette chaîne est une valeur de paramètre facultative dépendant de l'algorithme. Pour Diffie-Hellman, elle est utilisée pour spécifier les paramètres p et g. Pour DSA, elle permet de spécifier pqg. Si la génération de clé nécessite des paramètres et que la valeur transmise est égale à NULL, le client génèrera les paramètres lui-même. Cette valeur est actuellement ignorée.
"keyGenAlgN"Algorithme pris en charge par la clé générée. Les valeurs acceptables sont les suivantes (les valeurs mentionnées pour keyUsage concernent la valeur keyUsage de l'extension de certificat finalement comprise dans le certificat émis) : 
  • "rsa-ex" - génère une clé RSA pour l'échange de clé uniquement (définira keyEncipherment pour keyUsage.)
  • "rsa-dual-use" - génère une clé RSA unique pour la signature et le chiffrement. Cela définira digitalSignature et nonRepudiation pour keyUsage.
  • "rsa-sign" - génère une clé RSA pour la signature uniquement. Cela définira digitalSignature pour keyUsage.
  • "rsa-nonrepudiation" - génère une clé RSA unique pour nonRepudiation uniquement.Cela définira non-repudiation pour keyUsage.
  • "rsa-sign-nonrepudiation" - génère une clé RSA unique pour la signature et nonRepudiation. Cela définira digitalSignature et nonRepudiation pour keyUsage.
  • "dsa-sign" - génère une clé DSA pour la signature uniquement. Cela définira digitalSignature pour keyUsage.
  • "dsa-nonrepudiation" - génère une clé DSA unique pour nonRepudiation. Cela définira nonRepudiation pour keyUsage.
  • "dsa-sign-nonrepudiation" - génère une clé DSA unique pour la signature et la non-répudiation.Cela définira digitalSignature et nonRepudiation pour keyUsage.

La méthode generateCRMFRequest() présentera une boîte de dialogue de génération de clé à l'utilisateur. Elle décrit le processus de génération de clé et permet à l'utilisateur d'annuler l'opération.

La méthode generateCRMFRequest() renverra une instance d'un objet CRMF. Le code JavaScript transmis comme paramètre "CRMF Generation Done Code" doit se baser sur l'attribut requête de l'objet renvoyé pour obtenir les résultats de la génération CRMF.

La chaîne trouvée en accédant à crmfObject.request est le message CRMF encodé base-64 à envoyer à l'AC/AE ou une chaîne d'erreur. Les chaînes d'erreur possibles sont les suivantes :
 
Chaîne d'erreurDescription
"error:invalidParameter:XXX"La valeur du paramètre XXX n'était pas valide.
"error:userCancel"L'utilisateur a annulé l'opération de génération de clé
"error:internalError"Le logiciel a rencontré une erreur interne, comme une insuffisance de mémoire

importUserCertificates()

resultString = crypto.importUserCertificates("chaînePseudonyme","chaîneCert",allowBackup)
 
 
ArgumentDescription
"chaînePseudonyme"Pseudonyme utilisé pour décrire le certificat dans l'interface de gestion de certificats du client. Il doit servir d'identification unique du certificat à l'utilisateur. Par exemple, "ID numérique VeriSign de classe 3 de Jean Dupont" ou "Certificat ID Ford de Jean Dupont". Toutefois, si ce certificat a le même DN qu'un ou plusieurs certificats existants du répertoire de certificats de l'utilisateur, le pseudonyme associé aux certificats ayant le même DN dans le répertoire de certificats est utilisé et le paramètre "chaînePseudonyme" ignoré. Si la chaîne est nulle et qu'aucun certificat avec le même DN n'existe dans le répertoire de certificats de l'utilisateur, Personal Security Manager attribue le pseudonyme comme suit :<Nom commun> <Nom de l'émetteur> ID.
"chaîneRépCert"Cette chaîne est la réponse de certification CMMF de l'AC contenant les certificats de l'utilisateur. La réponse est encodée base-64.
allowBackupArgument booléen. Il permet à l'AC ou à l'AE d'indiquer au client s'il doit forcer l'utilisateur à sauvegarder un certificat nouvellement émis (PKCS #12).

La méthode importUserCertificates() permet d'importer les certificats nouvellement émis pour l'utilisateur. La clé privée des certificats doit déjà résider dans la base de données de clés privées personnelles de l'utilisateur.

L'ID de requête de la réponse importée doit correspondre à celle de la demande de certification ou de récupération associée.

Si l'opération d'importation réussit, une chaîne vide sera renvoyée. Dans le cas contraire, l'une des chaînes d'erreur suivantes s'affiche :
 
 
Chaîne d'erreurDescription
"error:userCancel"L'utilisateur a annulé l'opération d'importation
"error:invalidCertificate"L'un des certificats a été incorrectement formaté
"error:internalError"Le logiciel a rencontré une erreur interne, comme une insuffisance de mémoire
"error:invalidRequestID"L'ID de requête du message de réponse ne correspond à aucune requête en cours

popChallengeResponse()

resultString = crypto.popChallengeResponse("chaîneDemandeAccès");
 
ArgumentDescription
"chaîneDemandeAccès"Message POPODecKeyChallContent CMMF encodé base-64. La mise en œuvre actuelle n'est pas conforme à celle définie dans le projet CMMF et nous avons l'intention de la remplacer par celle définie dans le RFC CMC.Voir ci-dessous pour la mise en œuvre actuelle.

La chaîne resultString sera un message POPODecKeyRespContent encodé base-64 ou l'une des chaînes d'erreur suivantes :
 
 
Chaîne d'erreurDescription
"error:invalidParameter:XXX"La valeur du paramètre XXX n'était pas valide.
"error:internalError"Le logiciel a rencontré une erreur interne, comme une insuffisance de mémoire

Preuve de possession - réponse à la demande d'accès

Résultats prévus :

POPODecKeyChallContent ::= SEQUENCE OF Challenge
    -- Une demande d'accès par demande de certification de clé de chiffrement (dans
    -- l'ordre d'apparition de ces demandes dans FullCertTemplates).

Challenge ::= SEQUENCE {
      owf                AlgorithmIdentifier  OPTIONAL,
      -- DOIT être présent dans la première tentative d'accès ; PEUT être omis
      -- dans les tentatives ultérieures de POPODecKeyChallContent(le cas échéant,
      -- la fonction unidirectionnelle utilisée dans la tentative immédiatement précédente
      -- doit être utilisée).
      witness            OCTET STRING,
      -- le résultat de l'application d'une fonction unidirectionnelle (owf) à un
      -- ENTIER généré de manière aléatoire, A. [Notez qu'un
      -- ENTIER différent DOIT être utilisé pour chaque tentative d'accès.]
      sender             GeneralName,
      -- nom de l'expéditeur.
      key                OCTET STRING,
      -- clé publique utilisée pour chiffrer la tentative d'accès. Elle permet au
      -- client de trouver la clé appropriée pour le chiffrement.
      challenge          OCTET STRING
      -- chiffrement (à l'aide de la clé publique sur laquelle porte
      -- la demande de cert.) de Rand, où Rand est spécifié comme
      --   Rand ::= SEQUENCE{
      --     int      INTEGER,
      --      - l'ENTIER généré de manière aléatoire A (ci-dessus)
      --     senderHash  OCTET STRING
      --      - le résultat de l'application de la fonction unidirectionnelle (owf)
      --      - au nom général de l'expéditeur
      --   }
      -- La taille de "int" doit être suffisamment réduite pour que "Rand" puisse être
      -- contenu dans un seul bloc de chiffrement PKCS #1.
  }

© Copyright 1999 Netscape Communications Corporation