новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Безопасность данных при обмене между сервером 1С и веб-клиентом

  • Добавить свою публикацию
  • для этого требуется регистрация

13 июля 2024
(c) chel1c@yandex.ru

 Безопасность передачи данных между сервером 1С и веб-клиентом

Архитектура обмена информацией

Оглавление

Суть проблемы

1. Общие сведения о инфраструктуре открытых ключей

1.1. Протоколы передачи гипертекста HTTP, HTTPS

1.2. Заметка о протоколе QUIC

1.3. Проблемы включения шифрования всех данных в HTTPS

2. А что с данными? Они подписаны, но не зашифрованы. Что с этим можно сделать?

2.1. Включение шифрования всех данных в HTTPS, покупка пользовательских сертификатов для браузера

2.2. Предлагаемое мной решение: выборочное шифрование данных. Пример.

3. Что сейчас реализованно в платформе 1С.

 

Суть проблемы

Грядёт век  IoT, век высокоскоростной инфраструктуры, а в законах имеются сведения о работе ККМ (контрольные кассовые машины) в режиме оффлайн.

Некоторые компании, используя веб-клиент (в т.ч. при эксплуатации 1С в файловом режиме),  забывают о покупке браузерных сертификатов пользователей transport layer security  для своих работников и внешних пользователей.

Кроме этого основной акцент статьи направлен на проблему ускорения обмена данными между сервером 1С и веб-клиентом за счёт выборочного шифрования данных, передаваемых через гипертекстовый протокол, возможное решение указано в пункте 2.2.

 

1. Общие сведения о инфраструктуре открытых ключей

Подробная теория в Public-Key Cryptography Standards.

Определение из ГОСТ Р 55811-2013 "Управление сертификатами для финансовых услуг. Сертификаты открытых ключей.":

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

Изображение

Рис.1 Пользователи и удостоверяющий центр (с) Журнал хакер (https://xakep.ru/2016/03/11/pki/)


 

Изображение

Рис.2 У Алисы и Боба должна иметься своя пара ключей - открытый и закрытый

1.1. Протокол передачи гипертекста HTTPS

Справочно. Спецификация протокола:  RFC 2818 HTTP Over TLS

Для работы с сертификатами и шифрованием в протоколе HTTPS имеются все встроенные средства. Протокол  может шифровать все передаваемые данные, для этого требуется установить определённые настройки в программном обеспечении машин клиента и сервера. По умолчанию выполняется только подписывание данных сервера, а шифрование не выполняется. Т.к. у большинства пользователtй Интернета отсутствуют сертификаты TLS; и шифрование данных препятствует кешированию ресурсов (веб-страниц), что является существенной проблемой даже для таких крупных компаний как Яндекс и Google. Для них проблемой является даже кеширование списка отзыва сертификатов, ответов сервисов проверки сертификатов и штампов времени.

 

1.2. Заметка о протоколе QUIC

Справочно. RFC 9114: HTTP/3, RFC 9000 QUIC: A UDP-Based Multiplexed and Secure Transport

 С критикой протокола QUIC можно ознакомиться в этом ресуре: На замену TCP: протокол QUIC готов для внедрения [но не готов стать RFC] (https://habr.com/ru/companies/vasexperts/articles/429380/).

 

1.3. Проблемы включения шифрования всех данных в HTTPS

Какие есть проблемы:

  • Препятствует кешированию ресурсов Интернета;
  • Повышает нагрузку выполняющих шифрование машин;
  • Замедляет обмен данными;
  • У пользователей браузеров отсутствуют сертификаты TLS.

 Кроме того имеются традиционные проблемы у сервера:

  • Проблемы сервера по обработке списков отзыва сертификатов, по проверке штампов времени.

Существенны ли проблемы для пользователей 1С? Зависит от материальных возможностей. Помимо этого нельзя забывать про внешних пользоваталей, сотрудников других организаций, им тоже нужны сертификаты transport layer security.

 

2. А что с данными? Они подписаны, но не зашифрованы. Что с этим можно сделать?

Имеются два решения:

2.1. Включение шифрования всех данных в HTTPS, покупка пользовательских сертификатов для браузера

С этим пунктом уже должно быть всё понятно.

2.2. Предлагаемое мной решение: выборочное шифрование данных в 1С.

1. Не использовать  шифрование данных в гипертекстовом протоколе, использовать только подпись.

2. Необходимо использовать сертификаты transport layer security для сервера и всех работающих через веб-клиент 1С пользователей, требуется покупка сертификатов.

3. Шифровать только важные данные при передаче между веб-клиентом и сервером для ускорения передачи данных, т.к. программному обеспечению нижележащих уровней инфраструктуы их не потребуется расшифровывать, а потребуется только вычислять сумму хеш.

 

Как это выглядит?
Перед передачей важных данных от клиента серверу вызывать клиентскую  функцию шифрования данных по открытому ключу серверного сертификата, т.е. перед вызовом сервера. А при получении данных сервером расшифровывать эти данные серверной функцией  и закрытым ключом сервера.

И наоборот. Перед передачей важных данных с сервера клиенту вызывать серверную функцию шифрования данных по открытому ключу клиентского сертификата, т.е. при передаче контекста исполнения кода клиенту. А в клиентском коде вызывать функцию расшифрования закрытым ключом клиентского сертификата.

Пример (просто заготовка кода, это не образец для работы)

// Некая процедура, обрабатывающая табличный документ на клиенте
//
// Параметры 
// нет
//
&НаКлиенте
Процедура ОбработатьДанныеФизлиц()
    
    ТабличныйДокументСписокИННСНИЛСНомерИСерияПаспорта = Новый ТабличныйДокумент;
    // Условное получение табличного документа из формы
    // ТабличныйДокументСписокИННСНИЛСНомерИСерияПаспорта
    ТабличныйДокумент = ТабличныйДокументСписокИННСНИЛСНомерИСерияПаспорта;
    
    ДанныеСредствКриптографии = ПолучитьДанныеСредстваКриптографииДляКлиента();
    ИмяКП = ДанныеСредствКриптографии.ИмяКП;
    ТипКП = ДанныеСредствКриптографии.ТипКП;
    ПарольЗакрытогоКлюча = ДанныеСредствКриптографии.ПарольЗакрытогоКлюча;
    Отпечаток = ДанныеСредствКриптографии.Отпечаток;
    
    ПотокФайла = Новый ПотокВПамяти();
    ТабличныйДокумент.Записать(ПотокФайла);
    ДвоичныеДанные = ПотокФайла.ЗакрытьИПолучитьДвоичныеДанные();
    
    ЗашифрованныеДанные = ЗашифроватьДанныеНаКлиенте(ДвоичныеДанные, ИмяКП, ТипКП, Отпечаток);
    
    ЗашифрованныеДанные = ПолучитьДанныеФизлицССервера(ЗашифрованныеДанные);
    ПолныеДанныеФизЛица = РасшифроватьДанныеНаКлиенте(ЗашифрованныеДанные, ПарольЗакрытогоКлюча, ИмяКП, ТипКП);
    // Условная обработка данных
    // ЗашифрованныеДанные
    
КонецПроцедуры

// Некая функция, находящая и обрабатывающая данные в табличном документе
//
// Параметры
//  ЗашифрованныеДанные  - зашифрованный данные формата PKCS#7 закодированные в Base64.
//// Возвращаемое значение: 
//  Зашифрованный данные формата PKCS#7 закодированные в Base64.
//
&НаСервере
Функция ПолучитьДанныеФизлицССервера(ЗашифрованныеДанные)
    
    ДанныеСредствКриптографии = ПолучитьДанныеСредстваКриптографииДляСервера();
    ИмяКП = ДанныеСредствКриптографии.ИмяКП;
    ТипКП = ДанныеСредствКриптографии.ТипКП;
    ПарольЗакрытогоКлюча = ДанныеСредствКриптографии.ПарольЗакрытогоКлюча;
    Отпечаток = ДанныеСредствКриптографии = Отпечаток;
    
    ФизЛица = РасшифроватьДанныеНаСервере(ЗашифрованныеДанные, ПарольЗакрытогоКлюча, ИмяКП, ТипКП);
    // Выполняем запрос по данным
     // ..
     Результат = "";
    // 
    
    Возврат ЗашифроватьДанныеНаСервере(Результат, ИмяКП, ТипКП, Отпечаток)
    
КонецФункции

#Область ФункцииШифрования

// Функция выполняет шифрование данных.в клиентском звене системы
//
// Параметры
//  Данные  - ДвоичныеДанные - данные для шифрования;
//  Отпечаток  - Строка - отпечаток сертификата закодированный в Base64;
//  ИмяКП  - Строка - имя модкля криптографии;
//  ТипКП  - Строка - Тип модуля криптографии.
//
// Возвращаемое значение:
//   Строка   - зашифрованный данные формата PKCS#7 закодированные в Base64.
//
&НаКлиенте
Функция ЗашифроватьДанныеНаКлиенте(Данные, ИмяКП, ТипКП, Отпечаток)
    
     МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП);
     
     ТипХранилища = ТипХранилищаСертификатовКриптографии.КорневыеСертификаты;
    РасположениеХранилища = РасположениеХранилищаСертификатовКриптографии.ДанныеКомпьютера;
    
     ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища, РасположениеХранилища);

     Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(Base64Значение(Отпечаток));
     
     ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(Данные, Сертификат);
     ЗашифрованныеДанные = МенеджерКриптографии.Подписать(ЗашифрованныеДанные, Сертификат);
      
     Возврат Base64Строка(ЗашифрованныеДанные);
     
КонецФункции

// Функция выполняет расшифровку данных в клиентском звене системы
//
// Параметры
//  Данные  - ДвоичныеДанные - зашифрованный данные формата PKCS#7 закодированные в Base64;
//  ПарольЗакрытогоКлюча  - Строка - пароль к контейнеру закрытого ключа;
//  ИмяКП  - Строка - имя модкля криптографии;
//  ТипКП  - Строка - Тип модуля криптографии.
//
// Возвращаемое значение:
//   ДвоичныеДанные   - расшифрованные  данные.
//
&НаКлиенте
Функция РасшифроватьДанныеНаКлиенте(Данные, ПарольЗакрытогоКлюча, ИмяКП, ТипКП)
    
    
     МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП); 
     МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ПарольЗакрытогоКлюча;
     
     РасшифрованныеДанные = МенеджерКриптографии.Расшифровать(Base64Значение(Данные));
      
     Возврат РасшифрованныеДанные;
     
КонецФункции

// Функция выполняет шифрование данных.в серверном звене системы
//
// Параметры
//  Данные  - ДвоичныеДанные - данные для шифрования;
//  Отпечаток  - Строка - отпечаток сертификата закодированный в Base64;
//  ИмяКП  - Строка - имя модкля криптографии;
//  ТипКП  - Строка - Тип модуля криптографии.
//
// Возвращаемое значение:
//   Строка   - зашифрованный данные формата PKCS#7 закодированные в Base64.
//
&НаСервере
Функция ЗашифроватьДанныеНаСервере(Данные, ИмяКП, ТипКП, Отпечаток)
    
     МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП);
     
     ТипХранилища = ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты;
    РасположениеХранилища = РасположениеХранилищаСертификатовКриптографии.ДанныеКомпьютера;
    
     ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища, РасположениеХранилища);

     Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(Base64Значение(Отпечаток));
     
     ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(Данные, Сертификат);
     ЗашифрованныеДанные = МенеджерКриптографии.Подписать(ЗашифрованныеДанные, Сертификат);
      
     Возврат Base64Строка(ЗашифрованныеДанные);
     
КонецФункции

// Функция выполняет расшифровку данных в ссерверном звене системы
//
// Параметры
//  Данные  - ДвоичныеДанные - зашифрованный данные формата PKCS#7 закодированные в Base64;
//  ПарольЗакрытогоКлюча  - Строка - пароль к контейнеру закрытого ключа;
//  ИмяКП  - Строка - имя модкля криптографии;
//  ТипКП  - Строка - Тип модуля криптографии.
//
// Возвращаемое значение:
//   ДвоичныеДанные   - расшифрованные  данные.
//
&НаСервере
Функция РасшифроватьДанныеНаСервере(Данные, ПарольЗакрытогоКлюча, ИмяКП, ТипКП)
    
    ПарольЗакрытогоКлюча = "";
    
     МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП); 
     МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ПарольЗакрытогоКлюча;
     
     РасшифрованныеДанные = МенеджерКриптографии.Расшифровать(Base64Значение(Данные));
      
     Возврат РасшифрованныеДанные;
     
КонецФункции

#КонецОбласти

 

 

3. Что сейчас реализованно в платформе 1С

В платформе отсутствуют настройки динамических списков для выборочного шифрования некоторых важных списков.

 
0
Еще от автора
≡ к списку статей