2009-01-07 10 views
1

Mon entreprise a une application de gestion de documents Web et j'ai été assigné pour trouver un moyen de signer des fichiers pdf avec le certificat numérique de l'utilisateur.Signer numériquement pdfs

Les pdfs peuvent aller de quelques kb à plus de 100 Mo, c'est sur Internet de sorte que la signature doit ont lieu au niveau du serveur web. Pour ce faire, j'ai construit un contrôle activeX qui demande à l'utilisateur de choisir le certificat, puis le télécharge sur une page web en utilisant WebClient.UploadData envoyant le certificat sous la forme d'un tableau d'octets.

Sur la page Web lorsque j'essaie de signer le document pdf, j'obtiens une erreur "La clé n'existe pas". Cela ne me surprend pas parce que quand j'utilisais le certificat directement sur une connexion https après avoir choisi le bon certificat, je serais prompt pour la clé. Ce n'est pas le cas avec ActiveX.

Voilà comment je suis d'obtenir le certificat de l'utilisateur:

private static X509Certificate2 PickCertificate() 
     { 
      X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
      try 
      { 
       store.Open(OpenFlags.ReadOnly); 

       // pick a certificate from the store 
       X509Certificate2 cert = X509Certificate2UI.SelectFromCollection(store.Certificates, "Title", "Message", X509SelectionFlag.SingleSelection)[0]; 

       // show certificate details dialog 
       X509Certificate2UI.DisplayCertificate(cert); 
       store.Close(); 
       return cert; 
      } 
      finally { store.Close(); } 
     } 

Comment puis-je demander à l'utilisateur de fournir la clé que je suis absent?

Répondre

4

Vous souhaitez que l'utilisateur télécharge la clé privée de son certificat sur le serveur Web pour qu'il puisse signer des fichiers PDF? Si c'est le cas, cela est fondamentalement brisé du point de vue de la sécurité.

Je pense que vous avez peut-être manqué le point que le certificat public! = Clé privée. (La plupart d'entre nous sont bâclés et utilisent le mot «certificat» pour désigner l'une ou l'autre de ces choses, ce qui n'est pas vraiment surprenant). En partant de la mémoire, CryptoAPI a seulement un ensemble de méthodes qui vous permettront d'accéder à la clé. Il doit y avoir une méthode «exporter en tant que PFX» parmi celles-ci, donc vous pourriez faire fonctionner votre design si vous le souhaitiez vraiment, mais je ne recommanderais pas cela. (Risque d'envoyer des clés privées au serveur web, non-répudiation cassée, etc etc). Si vous devez vraiment faire la signature sur le serveur [Je ne comprends pas vraiment votre argument, la signature ne devrait pas ajouter beaucoup de données au téléchargement], alors vous devriez probablement envisager une architecture à plusieurs niveaux, et un engagement de clé mécanisme. De cette façon, vous pouvez au moins minimiser certaines des préoccupations de sécurité (mais vous perdrez quand même la non-répudiation ... et vous présenterez d'autres risques.) Pas de repas gratuit ici).

Alors ... vous devrez probablement envisager une nouvelle architecture de votre application afin que la signature PDF apparaisse sur le client (dans votre contrôle ActiveX), avant que le fichier PDF ne soit téléchargé. J'imagine que vous aurez besoin d'une bibliothèque tierce pour l'étape de signature comme discuté dans this SO thread.

+0

La version précédente pour signer les fichiers PDF travaillait sur le côté client. Ceci est un problème lorsque vous souhaitez signer un document de 100 Mo car vous devez le télécharger sur le Web. Imaginez à quel point cela prendrait une connexion de téléchargement de 15kb/s ... – Sergio

+0

télécharger/signer/télécharger? Je vois. Ensuite, vous devrez soit envoyer le fichier de clés au serveur, ce qui est dangereux, ou implémenter un système d'entiercement (qui prendra du travail et peut même ne pas être possible en fonction de votre public cible). Implications juridiques (responsabilité) dans l'un ou l'autre scénario. –

+1

Je reçois le certificat d'une carte à puce. Avez-vous des idées sur la façon dont je peux obtenir la clé? – Sergio