web-dev-qa-db-fra.com

Architectures pour accéder à la Smart Card à partir d'un navigateur générique? Ou: Comment combler l'écart entre le navigateur et la pile PC / SC?

Quelles sont les architectures côté client possibles pour accéder à une carte à puce locale à partir d'un navigateur générique (connecté à un serveur via http (s)), de préférence à partir de Javascript, avec le minimum de tracas d'installation pour l'utilisateur final? Le serveur doit être en mesure d'émettre au moins des APDU de son choix à la carte (ou peut-être en déléguer une partie au code côté client qu'il génère). J'assume la disponibilité du côté client d'une pile PC/SC fonctionnelle, avec lecteur de carte à puce. C'est une hypothèse raisonnable au moins sur Windows depuis XP, OS X moderne et Unixes.

Jusqu'à présent, j'ai identifié les options suivantes:

  1. Certains ActiveX personnalisés. C'est ce que mon application existante utilise (nous l'avons développée en interne), le déploiement est assez facile pour les clients avec IE une fois qu'ils ont l'autorisation d'installer ActiveX, mais il ne correspond pas au "générique") navigateur ".
    Mise à jour : ActiveX est principalement pris en charge par l'IE obsolète, y compris IE11; mais pas par Edge.
  2. Certaines extensions de navigateur PC/SC utilisant l'API Netscape Plugin, ce qui semble être une extension fluide de ce qui précède. La seule clé prête à l'emploi que j'ai localisée est SConnect , mais il semble à peine vivant , son API documentation (webarchive) n'est plus officiellement disponible, et il a des liens étroits avec un fournisseur particulier de cartes à puce. Le principe est peut-être Nice, mais créer un tel plugin pour chaque plate-forme serait beaucoup de travail.
    Mise à jour : la prise en charge NPAPI est supprimée par de nombreux navigateurs, y compris Chrome et Firefox.
  3. A Java Applet, fonctionnant au-dessus de la JVM (1.) 6 d'Oracle ou mieux, fournie avec javax.smartcardio . C'est bien d'un point de vue fonctionnel, bien documenté, je peux vivre avec les quelques bugs connus, mais j'ai peur d'une spirale descendante irrésistible concernant l'acceptation de Java en tant qu'extension de navigateur.

Une autre idée?

Aussi: existe-t-il un moyen d'empêcher l'utilisation abusive de l'interface PC/SC du navigateur par un serveur escroc (par exemple, présenter 3 codes PIN incorrects pour bloquer une carte, juste pour la méchanceté de celle-ci; ou faire des choses encore plus mauvaises).

50
fgrieu

Mise à jour (8/2016): Une nouvelle API pour le Web appelée API WebUSB est en cours de discussion. Vous pouvez l'utiliser déjà avec Chrome v54 + .

Cette norme sera mise en œuvre dans tous les principaux navigateurs et remplacera la nécessité d'applications ou d'extensions tierces pour les cartes Smard :-)

La nouvelle réponse est donc OUI!

Et la pile d'architecture de type OSI est:

Mise à jour 2019 : Comme l'a commenté @vlp, il semble que cela ne fonctionne pas dans Chrome parce qu'ils ont décidé de bloquer WebUSB pour les cartes à puce pour des raisons spécieuses :


Remarque: Google a annoncé qu'ils --- (abandonneront Chrome Apps en 2017.

Réponse précédente :

Maintenant (2015), vous pouvez créer une application Google Chrome, en utilisant chrome.usb API .

Vous accédez ensuite au lecteur de carte à puce via son interface compatible CCID .

Ce n'est pas multi-navigateur mais JavaScript programmable et multi-plateforme.

Quoi qu'il en soit, l'API Netscape Plugin (NPAPI) n'est plus prise en charge par les navigateurs modernes. Et Java sont rejetées par les fournisseurs de navigateurs.

23
Supersharp

Le fait est que les navigateurs ne peuvent pas parler aux cartes à puce (cryptographiques) à d'autres fins que l'établissement de SSL.

Vous devez avoir besoin d'un code supplémentaire, exécuté par le navigateur, pour accéder aux cartes à puce.

Il existe des dizaines de plugins personnalisés et propriétaires (utilisant les trois options que vous avez mentionnées) à des fins diverses (la signature étant la plus populaire, je suppose) construits car il n'y a pas de méthode standard ou universellement acceptée, au moins en Europe et je suis sûr ailleurs ainsi que.

Créer, distribuer et maintenir le vôtre sera un plaisir, car les navigateurs sortent tous les mois environ et chaque nouvelle version change les astuces de sanboxing ir UI, vous devrez donc peut-être ajuster votre code assez souvent.

Et vous voudrez probablement avoir des capacités d'interface graphique, au moins pour demander la permission de l'utilisateur d'accéder à une carte ou à une fonctionnalité sur celle-ci.

Pour créer un plug-in de navigateur à plates-formes multiples, quelque chose comme firebreath pourrait être utilisé.

Personnellement, je ne pense pas que l'exposition de PC/SC au Web soit une bonne chose. PC/SC est par nature un protocole de bas niveau qui, lorsque vous l'exposez, pourrait également exposer l'accès de niveau bloc à votre disque et espérer que "les applications sur le Web sont les miennes uniquement et qu'elles se comportent bien" (cela devrait répondre à votre "Aussi "). En même temps, une cale fine comme SConnect est la plus facile à créer, pour fournir un code de style javscript plugin.sendAPDU () (ou simplement envelopper toutes les API PC/SC et laisser l'appelant javascript prendre soin du même niveau de détails comme dans le cas d'utilisation de l'API PC/SC native).

La création d'un plugin à cet effet est généralement due à des déficiences aiguës actuelles.

Aborder le futur (mobile, etc.) est une autre histoire, où des choses comme W3C webcrypto et OpenMobile API vont probablement enfin créer quelque chose qui expose les conteneurs de clés côté client aux applications Web. Si votre cible avec les cartes à puce est la cryptographie, ma suggestion est d'éviter les PC/SC et d'utiliser les services de plate-forme (CryptoAPI sous Windows, porte-clés sous OSX, PKCS # 11 sous Linux)

Tout type de conception a des exigences. Tout cela s'applique si vous envisagez d'utiliser touches plutôt que des APDU arbitraires. Si vous avez besoin d'envoyer des APDU arbitraires, créez un plugin et allez-y.

24
Martin Paljak

Je viens de publier un plugin bêta pour résoudre ce problème. Ce code bêta est disponible ici:

https://github.com/ubinity/webpcsc-firebreath

Ce plugin est basé sur le framework firebreath et a été bêta-testé avec Fireofx et Chrome sous Linux/WinXP/Win7. Le code source et le pack d'extension sont fournis.

L'idée de base est de fournir un accès à l'API PCSLite, puis de développer une API JS plus conviviale en plus de cela.

Ce plugin est en cours de développement, alors n'hésitez pas à envoyer tout rapport et demande.

7
cslashm

Il existe un autre plugin de navigateur similaire à celui proposé par @cslashm disponible sur http://github.com/cardid/WebCard . Est également open source et peut être installé avec un "minimum d'installation" comme requis dans la question d'origine. Vous pouvez voir un exemple d'utilisation en visitant http://plugin.cardid.org

WebCard a été testée dans IE 8 à 11, Chrome et Firefox sous Windows et dans Chrome et Safari sous Mac OS) X. Étant donné qu'il ne s'agit que d'un wrapper pour PC/SC, il nécessite sous Mac OS X l'installation des services SmartCard à partir de http://smartcardservices.macosforge.com

4
Adrian

Pour votre première question, j'ai peu d'espoir: soit vous êtes satisfait d'un très petit sous-ensemble de fonctionnalités de carte à puce (comme la signature d'e-mails ou de PDF), alors vous pouvez utiliser un logiciel prêt à l'emploi (comme PKCS), idéalement maintenu par le société de cartes à puce, ou vous voulez des fonctionnalités plus larges et devez investir vous-même des efforts considérables. Le PCSC est certainement le point de départ à choisir.

Au moins pour votre "aussi:" il y a de l'espoir.

1) Notez que certaines spécifications (par exemple OACI/BSI allemand TR-3110) demandent une méthode, où a PIN n'est pas bloqué, mais utilise un temps considérable dès que le compteur d'erreurs frappe 1 avant de répondre. La dernière tentative doit être activée à l'aide d'une commande différente, sinon aucune comparaison et aucun ajustement du compteur d'erreurs ne sont effectués.

2) Protégez simplement la commande Verify en exigeant une messagerie sécurisée. Les applications sensibles utilisent la messagerie sécurisée pour tout, donc la première étape d'une clé de session est négociée, qui est ensuite appliquée à toutes les commandes et réponses suivantes. L'effet serait que la commande est rejetée en raison de MAC incorrects bien avant qu'une comparaison ou une modification du compteur d'erreurs ne soit effectuée.

4
guidot

Comme chrome et firefox vont arrêter le support de NPAPI Plugin, il n'y a pas de solution sécurisée disponible pour maintenir la session pour la lecture de la carte à puce à la place votre certificat de la carte supporte le SSL mutuel, je répondu à la question similaire source , cela pourrait aider

2
krishnakumar sekar

En parlant de Chrome, vous pouvez désormais utiliser application Smart Card Connector fournie par Google qui regroupe le port PC/SC-Lite et le pilote CCID générique.

L'application elle-même fonctionne via chrome.usb API , qui a été mentionnée par les commentateurs précédents.

Ainsi, au lieu de réécrire toute la pile (à partir du niveau le plus bas - USB brut), il est désormais possible pour les développeurs de coder uniquement la partie qui fonctionne au-dessus de l'API PC/SC - qui est exposée par l'application Connector.

1
Max

C'est sale, mais s'il est acceptable/viable d'installer un démon/service de pont sur la machine cliente, alors vous pouvez écrire un service de pont local (par exemple dans python/pyscard) qui expose la carte à puce via une interface REST, puis avoir javascript dans le navigateur qui sert de médiateur entre ce service local (façade) et l'API du serveur distant.

1
david.barkhuizen

Une autre solution à ce problème s'appelle FortifyApp vous pouvez lire comment cela fonctionne ici .

TL; DR; il s'agit d'une application installable par le client qui fonctionne sur OSX, Windows et Linux qui expose les cartes à puce via un polyfill de cryptage Web qui peut également donner accès à d'autres certificats/magasins de clés.

0
rmhrisk

Clients, clients, clients ... plugins, .. JSApis .. Eh bien .. Pour certains, nous le savons: tous les navigateurs, lorsqu'ils communiquent avec un serveur Apache ou IIS serveurs, signent réellement "- quelque chose "lorsqu'un processus de prise de contact https/SSL est nécessaire.

Par exemple, une configuration Apache typique comme celle-ci:

SSLVerifyClient require
SSLVerifyDepth 10
SSLOptions +FakeBasicAuth +StdEnvVars +ExportCertData +OptRenegotiate

Initie un PIN pad pop up et l'utilisateur doit insérer la broche de la carte à puce pour continuer.

Eh bien, mon idée est: pourquoi ne pas faire le tour du serveur, et modifier ce comportement, afin de télécharger un flux de bytest pour signer quelque chose quand une poignée de main est initiée?

0
JaK threepixels

Utiliser l'extension du navigateur pour accéder à la carte à puce ou au jeton USB

Les applets Java, Active X, etc. sont déjà supprimés ou sont supprimés des nouveaux navigateurs modernes. Récemment, on parle beaucoup de l'API WebCrypto, mais pour l'instant, l'API WebCrypto ne fournit pas d'accès à (Windows) ou à tout autre magasin de clés ou périphérique crypto USB/Smartcard local.

Pour l'authentification à partir du navigateur à l'aide de la signature numérique et de la signature PDF ou eReturn, une telle extension Chrome disponible est Signer.Digital chrome = extension. Le système local (hôte fonctionnant derrière le navigateur chrome sur Windows) peut être téléchargé à partir de https://signer.digital/downloads/Signer.Digital.Chrome.Host .Setup.Zip Installer cet hôte et redémarrer Chrome ajoutera automatiquement Signer.Digital Chrome Extension

Le fonctionnement réel de cette extension est illustré ici

Étapes de test:

  1. Installez les pilotes de périphérique pour votre jeton USB ou votre carte à puce - Cela devrait rendre votre certificat dans le magasin de certificats Windows

  2. Installez la configuration indiquée ci-dessus.

  3. Redémarrez Chrome Browser.

  4. Ouvrir ce lien

  5. Mettez UserID & Password et cliquez sur le bouton Register - cela demandera de sélectionner la signature numérique et de l'enregistrer sur le serveur (pour cette session uniquement - non permanente).

  6. Ensuite, mettez à nouveau le même ID utilisateur et le même mot de passe, sélectionnez le même certificat et cliquez sur Connexion . La sélection d'un autre certificat ne permettra pas la connexion.

Javascript pour appeler la méthode à partir de l'extension:

Pour enregistrer un certificat sur le serveur:

//Get Selected Certificate Information 
SignerDigital.getSelectedCertificate()
    .then(
        function (CertInfo) {        
    //Success returns Certificate Subject and Thumbprint
        },
            function (errmsg) {
                //Send errmsg to server or display the result in browser.
              }
     );

Pour vous authentifier ou vous connecter à l'aide de la signature numérique:

SignerDigital.signAuthToken(authToken, "SHA-256")       //or "SHA256"
    .then(
        function (SignData) {        //Success returns Signed Auth Token
        },
            function (errmsg) {
                //Send errmsg to server or display the result in browser.
              }
     );

Pour signer un PDF:

    //Calculate Sign for the Hash by Calling function from Extension SignerDigital
    SignerDigital.signPdfHash(hash, $("#CertThumbPrint").val(), "SHA-256")      //or "SHA256"
     .then(
            function (signDataResp) {
              //Send signDataResp to Server
        },
            function (errmsg) {
                //Send errmsg to server or display the result in browser.
              }
     );

En cas d'échec: renvoie un message d'erreur commençant par "Erreur SDHost:"

0
Bharat Vasant

J'ai une configuration où un lecteur de carte à puce est analysé pour connecter un utilisateur. La bibliothèque PC/SC fonctionne très bien sur le bureau. Quelqu'un avait mentionné d'utiliser le compilateur Emscripten ( https://github.com/kripken/emscripten ) qui compile c ++ en code JavaScript. Mais cela n'a pas bien fonctionné car certaines des fonctions utilisées par PC/SC ne sont disponibles que côté serveur. Après de nombreuses recherches. J'ai finalement abandonné une solution côté client, chrome API Web USB ne pouvait pas non plus reconnaître le lecteur.
J'ai alors décidé d'essayer signalR et d'installer un concentrateur sur le PC connecté au lecteur de carte à puce et cette approche a très bien fonctionné.

0
Syler