13 июля 2024
(c) chel1c@yandex.ru
Оглавление
Суть проблемы
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.
Подробная теория в Public-Key Cryptography Standards.
Определение из ГОСТ Р 55811-2013 "Управление сертификатами для финансовых услуг. Сертификаты открытых ключей.":
Инфраструктура открытых ключей (PKI) - это термин, используемый для описания технической, юридической и коммерческой инфраструктуры, которая делает возможным широкое применение технологии открытого ключа. Технология открытого ключа используется для создания электронной подписи и управления симметричными ключами.
Рис.1 Пользователи и удостоверяющий центр (с) Журнал хакер (https://xakep.ru/2016/03/11/pki/)
Рис.2 У Алисы и Боба должна иметься своя пара ключей - открытый и закрытый
Справочно. Спецификация протокола: RFC 2818 HTTP Over TLS
Для работы с сертификатами и шифрованием в протоколе HTTPS имеются все встроенные средства. Протокол может шифровать все передаваемые данные, для этого требуется установить определённые настройки в программном обеспечении машин клиента и сервера. По умолчанию выполняется только подписывание данных сервера, а шифрование не выполняется. Т.к. у большинства пользователtй Интернета отсутствуют сертификаты TLS; и шифрование данных препятствует кешированию ресурсов (веб-страниц), что является существенной проблемой даже для таких крупных компаний как Яндекс и Google. Для них проблемой является даже кеширование списка отзыва сертификатов, ответов сервисов проверки сертификатов и штампов времени.
Справочно. 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С? Зависит от материальных возможностей. Помимо этого нельзя забывать про внешних пользоваталей, сотрудников других организаций, им тоже нужны сертификаты transport layer security.
Имеются два решения:
С этим пунктом уже должно быть всё понятно.
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Значение(Данные)); Возврат РасшифрованныеДанные; КонецФункции #КонецОбласти
В платформе отсутствуют настройки динамических списков для выборочного шифрования некоторых важных списков.