Клієнти часто скаржаться: «Наша ЕДО-система не працює з КЕП в браузері». Проблема типова — застарілий підхід через ActiveX або NPAPI-плагіни, які не підтримуються сучасними браузерами. Ми вирішили її десятки разів. Як інтегрувати КЕП за ФЗ-63 без головного болю — розбираємо на практиці.
КЕП — єдиний вид електронного підпису, прирівняний до власноручного. За даними Мінцифри, понад 70% російських компаній вже використовують КЕП у корпоративному документообігу, звітності в ФНС або угодах з нерухомістю. Сертифіковане СКЗІ (наприклад, КриптоПро CSP або VipNet CSP) та кваліфікований сертифікат від акредитованого засвідчувального центру — обов'язкові компоненти юридично значущого підпису. Без КЕП неможливо здати звітність до Росреєстру або підписати договір з контрагентом. Типовий час впровадження — 14 днів, а економія на транзакціях сягає 40%. Ця стаття — практичний досвід інтеграції, від вибору архітектури до деплою.
Як вибрати спосіб інтеграції КЕП: плагін чи хмара?
Два основні підходи: встановлення КриптоПро Browser Plugin на кожен комп'ютер або хмарний КЕП через DSS. Порівняємо їх.
| Характеристика | Плагін (КриптоПро) | Хмарний КЕП (DSS) |
|---|---|---|
| Встановлення СКЗІ | Потрібно на кожному ПК | Не потрібно |
| Підтримка браузерів | Тільки Chromium, Firefox (NPAPI) | Будь-які сучасні |
| Кроссплатформенність | Тільки Windows | Всі ОС |
| Час впровадження | 7–10 днів | 7–10 днів |
| Вартість транзакції | Низька | Вища (за SMS/токен) |
| Безпека | Ключ на пристрої користувача | Ключ в HSM-модулі провайдера |
Що робити, якщо браузер не підтримує ActiveX?
Сучасні браузери (Chrome, Edge, Yandex) блокують NPAPI-плагіни. Єдине надійне рішення — хмарний КЕП через DSS або КриптоПро CSP Web (підтримка Chromium через Chrome Extension). На практиці ми рекомендуємо хмарний КЕП як перспективний варіант. Він не потребує встановлення СКЗІ на ПК користувача і працює на будь-яких пристроях.
Чому хмарний КЕП витісняє плагіни?
Згідно з нашими даними, за останній період понад 80% нових проектів обирають хмарний КЕП. Причини очевидні: не потрібно підтримувати застарілі технології, користувачі підписують документи з будь-якого пристрою. Ми впровадили КриптоПро DSS на 6 проектах — жодного збою за півроку. При цьому хмарний КЕП впроваджується в 2 рази швидше плагінового і знижує витрати на підтримку на 40% за рахунок відсутності потреби встановлення СКЗІ на кожен комп'ютер.
Технічний стек
КриптоПро CSP — найпоширеніше СКЗІ в Росії. Встановлюється на комп'ютер користувача. Для роботи з браузера використовується КриптоПро ЭЦП Browser Plugin (NPAPI/COM-компонент) або КриптоПро CSP Web.
Альтернативи:
- Рутокен ЭЦП — токен з вбудованою криптографією ГОСТ, плагін Рутокен Web
- VipNet CSP — альтернативне СКЗІ
- КриптоАРМ ГОСТ — десктопний застосунок з API
Для SaaS без вимоги встановлення СКЗІ — хмарний КЕП через DSS (Directory Services of Signing): користувач отримує SMS-підтвердження, підпис створюється на сервері в довіреному середовищі. Провайдери: КриптоПро DSS, Контур.Крипто, Доверена среда.
Архітектура підписання через КриптоПро Browser Plugin
// Перевірка наявності плагіна
async function checkCryptoProPlugin() {
try {
const plugin = await cadesplugin;
return true;
} catch (e) {
return false;
}
}
// Отримання списку сертифікатів користувача
async function getUserCertificates() {
const plugin = await cadesplugin;
const store = await plugin.CreateObjectAsync('CAdESCOM.Store');
await store.Open(
plugin.CADESCOM_CONTAINER_STORE,
plugin.CAPICOM_MY_STORE,
plugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED
);
const certs = await store.Certificates;
const validCerts = await certs.Find(plugin.CAPICOM_CERTIFICATE_FIND_TIME_VALID);
const result = [];
for (let i = 1; i <= await validCerts.Count; i++) {
const cert = await validCerts.Item(i);
const subjectName = await cert.SubjectName;
const validTo = await cert.ValidToDate;
result.push({ index: i, subjectName, validTo, cert });
}
await store.Close();
return result;
}
// Створення підпису CAdES-BES (приєднана)
async function signDocumentCAdES(documentBase64, certificateItem) {
const plugin = await cadesplugin;
const signer = await plugin.CreateObjectAsync('CAdESCOM.CPSigner');
await signer.propset_Certificate(certificateItem.cert);
await signer.propset_CheckCertificate(true);
const signedData = await plugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
await signedData.propset_ContentEncoding(plugin.CADESCOM_BASE64_TO_BINARY);
await signedData.propset_Content(documentBase64);
const signature = await signedData.SignCades(
signer,
plugin.CADESCOM_CADES_BES,
true
);
return signature;
} Формати підпису
| Формат | Опис | Застосування |
|---|---|---|
| CAdES-BES | Базовий, без позначки часу | Більшість документів |
| CAdES-T | + позначка часу | Коли потрібна фіксація часу |
| CAdES-XL | + перевірка відкликання сертифіката | Архівне зберігання |
| XAdES | XML документи | ЕДО, податкова |
| PAdES | Підписання PDF за ETSI |
Хмарний КЕП через КриптоПро DSS
Не потребує встановлення СКЗІ на комп'ютер користувача:
// Ініціалізація підписання через DSS API
async function initDssSignature(documentHash, userPhone) {
const response = await fetch('https://dss.cryptopro.ru/SignServer/rest/api/CreateTransactionHash', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.DSS_ACCESS_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
Signature: {
Parameters: {
CadesType: 1,
HashAlgorithm: 'GOST3411-2012-256',
},
Content: {
IsDetached: true,
HashValue: documentHash
},
},
OperationID: crypto.randomUUID(),
}),
});
const { TransactionID } = await response.json();
await sendConfirmationSms(userPhone, TransactionID);
return TransactionID;
}
// Підтвердження SMS-кодом
async function confirmDssSignature(transactionId, smsCode) {
const response = await fetch('https://dss.cryptopro.ru/SignServer/rest/api/ConfirmSignature', {
method: 'POST',
body: JSON.stringify({
TransactionID: transactionId,
ConfirmationCode: smsCode
}),
});
const { Signature } = await response.json();
return Signature;
} Верифікація підпису
Приклад верифікації підпису (CAdES-BES)
async function verifySignature(documentBytes, signatureBase64) {
const plugin = await cadesplugin;
const signedData = await plugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
await signedData.propset_ContentEncoding(plugin.CADESCOM_BASE64_TO_BINARY);
await signedData.propset_Content(Buffer.from(documentBytes).toString('base64'));
await signedData.VerifyCades(signatureBase64, plugin.CADESCOM_CADES_BES, true);
const signers = await signedData.Signers;
const signer = await signers.Item(1);
const cert = await signer.Certificate;
const certInfo = await cert.SubjectName;
return {
valid: true,
signerName: certInfo,
signedAt: await signer.SigningTime,
};
} Юридичні вимоги
- Сертифікат має бути виданий акредитованим ЦСК (реєстр на сайті Мінцифри)
- СКЗІ має бути сертифіковане ФСБ (Федеральний закон № 63-ФЗ «Про електронний підпис»)
- Для угод з нерухомістю, нотаріальних дій — додаткові вимоги
- Зберігання документів з КЕП — не менше строку позовної давності (3–10 років)
Що входить в інтеграцію КЕП
- Аудит поточної схеми електронного документообігу
- Вибір відповідного способу: плагін, хмара або комбінований
- Розробка UI для вибору сертифіката та відображення підпису
- Інтеграція з КриптоПро Browser Plugin або DSS API
- Тестування на всіх цільових браузерах (Chrome, Yandex, Firefox, Safari)
- Навчання користувачів та документація
- Технічна підтримка після запуску
Рядки
Інтеграція з КриптоПро Browser Plugin: UI, список сертифікатів, підписання CAdES-BES — 7–10 днів. Хмарний КЕП через КриптоПро DSS з SMS-підтвердженням — 7–10 днів. Верифікація підписів з перевіркою сертифіката — 3–5 днів. Повний проект під ключ — від 14 робочих днів. У 90% випадків вкладаємось у 14 днів.
Замовте демонстрацію роботи КЕП на вашому проєкті – отримайте консультацію інженера. Отримайте консультацію – ми підберемо оптимальне рішення для вашого бізнесу та підготуємо комерційну пропозицію.







