Цифровая подпись PDF-файлов - PullRequest
2 голосов
/ 07 января 2009

В моей компании есть приложение для управления веб-документами, и мне поручили найти способ подписать файлы 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(); }
        }

Как я могу попросить пользователя указать ключ, который мне не хватает?

1 Ответ

4 голосов
/ 07 января 2009

Вы хотите, чтобы пользователь загрузил закрытый ключ своего сертификата на веб-сервер, чтобы он мог подписывать PDF-файлы? Если это так, то это в корне нарушено с точки зрения безопасности.

Я думаю, вы, возможно, упустили момент, когда открытый сертификат! = Закрытый ключ. (Большинство из нас небрежны и используют слово «сертификат» для обозначения одного (или обоих) из этих вещей, так что это не совсем удивительно). Исходя из памяти, у CryptoAPI есть только выбранный набор методов, которые позволят вам получить доступ к ключу. Среди них должен быть метод «экспортировать как PFX», чтобы вы могли заставить свой дизайн работать, если вы действительно этого хотите, но я бы не рекомендовал это. (Риск отправки закрытых ключей на веб-сервер, неработоспособность и т. Д. И т. Д.).

Если вам действительно необходимо выполнить подпись на сервере [я не совсем понимаю ваш аргумент, подпись не должна добавлять много данных к загрузке], тогда вам, вероятно, следует рассмотреть многоуровневую архитектуру и механизм условного депонирования ключей. , Таким образом, вы можете, по крайней мере, минимизировать некоторые проблемы безопасности (но вы все равно потеряете безотказность ... и будете вводить другие риски. Бесплатный обед здесь).

Итак ... вам, вероятно, нужно подумать о перестройке вашего приложения, чтобы подпись PDF возникала на клиенте (в вашем элементе управления ActiveX), прежде чем файл PDF будет загружен. Я полагаю, вам понадобится сторонняя библиотека для этапа подписи, как описано в этом SO-потоке .

...