Цифровая подпись PDF-файлов
-
05-07-2019 - |
Вопрос
В моей компании есть приложение для управления веб-документами, и мне поручили найти способ подписать файлы pdf цифровым сертификатом пользователя.
Размер PDF-файлов может варьироваться от нескольких КБ до более 100 МБ, это происходит через Интернет, поэтому подпись должна размещаться на веб-сервере.
Для этого я создал элемент управления ActiveX, который просит пользователя выбрать сертификат, а затем загружает его на веб-страницу с помощью WebClient.UploadData, отправляя сертификат в виде байтового массива.
На веб-странице, когда я пытаюсь подписать документ pdf, я получаю сообщение об ошибке "Ключ не существует". Это неудивительно для меня, потому что, когда я использовал сертификат непосредственно через соединение https после того, как я выбрал подходящий сертификат, я бы запросил ключ. Этого не происходит с ActiveX.
Вот как я получаю сертификат от пользователя:
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(); }
}
Как я могу попросить пользователя указать ключ, который мне не хватает?
Решение
Вы хотите, чтобы пользователь загрузил закрытый ключ своего сертификата на веб-сервер, чтобы он мог подписывать PDF-файлы? Если так, то это в корне нарушено с точки зрения безопасности.
Я думаю, вы, возможно, упустили момент, когда открытый сертификат! = закрытый ключ. (Большинство из нас небрежны и используют слово «сертификат» для обозначения одного (или обоих) из этих вещей, так что это не совсем удивительно). Исходя из памяти, у CryptoAPI есть только выбранный набор методов, которые позволят вам получить доступ к ключу. Должен быть " экспорт как PFX " метод среди них, так что вы могли бы сделать свой дизайн работы, если вы действительно, действительно хотели, но я бы не рекомендовал это. (Риск отправки закрытых ключей на веб-сервер, неработоспособность и т. Д. И т. Д.).
Если вам действительно необходимо выполнить подпись на сервере [я не совсем понимаю ваш аргумент, подпись не должна добавлять много данных к загрузке], тогда вам, вероятно, следует рассмотреть многоуровневую архитектуру и механизм условного депонирования ключей. , Таким образом, вы можете, по крайней мере, минимизировать некоторые проблемы с безопасностью (но вы все равно потеряете безотказность ... и создадите другие риски. Бесплатный обед здесь).
Итак ... вам, вероятно, нужно подумать о перестройке вашего приложения, чтобы подпись PDF возникала на клиенте (в вашем элементе управления ActiveX), прежде чем файл PDF будет загружен. Я полагаю, вам понадобится сторонняя библиотека для этапа подписи, как описано в этой теме SO . р>