Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top