Génération de certificats côté client dans le navigateur et signature sur le serveur

est-il possible de demander la génération du clavier client dans le navigateur et d'envoyer la clé publique au serveur CA à signer de manière transparente? Puis installer le certificat signé dans le navigateur de l'utilisateur?

Scénario:

  1. L'utilisateur ouvre https://examle.com/ page web, l'identité du serveur est vérifiée
  2. L'utilisateur demande la création d'un compte
  3. clavier généré dans le navigateur de l'utilisateur et non révélé au serveur / CA
  4. Pubkey est envoyer au serveur pour la signature
  5. le serveur signe la clé et génère le certificat
  6. Certificat est envoyé au client et installé dans le navigateur avec la clé privée

la prochaine fois que le client se connecte au serveur, son identité est vérifiée en fonction du certificat client.

ce serait bien si le serveur pouvait forcer le client à protéger sa clé privée en utilisant le cryptage par mot de passe.

j'ai vu des services bancaires en ligne utilisant java applet pour cela tâche. Est-il possible de le faire en utilisant des capacités natives du navigateur? Apache / PHP ou Node.js solution serait la bienvenue.

15
demandé sur Kitten 2012-02-08 20:32:51

1 réponses

Oui, c'est possible. Il n'y a cependant pas de solution de navigation croisée.

  • pour Internet Explorer, vous devrez utiliser certains contrôles ActiveX en utilisant X509Enrollment.CX509EnrollmentWebClassFactory ou CEnroll.CEnroll, selon Qu'il tourne sur Windows XP ou Vista/7. Cela générera une demande de certificat PKCS#10 (que vous devrez peut-être envelopper entre les délimiteurs traditionnels).
  • pour le reste, vous devriez pouvoir utiliser le <keygen /> balise. C'est une balise legacy Netscape, pas officiellement HTML avant, mais il a fait en HTML 5 (bien que les MS aient dit qu'ils ne le supporteraient pas dans leurs implémentations). Cela générera une structure SPKAC (semblable à un CSR).
  • pour Firefox (bien qu'il supporte keygen), vous pouvez utiliser le crmf functions.

Voici un exemple de script cela devrait faire la plus grande partie du travail pour ActiveX ou Keygen.

lorsque le serveur envoie un certificat en retour (éventuellement plus tard), le navigateur devrait l'importer dans son magasin et de l'associer avec la clé privée qu'il a suscité au moment de la demande.

la façon dont la clé privée est protégée dépendra du navigateur ou du mécanisme de stockage de certificats sous-jacent. Dans Firefox, il devrait y avoir un mot de passe maître sur le dispositif de sécurité, par exemple.

côté serveur, vous pouvez implémenter votre propre CA en utilisant divers outils. OpenSSL et BouncyCastle peuvent gérer PKCS#10 et SPKAC. Voici un à base de BouncyCastle exemple (associé au script ci-dessus), et un peu de code pour CRMF.

si vous voulez une solution prête à l'emploi, vous pourriez être intéressé par quelque chose comme OpenCA.

16
répondu Bruno 2012-02-08 17:28:41