@it-enterprise/digital-signature 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@it-enterprise/digital-signature",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "digital signature",
5
5
  "private": false,
6
6
  "main": "src/index.js",
@@ -15,6 +15,7 @@
15
15
  },
16
16
  "homepage": "https://gitlab.com/it-enterprise/npm-packages/digital-signature#readme",
17
17
  "devDependencies": {
18
+ "@babel/eslint-parser": "^7.18.9",
18
19
  "eslint": "^7.18.0"
19
20
  }
20
21
  }
package/readme.md CHANGED
@@ -7,7 +7,7 @@
7
7
  Install-Package ItEnterprise.DigitalSignature.Web
8
8
  ```
9
9
 
10
- Подключение .net core
10
+ Подключение
11
11
 
12
12
  ```c#
13
13
  using ItEnterprise.DigitalSignature.Web;
@@ -20,9 +20,12 @@ namespace TestApp.Web.NetCore
20
20
  public void ConfigureServices(IServiceCollection services)
21
21
  {
22
22
  services.AddDigitalSignature(builder => builder
23
- // Ссылка на веб-сервисы. Необходимо для обновления коревых сертификатов и списка ЦСК
24
- .SetWsUri("https://m.it.ua/ws")
25
- .SetConfig(new DigitalSignatureConfiguration
23
+ .AddCertiticateUpdatesService(
24
+ // Ссылка на веб-сервисы. Необходимо для обновления коревых сертификатов и списка ЦСК
25
+ "https://m.it.ua/ws",
26
+ // Получать значение параметра GlSign через веб-расчёт
27
+ false
28
+ ).SetConfig(new DigitalSignatureConfiguration
26
29
  {
27
30
  // Использовать нативные библиотеки. true, если будет использоваться C# API ЕЦП. Нативные библиотеки необходимо устанавливать отдельными nuget пакетами
28
31
  UseNativeLibraries = false,
@@ -41,37 +44,6 @@ namespace TestApp.Web.NetCore
41
44
  }
42
45
  ```
43
46
 
44
- Подключение .net framework
45
-
46
- ```c#
47
- using ItEnterprise.DigitalSignature.Web;
48
- using ItEnterprise.DigitalSignature.Models;
49
-
50
- namespace TestApp.Web.NetFramework
51
- {
52
- public class Global : System.Web.HttpApplication
53
- {
54
- protected void Application_Start(object sender, EventArgs e)
55
- {
56
- this.UseDigitalSignature(ds => ds
57
- // Путь, по которому будет доступно API ЕЦП
58
- .MapRoute("api/ds/")
59
- // Ссылка на веб-сервисы. Необходимо для обновления коревых сертификатов и списка ЦСК
60
- .SetWsUri("https://m.it.ua/ws")
61
- .SetConfig(new DigitalSignatureConfiguration
62
- {
63
- // Использовать нативные библиотеки. true, если будет использоваться C# API ЕЦП. Нативные библиотеки необходимо устанавливать отдельными nuget пакетами
64
- UseNativeLibraries = false,
65
- GlSign = new GlSignInfo {
66
- // Разрешать использовать тестовые ключи
67
- AllowTestKeys = true
68
- }
69
- }));
70
- }
71
- }
72
- }
73
- ```
74
-
75
47
  # Установка
76
48
 
77
49
  [@it-enterprise/digital-signature](https://www.npmjs.com/package/@it-enterprise/digital-signature)
@@ -94,34 +66,71 @@ import {
94
66
 
95
67
  # Инициализация
96
68
 
97
- ## Для GraphQL приложений
98
-
69
+ Смена типа библиотеки
99
70
  ```javascript
100
- import auth from '@it-enterprise/jwtauthentication';
101
-
102
71
  const ds = new DigitalSignature(
103
- new Models.GraphQlSettingProvider(
104
- "uk", // Язык ошибок
105
- userId, // id пользователя (для сохранения ключей и предпочитаемого типа ключа)
106
- "https://m.it.ua/GraphQlServer/", // Адрес сервера GraphQl
107
- "https://m.it.ua/ws/", // Адрес веб-сервисов
108
- auth) // Библиотека @it-enterprise/jwtauthentication
72
+ new Models.DefaultSettingProvider(
73
+ "uk", // Язык ошибок (строка, или функция, возвращающая строку)
74
+ userId, // id пользователя (для сохранения ключей и предпочитаемого типа ключа) (строка, или функция, возвращающая строку)
75
+ location.pathname + "api/ds/") // Путь к API ЕЦП
109
76
  );
110
- await ds.initialise();
77
+ Возвращает текущий тип ключа (файловый, аппаратный, облачный)
78
+ const currentKeyType = await ds.initialise();
79
+ ```
80
+ Сменить тип библиотеки
81
+ ```javascript
82
+ /** Подпись файловыми ключами, через облачные сервисы */
83
+ export const DigitalSignatureLibraryTypeJS = 0;
84
+ /** Подпись аппартными ключами */
85
+ export const DigitalSignatureLibraryTypeSW = 1;
86
+ /**
87
+ * Типы библиотеки
88
+ */
89
+ export const DigitalSignatureLibraryType = {
90
+ /** Подпись файловыми ключами и через облачные сервисы */
91
+ JS: DigitalSignatureLibraryTypeJS,
92
+ /** Подпись аппартными ключами */
93
+ SW: DigitalSignatureLibraryTypeSW
94
+ };
95
+
96
+ await ds.setLibraryType(type);
111
97
  ```
112
98
 
113
- ## Для остальных приложений
99
+ # Центры сертификации ключей
114
100
 
101
+ Получение списка сертификации ключей
115
102
  ```javascript
116
- const ds = new DigitalSignature(
117
- new Models.DefaultSettingProvider(
118
- "uk", // Язык ошибок
119
- userId, // id пользователя (для сохранения ключей и предпочитаемого типа ключа)
120
- location.pathname + "api/ds/", // Путь к API ЕЦП
121
- glSign) // Значение глобального параметра GlSign в виде строки или обьекта Models.GlSign
122
- );
123
- await ds.initialise();
103
+ const cas = await ds.getCAs();
124
104
  ```
105
+ Установить центр сертификации ключей
106
+ ```javascript
107
+ // Предоставить возможность пользователю выбирать ЦСК. Для автоматического определения ЦСК установить значение null
108
+ const ca = cas[0];
109
+ await ds.setCA(ca);
110
+
111
+ ```
112
+ Проверить, поддерживает ли ЦСК автоматическую загрузку сертификатов
113
+ Если ЦСК не поддерживает автоматическую загрузку сертификатов, нужно предоставить возможность пользователю вручную указать сертификаты
114
+ ```javascript
115
+ const needCerts = ds.needPrivateKeyCertificates();
116
+ ```
117
+ Структура объекта CASettings
118
+ ```javascript
119
+ class CASettings {
120
+ // Названия ЦСК (обычно используется первое из списка)
121
+ issuerCNs: Array<string>;
122
+ address: string;
123
+ ocspAccessPointAddress: string;
124
+ ocspAccessPointPort: string;
125
+ cmpAddress: string;
126
+ tspAddress: string;
127
+ tspAddressPort: string;
128
+ directAccess: boolean;
129
+ certsInKey: boolean;
130
+ cmpCompatibility: number;
131
+ qscdSNInCert: boolean;
132
+ }
133
+ ```
125
134
 
126
135
  # Файловые ключи
127
136
 
@@ -190,50 +199,87 @@ const keyInfo = await ds.readHardwareKey(
190
199
  );
191
200
  ```
192
201
 
193
- # MobileID
202
+ # Облачные ключи
194
203
 
195
- Считывание ключа
204
+ Провайдеры облачныч ключей есть 2х видов: работающие через QR код (Дія.Підпис, SmartID, CloudKey) и через ID пользователя (DepositSign, ESign, Вчасно)
205
+ Получение списока провайдеров облачных ключей
196
206
 
197
207
  ```javascript
198
- const keyInfo = await ds.readPrivateKeySIM(
199
- // Номер телефона пользователя
200
- phone,
201
- // Оператор. Kyivstar - 1, Vodafone - 2, Lifecell - 3
202
- operatorId,
203
- // Номер ключа. Для Kyivstar всегда 0, для Vodafone и Lifecell: физ. лицо - 1, юр. лицо - 2
204
- keyId,
205
- // Получать информацию о сертификатах пользователя.
206
- // true - поля ownerInfo и certificates будут заполены, но пользователь получит дополнительный запрос на подписание
207
- // false - поля ownerInfo и certificates будут пустыми, но пользователь не получит дополнительный запрос на подписание
208
- false);
208
+ const ksps = ds.KSPs;
209
209
  ```
210
210
 
211
- # DepositSign
211
+ Содержимое обьекта KSP
212
212
 
213
- Считывание ключа
213
+ ```javascript
214
+ class KSPSettings {
215
+ // Название провайдера
216
+ name: string;
217
+ // Провайдер работает через QR код или через ID пользователя
218
+ needQRCode: boolean;
219
+ // Тип ID пользователя (имя пользователя/телефон/email)
220
+ clientIdType?: EndUserKSPClientIdType;
221
+ ksp: EndUserKSP;
222
+ address?: string;
223
+ port?: string;
224
+ directAccess?: boolean;
225
+ clientIdPrefix?: string;
226
+ confirmationURL?: string;
227
+ mobileAppName?: string;
228
+ pollingInterval?: number;
229
+ systemId?: string;
230
+ }
231
+ ```
232
+
233
+ Для ключей, работающих через QR код, после инициализации библиотеки нужно подписаться на событие подтверждения операции
214
234
 
215
235
  ```javascript
216
- const keyInfo = await ds.readPrivateKeyDepositsign(
217
- // Идентификатор пользователя (номер телефона или email)
218
- phone,
219
- // Получать информацию о сертификатах пользователя.
220
- // true - поля ownerInfo и certificates будут заполены, но пользователь получит дополнительный запрос на подписание
221
- // false - поля ownerInfo и certificates будут пустыми, но пользователь не получит дополнительный запрос на подписание
222
- false);
236
+ ds.addConfirmKSPOperationEventListener(eventArgs => { ... });
237
+ ```
238
+
239
+ Событие будет вызываться при:
240
+ 1. Считывании ключа с getCerts = true
241
+ 2. Подписании данных
242
+
243
+ **Важно!** При необходимости подписать несколько файлов, нужно передавать их в функцию подписания все за раз в массиве. Иначе пользователю придётся подтверждать подписание каждого файла отдельно
244
+
245
+
246
+ Структура объекта, приходящего в коллбек события
247
+ ```javascript
248
+ class EndUserConfirmKSPOperationEvent {
249
+ // Ссылка на подтверждение операции
250
+ url: string;
251
+ // QR код в формате data:image/bmp для подстановки в <img scr='...' />
252
+ qrCode: string;
253
+ // Название мобильного приложения, в котором нужно подтвердить выполнение операции
254
+ mobileAppName: string;
255
+ // Время, до которого действует ссылка
256
+ expireDate: Date;
257
+ }
223
258
  ```
259
+ QR код нужно отобразить пользовтелю, что бы он мог отсканировать его в приложении и подтвердить подписание
260
+ Для отображения QR кода можно использовать содержимое поля qrCode, либо сгенерировать его на основе ссылки из поля url
261
+ Для мобильных устройств должна быть возможность переходя по ссылке из поля url, для возможности сразу запустить соответствующее приложение
224
262
 
225
- # Дiя
226
263
 
227
264
  Считывание ключа
228
265
 
229
266
  ```javascript
230
- const keyInfo = await ds.readPrivateKeyDiia(
231
- // Получать информацию о сертификатах пользователя.
232
- // true - поля ownerInfo и certificates будут заполены, но пользователь получит дополнительный запрос на подписание
233
- // false - поля ownerInfo и certificates будут пустыми, но пользователь не получит дополнительный запрос на подписание
234
- false);
267
+ // Предоставить пользователю возможность выбрать провайдера ключей
268
+ const ksp = ds.KSPs[0];
269
+
270
+ const keyInfo = await ds.readPrivateKeyKSP(
271
+ // Объект KSP из списка ds.KSPs
272
+ ksp
273
+ // Идентификатор пользователя - для провайдеров ключей, работающих через ID пользователя
274
+ // Для провайдеров ключей, работающих через QR код - null
275
+ userID,
276
+ // Получать информацию о сертификатах пользователя
277
+ // true - поля ownerInfo и certificates в keyInfo будут заполены, но пользователю нужно будет подтвердить дополнительную операцию подписания
278
+ // false - поля ownerInfo и certificates в keyInfo будут пустыми, но пользователь не получит дополнительный запрос на подписание
279
+ getCerts = false);
235
280
  ```
236
281
 
282
+
237
283
  # Сохранение ключей
238
284
 
239
285
  Сохранить ключ
@@ -262,16 +308,166 @@ await ds.removeStoredPrivateKeyInfo(
262
308
  keyId
263
309
  ```
264
310
 
265
- # Подписание
311
+ # Создание подписей
312
+
313
+ ## Формат подписи
314
+
315
+ Функции создания подписей поддерживают возможность выбирать формат контейнера подписи
316
+ Формат подписи указывается в опциональном параметре signFormat
317
+ По умолчанию используется формат подписи CAdES Detached
318
+
319
+ Структура объекта, описывающего формат подписи
320
+
321
+ ```javascript
322
+ class EndUserSignContainerInfo {
323
+ // Тип контейнера подписи
324
+ type: EndUserSignContainerType;
325
+ // Уточняющий тип подписи
326
+ subType: EndUserCAdESType | EndUserXAdESType | EndUserASiCType;
327
+ // Тип подписи в ASiC контейнере (только для ASiC контейнеров)
328
+ asicSignType: EndUserASiCSignType;
329
+ }
330
+ ```
331
+ Типы контейнеров подписи
332
+ ```javascript
333
+ const EU_SIGN_CONTAINER_TYPE_CADES = 1;
334
+ const EU_SIGN_CONTAINER_TYPE_XADES = 2;
335
+ const EU_SIGN_CONTAINER_TYPE_PADES = 3;
336
+ const EU_SIGN_CONTAINER_TYPE_ASIC = 4;
337
+ enum EndUserSignContainerType {
338
+ // CMS подпись в двоичном формате. Используется по умолчанию
339
+ CAdES,
340
+ // Подпись в формате XML. Может содержать одновременно несколько наборов данных
341
+ XAdES,
342
+ // Подпись в PDF документе (Работает только с PDF файлами)
343
+ PAdES,
344
+ // Контейнер для подписей в виде ZIP-архива
345
+ ASiC
346
+ }
347
+ ```
348
+ Типы подписей CAdES
349
+ ```javascript
350
+ const EU_CADES_TYPE_DETACHED = 1;
351
+ const EU_CADES_TYPE_ENVELOPED = 3;
352
+ enum EndUserCAdESType {
353
+ // Подпись отдельно от данных (внешняя подпись). Используется по умолчанию
354
+ Detached,
355
+ // Подпись в одном контейнере с данными (внутренняя подпись)
356
+ Enveloped
357
+ }
358
+ ```
359
+ Типы подписей XAdES
360
+ ```javascript
361
+ const EU_XADES_TYPE_DETACHED = 1;
362
+ const EU_XADES_TYPE_ENVELOPED = 3;
363
+ enum EndUserXAdESType {
364
+ // Подпись отдельно от данных (внешняя подпись)
365
+ Detached,
366
+ // Подпись в одном контейнере с данными (внутренняя подпись)
367
+ Enveloped
368
+ }
369
+ ```
370
+ Типы контейнеров ASiC
371
+ ```javascript
372
+ const EU_ASIC_TYPE_S = 1;
373
+ const EU_ASIC_TYPE_E = 2;
374
+ enum EndUserASiCType {
375
+ // Простой контейнер, содержащий 1 файл с данными и 1 подпись
376
+ S,
377
+ // Расширенный контейнер, может содержать несколько файлов с данными и несколько подписей
378
+ E
379
+ }
380
+ ```
381
+ Типы подписей, которые могут содержаться в ASiC контейнере
382
+ ```javascript
383
+ const EU_ASIC_SIGN_TYPE_CADES = 1;
384
+ const EU_ASIC_SIGN_TYPE_XADES = 2;
385
+ enum EndUserASiCSignType {
386
+ CAdES,
387
+ XAdES
388
+ }
389
+ ```
390
+
391
+ Пример использования формата подписи:
392
+ ```javascript
393
+ const file = {
394
+ name: "file.pdf",
395
+ val: "ссылка на загрузку файла"
396
+ };
397
+ // Формат ASiC-S с подписью XAdES
398
+ const asicsformat = {
399
+ type: EndUserSignContainerType.ASiC,
400
+ subType: EndUserASiCType.S,
401
+ asicSignType: EndUserASiCSignType.XAdES
402
+ };
403
+ // Формат PAdES
404
+ const padesformat = {
405
+ type: EndUserSignContainerType.PAdES,
406
+ };
407
+ // Внутренняя CAdES подпись
408
+ const cadesformat {
409
+ type: EndUserSignContainerType.CAdES,
410
+ subType: EndUserCAdESType.Enveloped
411
+ };
412
+
413
+ const asics = await ds.signFile(file, asicsformat);
414
+ const pades = await ds.signFile(file, padesformat);
415
+ const cades = await ds.signFile(file, cadesformat);
416
+ ```
417
+
418
+ const signatures = await ds.signFile(files);
419
+
420
+ ## Формат передачи данных
421
+
422
+ Все функции создания подписей поддерживают следующие форматы передачи данных:
423
+ 1. Одиночный набор данных (в зависимости от функции - ссылка на загрузку файла, данные в base64 или Uint8Array и т.д.)
424
+ 2. Данные в массиве (данные как в п.1, только в массиве). Подписи так же будут возвращены в массиве
425
+ 3. Именованные данные (данные в объекте NamedData, содержащем имя набора данных и сами данные). Подпись так же будет возвращена в объекте NamedData
426
+ 4. Именованные данные в массиве (данные как в п.3, только в массиве). Результатом выполения функций будет являться массив обьектов NamedData с подписями
427
+ **Для лучшей поддержки всех форматов подписей и типов ключей, рекомендуется использовать формат из п.4**
428
+
429
+ Структура объекта NamedData
430
+ ```javascript
431
+ declare type NamedData = {
432
+ // Имя набора данных
433
+ name: string;
434
+ // В качестве параметра при создании подписи: в зависимости от функции - ссылка на загрузку файла, данные в base64 или Uint8Array и т.д.
435
+ // В качестве возвращаемого результата: контейнер с подписью
436
+ val: string | Uint8Array;
437
+ };
438
+ ```
439
+ Пример использования формата именованных данных
440
+ ```javascript
441
+ const files = [{
442
+ name: "file1.docx",
443
+ val: "ссылка на загрузку первого файла"
444
+ }, {
445
+ name: "file2.pdf",
446
+ val: "ссылка на загрузку второго файла"
447
+ }];
448
+
449
+ const signatures = await ds.signFile(files);
450
+ console.log(signatures);
451
+ // Результат
452
+ [{
453
+ name: "file1.docx",
454
+ val: "подпись первого файла"
455
+ }, {
456
+ name: "file2.pdf",
457
+ val: "подпись второго файла"
458
+ }]
459
+ ```
460
+
461
+ ## Функции для создания подписей
266
462
 
267
463
  Подписание данных
268
464
 
269
465
  ```javascript
270
466
  const sign = await ds.signData(
271
- // Данные в виде Uint8Array или строки base64. Можно передавать данные в массиве
467
+ // Данные в виде Uint8Array или строки base64
272
468
  data,
273
- // true - внутренняя подпись, false - внешняя. по умолчанию false
274
- false,
469
+ // Формат подписи
470
+ signFormat,
275
471
  // true - вернуть результат в виде массива байт,false - в виде строки base64. по умолчанию false
276
472
  false);
277
473
  ```
@@ -280,34 +476,30 @@ const sign = await ds.signData(
280
476
 
281
477
  ```javascript
282
478
  const sign = await ds.signFile(
283
- // Ссылка на загрузку файла (например, с веб-сервисов). Можно передать массив ссылок
479
+ // Ссылка на загрузку файла (например, с веб-сервисов)
284
480
  data,
285
- // true - внутренняя подпись, false - внешняя. по умолчанию false
286
- false,
481
+ // Формат подписи. [Формат подписи]
482
+ signFormat,
287
483
  // true - вернуть результат в виде массива байт,false - в виде строки base64. по умолчанию false
288
484
  false);
289
485
  ```
290
486
 
291
- Подписание хеша
487
+ Подписание хеша в формате CAdES Detached
292
488
 
293
489
  ```javascript
294
490
  const sign = await ds.signHash(
295
- // Хеш в виде Uint8Array или строки base64. Можно передавать данные в массиве
296
- data,
297
- // true - внутренняя подпись, false - внешняя. по умолчанию false
298
- false,
491
+ // Хеш в виде Uint8Array или строки base64
492
+ hash,
299
493
  // true - вернуть результат в виде массива байт,false - в виде строки base64. по умолчанию false
300
494
  false);
301
495
  ```
302
496
 
303
- Подписание хеша из файла
497
+ Подписание хеша из файла в формате CAdES Detached
304
498
 
305
499
  ```javascript
306
500
  const sign = await ds.signFileHash(
307
- // Ссылка на загрузку файла с хешем. Можно передать массив ссылок
501
+ // Ссылка на загрузку файла с хешем
308
502
  data,
309
- // true - внутренняя подпись, false - внешняя. по умолчанию false
310
- false,
311
503
  // true - вернуть результат в виде массива байт,false - в виде строки base64. по умолчанию false
312
504
  false);
313
505
  ```
@@ -316,28 +508,26 @@ const sign = await ds.signFileHash(
316
508
 
317
509
  ```javascript
318
510
  const sign = await ds.signDataEx(
319
- // Данные в виде Uint8Array или строки base64. Можно передавать данные в массиве
511
+ // Данные в виде Uint8Array или строки base64
320
512
  data,
321
- // true - внутренняя подпись, false - внешняя. по умолчанию false
322
- false);
513
+ // Формат подписи
514
+ signFormat);
323
515
  ```
324
516
 
325
517
  Подписание файла с получением информации о подписи
326
518
 
327
519
  ```javascript
328
520
  const sign = await ds.signFileEx(
329
- // Ссылка на загрузку файла (например, с веб-сервисов). Можно передать массив ссылок
521
+ // Ссылка на загрузку файла (например, с веб-сервисов)
330
522
  data,
331
- // true - внутренняя подпись, false - внешняя. по умолчанию false
332
- false);
523
+ // Формат подписи
524
+ signFormat);
333
525
  ```
334
526
 
335
- Подписание хеша с получением информации о подписи
527
+ Подписание хеша в формате CAdES Detached с получением информации о подписи
336
528
 
337
529
  ```javascript
338
530
  const sign = await ds.signHashEx(
339
- // Хеш в виде Uint8Array или строки base64. Можно передавать данные в массиве
340
- data,
341
- // true - внутренняя подпись, false - внешняя. по умолчанию false
342
- false);
531
+ // Хеш в виде Uint8Array или строки base64
532
+ data);
343
533
  ```