2022-06-22 19:45:45 +03:00
[![License][license-image]][license-url]
2020-03-28 20:10:18 +03:00
[![NPM version][npm-version-image]][npm-url]
[![NPM downloads][npm-downloads-image]][downloads-url]
2022-06-22 19:45:45 +03:00
[![Build Status][actions-image]][actions-url]
2020-03-28 20:10:18 +03:00
2020-03-29 14:04:57 +03:00
< a name = "cryptopro" > < / a >
# cryptoPro
2021-09-15 13:57:05 +03:00
Асинхронный JavaScript API для работы с КриптоПРО ЭЦП Browser Plug-In
2020-03-29 14:04:57 +03:00
2021-09-15 13:57:05 +03:00
> **Это форк проекта [vgoma/crypto-pro](https://github.com/vgoma/crypto-pro)**
2021-06-04 18:44:56 +03:00
>
2021-09-15 13:57:05 +03:00
> **API форка отличается от оригинала**: внимательно читайте README
2021-06-04 18:44:56 +03:00
2020-03-29 14:04:57 +03:00
| [![Chrome ](https://raw.githubusercontent.com/alrra/browser-logos/62.2.25/src/chrome/chrome_64x64.png )](https://www.chromium.org/getting-involved/download-chromium#TOC-Downloading-old-builds-of-Chrome-Chromium) | [![Firefox ](https://raw.githubusercontent.com/alrra/browser-logos/62.2.25/src/firefox/firefox_64x64.png )](https://ftp.mozilla.org/pub/firefox/releases/) | [![IE ](https://raw.githubusercontent.com/alrra/browser-logos/62.2.25/src/archive/internet-explorer_9-11/internet-explorer_9-11_64x64.png )](https://www.microsoft.com/ru-ru/download/details.aspx?id=43374) | [![Opera ](https://raw.githubusercontent.com/alrra/browser-logos/62.2.25/src/opera/opera_64x64.png )](http://get.opera.com/ftp/pub/opera/desktop/) |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| __v45+__ с расширением [CryptoPro Extension for CAdES Browser Plug-in ](https://chrome.google.com/webstore/detail/cryptopro-extension-for-c/iifchhfnnmpdbibifmljnfjhpififfog?utm_source=chrome-app-launcher-info-dialog ) | __v43+__ . Начиная с версии 52, с [расширением ](https://www.cryptopro.ru/sites/default/files/products/cades/extensions/cryptopro_extension_for_cades_browser_plug_in-1.1.1-an+fx-windows.xpi ) | __v9+__ с установленным [КриптоПро ЭЦП Browser plug-in ](https://www.cryptopro.ru/products/cades/plugin ) | __v40+__ с расширением [CryptoPro Extension for CAdES Browser Plug-in ](https://addons.opera.com/en/extensions/details/cryptopro-extension-for-cades-browser-plug-in/ ) |
2020-03-29 13:42:31 +03:00
2021-09-15 13:57:05 +03:00
## Ошибка `Параметр задан неверно. (0x80070057)`
Если при попытке подписать сообщение с использованием PKCS#7 подписи падает такая ошибка, то читайте [этот issue ](https://github.com/webmasterskaya/crypto-pro-js/issues/20 )
2020-11-08 13:05:45 +03:00
2020-03-28 20:10:18 +03:00
- [cryptoPro ](#cryptopro )
2020-03-29 09:46:04 +03:00
- [Зачем мне этот пакет? ](#why )
- [Установка ](#install )
2020-03-28 21:18:25 +03:00
- [API ](#api )
2020-03-29 09:46:04 +03:00
- [Методы объекта cryptoPro ](#api-cryptopro )
- [Методы объекта сертификата ](#api-certificate )
- [Поддерживаемые СКЗИ ](#supported-cist )
- [Примеры ](#examples )
- [Тэг script (UMD) ](#example-script-tag )
- [Тем, кто хочет помочь ](#developers )
- [Запуск режима разработки ](#dev-mode )
- [Запуск тестов ](#tests-execution )
- [Проверка пакета перед публикацией в NPM ](#final-check )
- [Лицензия ](#lisense )
< a name = "why" > < / a >
2020-03-28 20:10:18 +03:00
## Зачем мне этот пакет?
КриптоПРО ЭЦП Browser Plug-In доступен в разных браузерах в двух версиях.
Асинхронной (в современных браузерах) и синхронной (в браузерах постарше).
С помощью этого пакета можно не писать реализацию под каждую версию плагина дважды.
2020-03-29 09:46:04 +03:00
< a name = "install" > < / a >
2020-03-28 20:10:18 +03:00
## Установка
Для NPM:
```bash
2021-09-15 13:57:05 +03:00
npm install crypto-pro-js
2020-03-28 20:10:18 +03:00
```
2020-03-29 09:46:04 +03:00
Для Yarn:
2020-03-28 20:10:18 +03:00
```bash
2021-09-15 13:57:05 +03:00
yarn add crypto-pro-js
2020-03-28 20:10:18 +03:00
```
Для Bower:
```bash
2021-09-15 13:57:05 +03:00
bower install webmasterskaya/crypto-pro-js
2020-03-28 20:10:18 +03:00
```
2020-03-29 14:18:39 +03:00
Подключение пакета как UMD модуля через тэг script:
```html
2021-09-15 13:57:05 +03:00
< script src = "crypto-pro-js/dist/crypto-pro.min.js" > < / script >
2020-03-29 14:18:39 +03:00
< script >
2020-03-28 20:10:18 +03:00
window.cryptoPro.getUserCertificates()
.then(function (certificates) {
//...
})
.catch(function (error) {
//...
});
2020-03-29 14:18:39 +03:00
< / script >
2020-03-28 20:10:18 +03:00
```
2020-03-29 14:18:39 +03:00
Подключение пакета как ES модуля с Typescript или JavaScript:
2020-03-28 20:10:18 +03:00
```typescript
2021-09-15 13:57:05 +03:00
import { getUserCertificates, Certificate } from 'crypto-pro-js';
2020-03-28 20:10:18 +03:00
(async () => {
let certificates: Certificate[];
try {
certificates = await getUserCertificates();
} catch(error) {
// ...
}
})();
```
2020-03-29 14:18:39 +03:00
Список требуемых полифиллов (если необходимы, подключаются самостоятельно):
- Promise
- Array.prototype.find
< a name = "api" > < / a >
## API
2020-03-29 09:46:04 +03:00
< a name = "api-cryptopro" > < / a >
2020-03-28 20:10:18 +03:00
### Методы объекта cryptoPro
2020-03-29 09:46:04 +03:00
- [getUserCertificates ](src/api/getUserCertificates.ts ) - возвращает список [сертификатов ](#api-certificate ), доступных пользователю в системе
- [getCertificate ](src/api/getCertificate.ts ) - возвращает [сертификат ](#api-certificate ) по отпечатку
2020-10-17 16:47:27 +03:00
- [createAttachedSignature ](src/api/createAttachedSignature.ts ) - создает совмещенную (присоединенную) подпись сообщения
- [createDetachedSignature ](src/api/createDetachedSignature.ts ) - создает отсоединенную (открепленную) подпись сообщения
2021-06-04 18:44:56 +03:00
- [addAttachedSignature ](src/api/addAttachedSignature.ts ) - добавляет совмещенную (присоединенную) подпись к раннее подписанному документу (реализует метод coSign)
- [addDetachedSignature ](src/api/addDetachedSignature.ts ) - добавляет отсоединенную (открепленную) подпись к раннее подписанному документу (реализует метод coSign)
2021-02-04 07:45:48 +03:00
- [createXMLSignature ](src/api/createXMLSignature.ts ) - создает XML подпись для документа в формате XML
2020-10-17 16:47:27 +03:00
- [createHash ](src/api/createHash.ts ) - создает хеш сообщения по ГОСТ Р 34.11-2012 256 бит
2020-03-28 20:10:18 +03:00
- [getSystemInfo ](src/api/getSystemInfo.ts ) - возвращает информацию о CSP и плагине
- [isValidSystemSetup ](src/api/isValidSystemSetup.ts ) - возвращает флаг корректности настроек ЭП на машине
2020-03-29 09:46:04 +03:00
< a name = "api-certificate" > < / a >
2020-03-28 20:10:18 +03:00
### Методы объекта сертификата
[Сертификат ](src/api/certificate/certificate.ts ) предоставляет следущее API:
- [isValid ](src/api/certificate/isValid.ts ) - возвращает флаг действительности сертификата
- [getCadesProp ](src/api/certificate/getCadesProp.ts ) - возвращает указанное внутренее свойство у сертификата в формате Cades
- [exportBase64 ](src/api/certificate/exportBase64.ts ) - возвращает сертификат в формате base64
- [getAlgorithm ](src/api/certificate/getAlgorithm.ts ) - возвращает информацию о б алгоритме сертификата
- [getOwnerInfo ](src/api/certificate/getInfo.ts ) - возвращает расшифрованную информацию о владельце сертификата
- [getIssuerInfo ](src/api/certificate/getInfo.ts ) - возвращает расшифрованную информацию о б издателе сертификата
- [getExtendedKeyUsage ](src/api/certificate/getExtendedKeyUsage.ts ) - возвращает ОИД'ы сертификата
- [getDecodedExtendedKeyUsage ](src/api/certificate/getDecodedExtendedKeyUsage.ts ) - возвращает расшифрованные ОИД'ы
- [hasExtendedKeyUsage ](src/api/certificate/hasExtendedKeyUsage.ts ) - проверяет наличие ОИД'а (ОИД'ов) у сертификата
2017-01-17 13:22:49 +03:00
2020-03-29 09:46:04 +03:00
< a name = "supported-cist" > < / a >
2020-03-28 20:10:18 +03:00
## Поддерживаемые СКЗИ
2021-06-04 18:44:56 +03:00
[КриптоПРО CSP ](https://www.cryptopro.ru/products/csp/downloads ) (v4.0+)
2020-03-28 20:10:18 +03:00
2020-03-29 09:46:04 +03:00
< a name = "examples" > < / a >
2020-03-28 20:10:18 +03:00
## Примеры
Для их запуска необходим NodeJS LTS.
2020-03-29 09:46:04 +03:00
< a name = "example-script-tag" > < / a >
2020-03-28 20:10:18 +03:00
### Тэг script (UMD)
2017-04-26 14:49:26 +03:00
```bash
2020-03-28 20:10:18 +03:00
cd examples/script-tag
npm i
npm start
2017-04-26 14:49:26 +03:00
```
2020-03-29 09:46:04 +03:00
< a name = "developers" > < / a >
2020-03-28 20:10:18 +03:00
# Тем, кто хочет помочь
Буду благодарен за расширение/улучшение/доработку API.
Вам будут полезны [примеры ](http://cpdn.cryptopro.ru/?url=/content/cades/plugin-samples-sign.html ),
предоставляемые Крипто ПРО.
2020-03-29 09:46:04 +03:00
< a name = "dev-mode" > < / a >
2020-03-28 20:10:18 +03:00
## Запуск режима разработки
Устанавливаем зависимости:
```bash
npm i
```
В о время работы с кодом необходим запущенный сборщик:
```bash
npm start
```
И пример, на котором можно тестировать изменения.
Удобнее всего тестировать на примере с тэгом script, тк он отвязан от фреймворков
и использует сборку в формате UMD из папки `dist/` , постоянно обновляемую пока работает
сборщик. Запускаем е г о таким образом:
```bash
cd examples/script-tag
npm i
npm link ../../
npm start
```
2021-09-15 13:57:05 +03:00
> После выполнения `npm link ../../` в директории `examples/script-tag/node_modules` папка `crypto-pro-js` станет ярлыком,
2020-03-28 20:10:18 +03:00
> указывающим на папку содержащую локально собранный пакет.
2020-03-29 09:46:04 +03:00
< a name = "tests-execution" > < / a >
2020-03-28 20:10:18 +03:00
## Запуск тестов
Тесты написаны с использованием [Jest ](https://jestjs.io/docs/en/configuration#testpathignorepatterns-arraystring ):
```bash
npm test
```
2020-03-29 09:46:04 +03:00
< a name = "final-check" > < / a >
2020-03-28 20:10:18 +03:00
## Проверка пакета перед публикацией в NPM
Необходимо протестировать работу в заявленных браузерах, сделав это на локально запакованной версии пакета.
Для этого собираем пакет:
```bash
npm run package
mv package ..
```
> Важно переместить папку `package` куда-нибудь выше для избежания конфликтов при линковке с текущим `package.json`.
2017-04-26 14:49:26 +03:00
2020-03-28 20:10:18 +03:00
Переходим в любую директорию с примером и создаем там ссылку на только что собранный пакет:
```bash
cd examples/script-tag
npm link ../../../package
```
Проверяем работу примеров в режимах разработки и продакшн.
После завершения экспериментов можно удалить глобальную ссылку из директории `../../../package` таким образом:
```bash
cd ../../../package
npm unlink
```
2020-03-29 09:46:04 +03:00
< a name = "lisense" > < / a >
2020-03-28 20:10:18 +03:00
# Лицензия
2021-06-04 18:44:56 +03:00
[MIT ](/LICENSE )
2022-06-22 19:45:45 +03:00
[license-url]: /LICENSE
[license-image]: https://img.shields.io/github/license/webmasterskaya/crypto-pro-js
2021-06-04 18:44:56 +03:00
[npm-url]: https://npmjs.org/package/crypto-pro-js
[npm-version-image]: https://img.shields.io/npm/v/crypto-pro-js.svg?style=flat
2022-06-22 19:45:45 +03:00
[npm-downloads-image]: https://img.shields.io/npm/dm/crypto-pro-js.svg?style=flat
2021-06-04 18:44:56 +03:00
[downloads-url]: https://npmcharts.com/compare/crypto-pro-js?minimal=true
2022-06-22 19:45:45 +03:00
[actions-url]: https://github.com/webmasterskaya/crypto-pro-js/actions
[actions-image]: https://img.shields.io/github/workflow/status/webmasterskaya/crypto-pro-js/test?event=push