Pergunta

Minha empresa tem uma aplicação de gestão de documentos web e eu fui designado para encontrar uma maneira de assinar arquivos pdf com o certificado digital do usuário.

Os pdfs pode ir de alguns kb a mais de 100Mb, este é através da internet para que a assinatura deve ter lugar no servidor web.

A fim de fazer isso eu construí um controle ActiveX que pede ao usuário para escolher o certificado, em seguida, carrega-lo para uma página web usando WebClient.UploadData enviar o certificado como um array de bytes.

Na página web quando eu estou tentando assinar o documento pdf eu estou recebendo um erro "A chave não existe". Este trata de nenhuma surpresa para mim, porque quando eu estava usando o certificado diretamente através de uma conexão HTTPS depois que eu escolher o certificado apropriado i seria prompt da chave. Isso não está acontecendo com o ActiveX.

Isto é como eu estou recebendo o certificado do usuário:

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

Como posso pedir que o usuário forneça a chave que eu estou ausente?

Foi útil?

Solução

Você quer que o usuário carregar a chave privada de seu certificado para o servidor para que ele possa assinar PDFs? Se assim for, isso é fundamentalmente quebrado a partir de uma perspectiva de segurança.

Eu acho que você pode ter perdido o ponto que o certificado público! = Chave privada. (A maioria de nós são desleixados e usar a palavra "certificado" para se referir a uma (ou ambas) dessas coisas, de modo que não é inteiramente surpreendente). Indo de memória, o CryptoAPI só tem um conjunto selecionado de métodos que lhe permitirá acessar a chave. Deve haver uma "exportação como PFX" método entre aqueles, para que você possa fazer o seu trabalho de design se você realmente, realmente queria, mas não há nenhuma maneira eu recomendo este. (Risco de envio de chaves privadas para servidor web, quebrado não-repúdio, etc etc).

Se você realmente deve fazer a assinatura no servidor [eu realmente não entendo o seu argumento, a assinatura não deve adicionar muitos dados para o carregamento], então você provavelmente deve considerar uma arquitetura multi-camadas, e um mecanismo de chave escrow . Desta forma, você pode, pelo menos, minimizar alguns dos problemas de segurança (mas você ainda vai perder não-repúdio ... e introduzir outros riscos. No almoço grátis aqui).

Então ... você provavelmente precisará considerar re-arquitetar seu aplicativo para que a assinatura PDF ocorre no cliente (no seu controle ActiveX), antes que o arquivo PDF é carregado. Eu imagino que você vai precisar de uma biblioteca de 3-parte para a etapa de assinatura como discutido na esta discussão SO .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top