pdfs assinar digitalmente
-
05-07-2019 - |
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?
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 .