2008-08-26 10 views
9

Je veux faire ce que fait myopenid - une fois que vous avez ouvert une session, vous pouvez cliquer sur un bouton qui vous génère un certificat SSL; le navigateur télécharge alors ce certificat et le stocke. Lorsque vous revenez plus tard sur yourid.myopenid.com, votre navigateur peut utiliser son certificat stocké pour l'authentification afin que vous n'ayez jamais besoin d'un mot de passe.Comment prendre en charge l'authentification par certificat client SSL?

Donc, mes questions sont ce qui est nécessaire pour que cela fonctionne? Comment puis-je générer des certificats? Comment puis-je les valider une fois qu'ils me sont présentés?

Ma pile est Rails sur Apache en utilisant Passenger, mais je ne suis pas trop particulier.

Répondre

8

Ils sont généralement appelés certificats côté client.

Je ne l'ai pas réellement utilisé mais une version modifiée de reposful-authentification peut être trouvée ici here qui ressemble à ce que votre après.

Je trouve cela via Dr. Nic's post

2

Cela dépend sur le serveur, mais la solution la plus simple que je connaisse, en utilisant Apache:

FakeBasicAuth

« Lorsque cette option est activée, le Le nom distinctif (DN) du client Le certificat X509 est traduit en un nom d'utilisateur HTTP Basic Authorization, ce qui signifie que les méthodes d'authentification Apache standard peuvent être utilisées pour le contrôle d'accès. Le nom d'utilisateur est juste l'objet du certificat X509 du client (peut être déterminé en exécutant la commande openssl x509 d'OpenSSL: openssl x509 -noout -subject -in certificate.crt). Notez qu'aucun mot de passe est obtenu à partir de l'utilisateur ... "

ne suis pas sûr rails, mais la variable d'environnement REMOTE_USER habituelle doit être accessible en quelque sorte.

1

Si vous souhaitez générer des certificats, vous avez besoin pour que le client génère une paire de clés et vous envoie au moins la clé publique.Vous pouvez le faire dans Firefox via un appel Javascript, c'est crypto.generateCRMFRequest Je suppose qu'il existe des méthodes spécifiques au navigateur disponibles dans d'autres navigateurs. Premièrement, vous devez déterminer comment émettre un certificat une fois que vous obtenez une clé publique

Vous pourriez écrire quelque chose sur le serveur. avec OpenSSL, mais il a un support intégré pour les CSR, pas le format CRMF que Firefox vous enverra. Vous aurez donc besoin d'écrire du code pour convertir le CRMF en un CSR, ce qui nécessitera une sorte de capacité de traitement DER & hellip; Je suis juste en train de gratter la surface ici — l'exploitation d'un CA, même pour une application de jouet, n'est pas trivial.

Les solutions SSO telles que les solutions OpenId et PKI se chevauchent et l'élégance de l'infrastructure à clé publique (PKI). Mais le diable est dans les détails, et il y a de bonnes raisons pour lesquelles cette approche existe depuis longtemps mais a seulement pris son envol dans les applications gouvernementales et militaires.

Si cela vous intéresse, répondez à quelques questions spécifiques à la plate-forme sur laquelle vous souhaitez développer votre service CA.

+0

Vous pouvez simplement utiliser l'élément keygen à la place, http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#the-keygen-element – hendry

0

J'ai travaillé sur une solution à ce problème. Je voulais faire la même chose et je sais que beaucoup d'autres propriétaires de sites Web veulent cette fonctionnalité, avec ou sans un fournisseur tiers.

J'ai créé la configuration de serveur nécessaire et un plugin firefox pour gérer l'authentification par certificat. Allez sur mypassfree.com pour récupérer le plugin gratuit de Firefox. Email moi (lien sur cette page) pour la configuration du serveur car je ne l'ai pas encore empaqueté avec un bon installateur.

configuration du serveur est Apache2 + OpenSSL + Perl (mais vous pouvez réécrire les scripts perl dans toutes les langues)

Jonathan

0

Vous pouvez générer un certificat en utilisant le code spécifique à navigateur du navigateur du client. Voir this question

Vous pouvez également générer des certificats client SSL côté serveur en utilisant OpenSSL dans Ruby (see this q). (Cela fonctionnera dans n'importe quel navigateur sans code spécifique au navigateur, mais votre serveur aura généré la clé privée du client, ce qui n'est pas idéal pour les puristes crypto.)

Quelle que soit la méthode utilisée pour les générer, vous devrez configurez votre serveur Web pour exiger les certificats client. Voir the Apache docs pour un exemple.

+0

génération CSR (ou équivalent) fonctionne dans la plupart des navigateurs populaires (IE, FF, Chrome, ...), mais le code a tendance à être spécifique au navigateur. Voir cette réponse: http://stackoverflow.com/a/9198400/372643 – Bruno

+0

Bonne réponse, Bruno - Je pense que c'est une meilleure réponse à ce q que tout le monde ici :-) – Rich

Questions connexes