Domanda

La mia azienda ha un'applicazione di gestione dei documenti Web e mi è stato assegnato il compito di trovare un modo per firmare i file pdf con il certificato digitale dell'utente.

I pdf possono andare da pochi KB a oltre 100 Mb, questo è su Internet, quindi la firma deve avere luogo sul server web.

Per fare ciò ho creato un controllo activeX che chiede all'utente di scegliere il certificato, quindi lo carica su una pagina Web usando WebClient.UploadData inviando il certificato come array di byte.

Sulla pagina web quando sto cercando di firmare il documento pdf sto ricevendo un errore "La chiave non esiste". Questo non mi sorprende, perché quando stavo usando il certificato direttamente su una connessione HTTPS dopo aver scelto il certificato corretto, avrei richiesto la chiave. Questo non accade con activeX.

Ecco come sto ottenendo il certificato dall'utente:

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

Come posso chiedere all'utente di fornire la chiave che mi manca?

È stato utile?

Soluzione

Desideri che l'utente carichi la chiave privata del proprio certificato sul server web in modo che possa firmare i PDF? In tal caso, ciò è fondamentalmente rotto dal punto di vista della sicurezza.

Penso che potresti aver perso il punto che certificato pubblico! = chiave privata. (Molti di noi sono sciatti e usano la parola "certificato" per riferirsi a una (o entrambe) di queste cose, quindi non è del tutto sorprendente). Passando dalla memoria, CryptoAPI ha solo una serie selezionata di metodi che ti permetteranno di accedere alla chiave. Deve esserci un'esportazione "quotata come PFX" metodo tra quelli, in modo da poter far funzionare il tuo design se davvero, davvero volessi, ma non c'è modo che lo consiglierei. (Rischio di invio di chiavi private al server web, mancata non ripudio, ecc. Ecc.)

Se devi davvero fare la firma sul server [Non capisco davvero il tuo argomento, la firma non dovrebbe aggiungere molti dati al caricamento], allora dovresti probabilmente considerare un'architettura a più livelli e un meccanismo di deposito chiave . In questo modo puoi almeno minimizzare alcuni dei problemi di sicurezza (ma perderai comunque il non ripudio ... e introducerai altri rischi. Nessun pranzo libero qui).

Quindi ... probabilmente dovrai considerare di riprogettare la tua applicazione in modo tale che la firma PDF avvenga sul client (nel tuo controllo ActiveX), prima che il file PDF venga caricato. Immagino che avrai bisogno di una libreria di terze parti per il passaggio della firma, come discusso in questa discussione SO .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top