Тип: СпособВыбораСертификатаОС. Способ выбора клиентского сертификата из подходящих для данного соединения.
Полное описание, параметры и ограничения
СертификатКлиентаОС.СпособВыбораСертификатаОС (OSClientCertificate.OSCertificateSelectMode)
СертификатКлиентаОС (OSClientCertificate)
СпособВыбораСертификатаОС (OSCertificateSelectMode)
Доступен, начиная с версии 8.3.21.
Использование:
Только чтение.
Описание:
Тип: СпособВыбораСертификатаОС.
Способ выбора клиентского сертификата из подходящих для данного соединения.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.21.
Методическая информация
Практические примеры
Сравнить системные источники сертификатов и собрать три TLS-профиля без сетевого подключения
Учебный диагностический пульт показывает разницу между CA-доверием и клиентской идентификацией, между Авто и Выбирать, между платформенными источниками и переносимым контрактом TLS8.5.
Где и как запускать
Полный модуль основной управляемой формы внешней обработки УчебныеTLS85. Клиентские конструкторы не переносите на сервер. Результат — офлайн-паспорта, не сетевой тест.
Подготовка
Создайте свою отдельную учебную VM и новую пустую базу8.5.1.1343 с именем конфигурации УчебныеTLSПрофили85. Русский встроенный язык, управляемый интерфейс Такси, совместимость Не использовать. Не копируйте рабочую конфигурацию, не добавляйте предметные объекты, расширения или фоновые задания: полный серверный guard их отвергает.
Создайте внешнюю обработку УчебныеTLS85, основную управляемую форму, реквизит Статус85: Строка длиной0 и многострочное поле ТолькоПросмотр. Создайте команду СравнитьПрофили85, назначьте одноименное действие и кнопку, ИзменяетСохраняемыеДанные выключите. Назначьте обработчики ПриСозданииНаСервере и ПриОткрытии. Вставьте весь код в модуль этой формы, не внутрь уже созданной процедуры.
Запускайте вручную только настольным тонким/толстым управляемым клиентом8.5.1.1343 внутри своей VM. Сертификаты читаются на стороне клиента под его учетной записью, не из серверного пользователя службы1С. Для каждой ОС нужна отдельная собственная VM с установленным клиентом8.5; Windows-успех не подтверждает Linux/macOS.
Для чтения системных CA достаточно доступного стандартного хранилища данной VM. Не импортируйте сертификаты из production. На Linux системные CA — PEM в /etc/ssl/certs; при большом каталоге создание источника может быть медленным. Для клиентского источника Linux/macOS может понадобиться поддерживаемый CryptoPro CSP: если провайдер отсутствует, ошибка остается ошибкой, ее не скрывают пустым успешным профилем.
Для этого офлайн-этапа не нужен сервер, URL, пароль или готовый личный сертификат: источники создаются конструкторами здесь. Источник с режимом Выбирать не равен уже выбранному сертификату. Не выполняйте сетевой handshake, не устанавливайте ключи и не меняйте доверие ОС. Сертификаты, закрытые ключи и содержимое системного хранилища не выводятся.
&НаКлиенте
Перем ЦентрыОС85;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверитьСвойПустойСтенд();
Статус85 = "Профили еще не созданы. Соединение не выполняется";
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЦентрыОС85 = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура СравнитьПрофили85(Команда)
Статус85 = "Проверка не завершена";
ПроверитьСеанс85();
#Если ТонкийКлиент Или ТолстыйКлиентУправляемоеПриложение Тогда
Система = Новый СистемнаяИнформация;
Платформа = Система.ТипПлатформы;
Если Платформа = ТипПлатформы.Windows_x86 Или Платформа = ТипПлатформы.Windows_x86_64 Тогда
СравнитьWindows85();
ИначеЕсли Платформа = ТипПлатформы.MacOS_x86 Или Платформа = ТипПлатформы.MacOS_x86_64 Тогда
СравнитьMacOS85();
ИначеЕсли Платформа = ТипПлатформы.Linux_x86 Или Платформа = ТипПлатформы.Linux_x86_64
Или Платформа = ТипПлатформы.Linux_ARM64 Или Платформа = ТипПлатформы.Linux_E2K Тогда
СравнитьLinux85();
Иначе
ВызватьИсключение "Эта платформа не входит в проверенный список настольного урока";
КонецЕсли;
Если ЦентрыОС85 = Неопределено Тогда
ЦентрыОС85 = Новый СертификатыУдостоверяющихЦентровОС;
КонецЕсли;
КлиентАвто = Новый СертификатКлиентаОС();
КлиентВыбор = Новый СертификатКлиентаОС(СпособВыбораСертификатаОС.Выбирать);
РежимАвто = КлиентАвто.СпособВыбораСертификатаОС;
РежимВыбор = КлиентВыбор.СпособВыбораСертификатаОС;
ЭтоLinux = Платформа = ТипПлатформы.Linux_x86 Или Платформа = ТипПлатформы.Linux_x86_64
Или Платформа = ТипПлатформы.Linux_ARM64 Или Платформа = ТипПлатформы.Linux_E2K;
Если Не ЭтоLinux И (РежимАвто <> СпособВыбораСертификатаОС.Авто
Или РежимВыбор <> СпособВыбораСертификатаОС.Выбирать) Тогда
ВызватьИсключение "Паспорт режима ОС не совпал";
КонецЕсли;
БезКлиента = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, ЦентрыОС85);
АвтоTLS = Новый ЗащищенноеСоединениеOpenSSL(КлиентАвто, ЦентрыОС85);
ВыборTLS = Новый ЗащищенноеСоединениеOpenSSL(КлиентВыбор, ЦентрыОС85);
Если БезКлиента.СертификатКлиента <> Неопределено Тогда
ВызватьИсключение "В профиле без клиентского сертификата неожиданно появился источник";
КонецЕсли;
Если ТипЗнч(БезКлиента.СертификатыУдостоверяющихЦентров) <> Тип("СертификатыУдостоверяющихЦентровОС")
Или ТипЗнч(АвтоTLS.СертификатыУдостоверяющихЦентров) <> Тип("СертификатыУдостоверяющихЦентровОС")
Или ТипЗнч(ВыборTLS.СертификатыУдостоверяющихЦентров) <> Тип("СертификатыУдостоверяющихЦентровОС") Тогда
ВызватьИсключение "Один из профилей потерял системный источник доверия";
КонецЕсли;
Если ТипЗнч(АвтоTLS.СертификатКлиента) <> Тип("СертификатКлиентаОС")
Или ТипЗнч(ВыборTLS.СертификатКлиента) <> Тип("СертификатКлиентаОС") Тогда
ВызватьИсключение "TLS не сохранил тип источника клиентского сертификата";
КонецЕсли;
Если Не ЭтоLinux И (АвтоTLS.СертификатКлиента.СпособВыбораСертификатаОС <> РежимАвто
Или ВыборTLS.СертификатКлиента.СпособВыбораСертификатаОС <> РежимВыбор) Тогда
ВызватьИсключение "TLS не сохранил заявленную политику выбора";
КонецЕсли;
Статус85 = "Паспорта платформы и трех TLS-профилей совпали. Сеть, доверие сервера и наличие личного ключа не проверены";
Сообщить(Статус85);
#Иначе
ВызватьИсключение "Нужен настольный тонкий или толстый управляемый клиент, не веб и не мобильный";
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура СравнитьWindows85()
ЦентрыWindows = Новый СертификатыУдостоверяющихЦентровWindows;
КлиентWindowsАвто = Новый СертификатКлиентаWindows();
КлиентWindowsВыбор = Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать);
Если ТипЗнч(ЦентрыWindows) <> Тип("СертификатыУдостоверяющихЦентровWindows") Тогда
ВызватьИсключение "Не создан системный источник Windows";
КонецЕсли;
Если КлиентWindowsАвто.СпособВыбораСертификатаWindows <> СпособВыбораСертификатаWindows.Авто
Или КлиентWindowsВыбор.СпособВыбораСертификатаWindows <> СпособВыбораСертификатаWindows.Выбирать Тогда
ВызватьИсключение "Режимы Windows не совпали";
КонецЕсли;
Сообщить("Windows: платформенные источники созданы; в TLS8.5 ниже передаются только источники ОС");
КонецПроцедуры
&НаКлиенте
Процедура СравнитьMacOS85()
ЦентрыMacOS = Новый СертификатыУдостоверяющихЦентровMacOS();
КлиентMacOSАвто = Новый СертификатКлиентаMacOS();
КлиентMacOSВыбор = Новый СертификатКлиентаMacOS(СпособВыбораСертификатаMacOS.Выбирать);
Если ТипЗнч(ЦентрыMacOS) <> Тип("СертификатыУдостоверяющихЦентровMacOS") Тогда
ВызватьИсключение "Не создан системный источник macOS";
КонецЕсли;
Если КлиентMacOSАвто.СпособВыбораСертификатаMacOS <> СпособВыбораСертификатаMacOS.Авто
Или КлиентMacOSВыбор.СпособВыбораСертификатаMacOS <> СпособВыбораСертификатаMacOS.Выбирать Тогда
ВызватьИсключение "Режимы macOS не совпали";
КонецЕсли;
Сообщить("macOS: платформенные источники созданы; в TLS8.5 ниже передаются только источники ОС");
КонецПроцедуры
&НаКлиенте
Процедура СравнитьLinux85()
ЦентрыLinux = Новый СертификатыУдостоверяющихЦентровLinux;
КлиентLinux = Новый СертификатКлиентаLinux();
Если ТипЗнч(ЦентрыLinux) <> Тип("СертификатыУдостоверяющихЦентровLinux")
Или ТипЗнч(КлиентLinux) <> Тип("СертификатКлиентаLinux") Тогда
ВызватьИсключение "Не созданы системные источники Linux";
КонецЕсли;
Сообщить("Linux: сертификаты CA читаются в PEM, клиентские ключи зависят от CryptoPro CSP. Режим выбора ОС игнорируется Linux");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСеанс85()
ПроверитьСвойПустойСтенд();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
При открытии пульт проверяет свою пустую конфигурацию. Перед каждой командой guard повторяется на сервере, а версия и ТипПлатформы проверяются отдельно на клиенте. Windows, macOS и Linux выбираются по точным настольным значениям8.5, а не по строке имени компьютера.
Windows-ветвь создает CA-источник Windows и два клиентских источника: конструктор без параметра использует Авто, второй принимает именно СпособВыбораСертификатаWindows.Выбирать. Readonly-свойство проверяет сохраненную политику. Аналогичный разбор macOS использует собственный тип перечисления; смешивать перечисления нельзя.
Linux-ветвь создает реальные CA- и клиентский источники Linux и проверяет их типы. У СертификатКлиентаLinux нет придуманного свойства способа выбора. Оба источника являются описаниями источника данных, не списком найденных сертификатов и не доказательством доступного личного ключа.
Переносимый СертификатКлиентаОС() задает Авто, а явный конструктор задает Выбирать. Свойство СпособВыбораСертификатаОС только читается. В Linux параметр игнорируется: пульт намеренно не требует конкретного значения readonly-паспорта и не обещает диалог. Проверка сохраненного режима выполняется только на Windows/macOS.
СертификатыУдостоверяющихЦентровОС создается один раз для жизни открытой формы и повторно используется во всех трех современных профилях. Платформенные CA выше создаются для отдельной сравнительной диагностики, не для TLS-аргумента. Повторная диагностическая команда повторит эти платформенные конструкторы, что на Linux может быть дорогим: для рабочего кода оставляйте только общий кэшированный источник ОС.
Первый TLS-профиль получает Неопределено как клиентский источник, но всегда получает системные CA. Второй и третий получают собственные реальные СертификатКлиентаОС с разными политиками. По контракту установленной8.5 конструктор OpenSSL принимает клиентские источники ОС/Файл/Криптографии и CA ОС/Файл; платформенные Windows/macOS/Linux-объекты в эти позиции здесь не подставляются.
Проверяем readonly-паспорта всех трех TLS-профилей: CA не потеряны, профиль без идентификации не содержит клиента, два остальных сохранили тип ОС и правильные режимы. Установка CA не равна проверке удаленного сервера. Создание клиентского источника не равняется mTLS-аутентификации. Финальное сообщение строго ограничено паспортами, сетевых методов в модуле нет.
Как проверить результат
В собственной WindowsVM вручную нажмите команду: при успешном создании объектов сообщения показывают Windows и совпадение трех паспортов. В отладчике проверьте тип БезКлиента.СертификатКлиента=Неопределено, у АвтоTLS/ВыборTLS источник ОС и разные политики. Никакого URL или передачи данных быть не должно.
Отдельно повторите в своих Linux/macOSVM. При недоступном провайдере/хранилище получите исключение, Статус85 остается Проверка не завершена. Это неподтвержденный опыт, не успешное отсутствие сертификатов. Текущий урок статически проверен; эти ручные результаты не заявляются заранее.
Повторное нажатие в той же форме не должно повторно создавать ЦентрыОС85: поставьте точку останова на его конструкторе и убедитесь, что переменная уже заполнена. Закройте форму: при следующем открытии новый клиентский источник создается заново, глобального серверного кэша нет.
Для отрицательной проверки в своей копии измените имя учебной конфигурации или добавьте расширение: guard должен остановить команду до клиентских конструкторов. Веб/мобильный контекст и неизвестный ТипПлатформы отказывают, не выбирают случайно Windows.
Ожидаемый результат
В собственной форме подготовлены и проверены паспорта трех TLS-профилей: без клиентского источника, Авто и Выбирать, каждый с системными CA. Никакого подключения, проверки цепочки сервера, отзыва или входа по личному сертификату этот этап не подтверждает.
На что обратить внимание
Не запускайте этот сравнительный пульт в рабочей базе или под рабочей учетной записью: системные источники могут обращаться к реальным хранилищам пользователя. Здесь нет их изменения, импорта, удаления, обхода содержимого или вывода ключей.
CA-доверие и личный сертификат решают разные задачи. Неопределено во втором параметре OpenSSL отключает проверку сертификата сервера — это не допустимое исправление ошибки доверия. Во всех наших профилях CA явно указаны.
Политика Выбирать не обещает диалог при конструкторе, наличие подходящего сертификата, доступ к ключу или успешную авторизацию. На Linux значение режима игнорируется. Не пытайтесь присвоить readonly-свойствам новое перечисление после создания.
Третий параметр проверки отзыва здесь оставлен по умолчанию. Проверка отзыва, имя сервера, время действия, цепочка, права к личному ключу и сетевой handshake требуют отдельного собственного стенда и не считаются проверенными чтением паспортов.
В установленной справке macOS-гейт использует только объявленные MacOS_x86/MacOS_x86_64. Если ваш клиент возвращает иное значение, сначала сверяйте его native-справку, не придумывайте enum и не снимайте отказ. Серверные директивы для конструкторов выбора Windows/macOS не подходят: конкретный конструктор доступен в толстом/тонком клиенте.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.