Question

Ma société dispose d'une application de gestion de documents Web et on m'a demandé de trouver un moyen de signer les fichiers pdf avec le certificat numérique d'utilisateur.

Les fichiers PDF peuvent aller de quelques ko à plus de 100 Mo. C'est via Internet, donc la signature doit être sur le 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 à l'aide de WebClient.UploadData et l'envoie sous forme de tableau d'octets.

Sur la page Web, lorsque j'essaie de signer le document PDF, le message d'erreur "La clé n'existe pas". Cela ne m'étonne pas car, lorsque j'utilisais le certificat directement sur une connexion https après avoir choisi le certificat approprié, je serais invité à saisir la clé. Cela ne se produit pas avec activeX.

Voici comment 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 demander à l'utilisateur de fournir la clé qui me manque?

Était-ce utile?

La solution

Vous voulez que l'utilisateur télécharge la clé privée de son certificat sur le serveur Web afin de pouvoir signer des PDF? Si c'est le cas, c'est fondamentalement cassé 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 négligents et utilisons le mot "certificat" pour désigner l'une ou l'autre (ou les deux), ce qui n'est donc pas totalement surprenant). Depuis la mémoire, CryptoAPI ne dispose que d’un ensemble de méthodes qui vous permettront d’accéder à la clé. Il doit exister une " exportation en tant que PFX " méthode parmi celles-ci, vous pouvez donc faire fonctionner votre projet si vous le vouliez vraiment, mais je ne recommanderais pas cela. (Risque d’envoi de clés privées au serveur Web, non-répudiation brisée, etc.).

Si vous devez réellement signer 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 mécanisme de dépôt fiduciaire. . De cette façon, vous pouvez au moins minimiser certains problèmes de sécurité (mais vous perdrez tout de même la non-répudiation ... et vous introduisez d'autres risques. Pas de repas gratuit ici).

Donc ... vous devez probablement envisager de restructurer votre application afin que la signature PDF se produise sur le client (dans votre contrôle ActiveX), avant le téléchargement du fichier PDF. J'imagine que vous aurez besoin d'une bibliothèque tierce pour l'étape de signature, comme indiqué dans la ce fil de discussion SO. .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top