Frage

Meine Firma hat eine Web-Dokumenten-Management-Anwendung und ich zugewiesen wurde, einen Weg zu finden, PDF-Dateien mit dem Benutzer digitalen Zertifikat zu signieren.

Die PDF-Dateien von einigen kb auf über 100 MB gehen können, ist dies über das Internet, so dass die Unterschrift muss findet auf dem Web-Server.

Um dies zu tun, habe ich ein ActiveX-Steuerelement gebaut, die den Benutzer auffordert, um das Zertifikat zu wählen, lädt sie dann auf eine Webseite mit WebClient.UploadData das Zertifikat als Byte-Array gesendet wird.

Auf der Webseite, wenn ich versuche, das PDF-Dokument zu unterschreiben ich eine Störung erhalte „Key existiert nicht“. Dies kommt keine Überraschung für mich, denn wenn ich das Zertifikat direkt über eine https-Verbindung wurde, nachdem ich das richtige Zertifikat wählen, würde ich für den Schlüssel prompt sein. Dies ist nicht mit dem activeX geschieht.

Dies ist, wie ich bin das Zertifikat vom Benutzer bekommen:

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(); }
        }

Wie kann ich den Benutzer auffordern, den Schlüssel ich fehle zu bieten?

War es hilfreich?

Lösung

Sie möchten die Benutzer ihr Zertifikat den privaten Schlüssel auf den Webserver laden, so dass es PDFs schreiben kann? Wenn ja, ist das im Grunde aus einer Sicherheitsperspektive gebrochen.

Ich glaube, Sie den Punkt verpasst haben, dass die öffentliche Zertifikat! = Privaten Schlüssel. (Die meisten von uns sind schlampig und das Wort „Zertifikat“, um entweder auf (oder beide) diese Dinge, so das ist nicht ganz überraschend). Ging aus dem Gedächtnis, hat der Crypto-API nur um eine Reihe von Methoden, die Ihnen erlaubt, den Schlüssel zu gelangen. Es muss eine „Export als PFX“ Methode unter denen sein, so können Sie Ihre Design-Arbeit machen, wenn Sie wirklich, wirklich wollen, aber es gibt keine Art, wie ich dies empfehlen würde. (Gefahr Senden private Schlüssel zum Webserver, gebrochener Nichtabstreitbarkeit, etc etc).

Wenn Sie wirklich die Unterzeichnung auf dem Server tun müssen [verstehe ich nicht wirklich Ihr Argument, Signatur sollte nicht viele Daten in den Upload hinzufügen], dann sollten Sie vielleicht einen mehrstufigen Architektur betrachten, und einen Schlüsselhinterlegungsmechanismus . Auf diese Weise können Sie zumindest einige der Sicherheitsprobleme minimieren (aber Sie werden immer noch Unbestreitbarkeit verlieren ... und andere Risiken einführen. Kein freies Mittagessen hier).

So ... Sie müssen wahrscheinlich wieder Architecting Ihre Anwendung berücksichtigen, so dass PDF-Signatur auf dem Client auftritt (in Ihrem ActiveX-Steuerelement), bevor die PDF-Datei hochgeladen wird. Ich denke, Sie werden für die Unterschrift Schritt eine 3rd-Party-Bibliothek benötigen, wie in darüber gesprochen SO Thread .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top