Microsoft enhanced csp создание сертификата для 1с
Самоподписанные сертификаты — это зло, за исключением сертификатов корневых CA. Я об этом говорил, говорю и буду говорить. Но в данном случае мы не преследуем цель создания самоподписанного сертификата. Нас по сути будет интересовать немного другое — рассмотрение принципа, который заложен во многих популярных тулзах как MakeCert или OpenSSL. Лично я не фанат ни первого, ни второго по своим сугубо личным причинам. Но, кроме этих двоих есть ещё утилита CertReq.exe, которая достаточно православная и вряд ли ей грозит вымирание (а жаль). Вобщем, сегодня предлагаю ещё раз поковырять CryptoAPI.
Многие считают, что CryptoAPI — это очень сложно. Я могу возразить им. Я не программист совсем, но могу достаточно свободно их использовать. Нашей отправной точкой будет MSDN по адресу: Certificate Enrollment API Reference. Эта секция содержит всё самое необходимое — описание интерфейсов и перечисления. И самый первый интерфейс, который мы видим — IX509Enrollment. Этот интерфейс реализует нечто промежуточное между клиентом и сервером. Мы можем по описанию найти то, что нам нужно, а именно первую секцию — Out-of-band-enrollment. И мы видим, что для него надо сначала вызвать метод CreateRequest(). Но прежде чем вызывать метод, нам надо создать форму сертификата, на основе которой будет создан запрос. Как я уже упоминал, мы будем делать самоподписанный сертификат, поэтому следующий интерфейс подойдёт нам как нельзя кстати — IX509CertificateRequestCertificate2. Вот давайте с него и начнём.
Все указанные здесь и далее интерфейсы являются COM интерфейсами семейства X509Enrollment и эти объекты создаются следующим образом:
Примечание: как строятся такие команды? Поскольку это COM интерфейс, первую букву I в названии интерфейса меняем на букву C. Далее, если мы видим цифру 2 в конце названия интерфейса, в команде мы ставим точку и пишем число на единцу меньшее. Вот такие нехитрые правила.
Прежде чем его начать использовать, нам надо инициализировать его. К сожалению документация на MSDN далеко не полная, поэтому будем искать нужные методы через PowerShell и командлет Get-Member:
Из всех методов нам по сути доступен только InitializeFromPrivateKey(), поскольку остальные методы инициализации требуют наличие доступа к Certification Authority. Посмотрим что требуется для этого метода:
В качестве аргументов метода нам надо указать контекст энроллмента и объект закрытого ключа. Значения контекста находятся здесь: X509CertificateEnrollmentContext (просто включаете поиск на MSDN по названию перечисления). В качестве контекста мы можем выбрать контекст текущего пользователя или компьютера (остальное нас сейчас не волнует совсем). Контекст пользователя имеет значение 0x1. Так и запишем. Но этого мало. Надо ещё создать объект закрытого ключа:
Этот интерфейс позволяет задавать различные параметры закрытого ключа, но мы обойдёмся лишь самым необходимым:
Ура! Мы сгенерировали ключ. Теперь вернёмся к предыдущему интерфейсу и инициализируем его из закрытого ключа:
Мы указываем контекст текущего пользователя и объект закрытого ключа. Там есть ещё один аргумент, который называется String. Я не знаю, что они этим хотели сказать, поэтому оставляем пустую строку. А теперь вернёмся к интерфейсу IX509CertificateRequestCertificate2 и посмотрим, что мы можем сделать сейчас. Например, используя свойства NotBefore и NotAfter мы зададим срок действия сертификата. Например, 1 год с сегодняшнего дня:
Лирическое отступление: в подавляющем большинстве случаев вы не можете присваивать значения свойствам объектов после создания самих объектов. Предварительно их надо «активировать» одним из двух способов. Если у объекта есть метод Initialize или производное от него, необходимо сначала воспользоваться одним из доступных методов инициализации. Если объект не содержит явных методов инициализации, нужно воспользоваться методом Encode, который кодирует объект или строку в ASN.1 DER строку и инициализирует объект. Единственным исключением из этого правила являются коллекции объектов. Они как правило используют метод Add() для добавления уже инициализированных объектов.
Уже с главной страницы IX500DistinguishedName видно, что Encode кодирует строку, которая записана в DN формате. Поэтому вызываем этот метод:
После строки нужно ещё указать флаг, в котором указана строка DN. Ставим дефолтный флаг. Теперь у нас готово поле Subject и Issuer (как мы договаривались, они будут одинаковые). Давайте их прицепим к нашему шаблону сертификата:
Что нам осталось сделать? Нам надо создать расширение Enchanced Key Usage. Для этого нам надо использовать следующий интерфейс: IX509ExtensionEnhancedKeyUsage:
Данный объект инициализируется из коллекции объектов IObjectIds. Давайте создадим эту коллекцию:
В эту коллекцию с использованием метода Add() надо добавить один или несколько объектов IObjectId, каждый из которых представляет конкретное предназначение сертификата. Например, Server Authentication, Client Authentication, Smart Card Logon, Secure e-mail и т.д. Но мы сделаем сертификат для Code Signing. OID этого EKU = 1.3.6.1.5.5.7.3.3. Вот и сделаем его:
объект EKU у нас готов, теперь его надо добавить в наш шаблон сертификата. Поскольку это не стандартное поле сертификата, а расширение, добавляем этот объект в свойство X509Extensions, которое является аналогом интерфейса IX509Extensions и, который в свою очередь, является коллекцией расширений. Поэтому добавляем наше расширение методом Add():
Всё, мы собрали все минимально необходимые поля и расширения:
Теперь мы можем превращать наш шаблон сертификата в настоящй сертификат.
Давайте вернёмся в самое начало текущего поста и вспомним про «исходный предмет» — IX509Enrollment. Вот этот интерфейс нам сконвертирует шаблон сертификата в настоящий сертификат с использованием метода CreateRequest(). Но прежде чем использовать метод, нам надо инициализировать объект:
И генерируем файл запроса, который ничем не отличается от самоподписанного сертификата:
В аргументах метода указываем кодировку согласно этой страничке: EncodingType Enumeration. Мы выбираем Base64 с заголовками. $endCert будет содержать сам сертификат (открытую его часть). Фактически запрос хранится в контейнере Certificate Enrollment Requests. Поскольку этот интерфейс не был задуман специально для самоподписанных сертификатов мы проходим стандартную процедуру установки сертификата. Мы просто берём открытую часть нашего же сертификата и устанавливаем её. Вот, кстати, как он выглядит:
Система приклеит этот сертификат к шаблону сертификата и переложит его уже в контейнер Personal:
Всё, теперь мы увидим этот сертификат в нашем хранилище и который готов к использованию. Я немного переработал код и обернул его в красивую функцию, которая будет делать следующее:
- Генерировать тестовый самоподписанный сертификат для подписи скриптов PowerShell
- Устанавливать сертификат с закрытым ключом в контейнер Personal
- Устанавливать открытую часть сертификата в Trusted Root CAs для обеспечения доверия этому сертификату
- Устанавливать открытую часть сертификата в Trusted Publishers для задания явного доверия цифровым подписям, сделанные этим сертификатом.
С виду кажется сложно, но на самом деле тут ничего сложного нет совсем. Просто представьте себе сертификат как большую матрёшку, в которую вы вкладываете другие маленькие матрёшки, которые представляют собой поля и расширения сертификатов. Начинаете собирать самые маленькие матрёшки, вкладываете в более большие и в конечном итоге собираете настоящий сертификат. Хоть документация на MSDN не очень полная, используя командлет Get-Member вы можете восполнить этот пробел.
New-SelfSignedCertificate: командлет PowerShell для генерации самоподписанного сертификата
Для создания самоподписанного сертификата в PowerShell нужно использовать командлет New-SelfSignedCertificate, входящий в состав модуля PKI (Public Key Infrastructure).
Чтобы вывести список всех доступных командлетов в модуле PKI, выполните команду:
Get-Command -Module PKI
Самоподписанные сертификаты рекомендуется использовать в тестовых целях или для обеспечения сертификатами внутренних интранет служб (IIS, Exchange, Web Application Proxy, LDAPS, ADRMS, DirectAccess и т.п.), в тех случая когда по какой-то причине приобретение сертификата у внешнего провайдера или разворачивание инфраструктуры PKI/CA невозможны.
Совет. Не забывайте также про возможность использования полноценных бесплатных SSL сертификатов от Let’s Encrypt. Пример, как выпустить SSL сертификат Let’s Encrypt и привязать его к сайту IIS.Для создания сертификата нужно указать значения –DnsName (DNS имя сервера, имя может быть произвольным и отличаться от имени localhost) и —CertStoreLocation (раздел локального хранилища сертификатов, в который будет помещен сгенерированный сертификат). Командлет можно использовать для создания самоподписанного сертификата в Windows 10 (в нашем примере), Windows 8/8.1 и Windows Server 2019/2016/2012 R2.
Directory: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint Subject
Если вы указали нестандартный криптографический провайдер CSPs (например, с помощью параметров -KeyAlgorithm "ECDSA_secP256r1" -Provider 'Microsoft Smart Card Key Storage Provider' ), убедитесь, что он установлен на компьютере (по умолчанию используется CSP Microsoft Enhanced Cryptographic Provider). Иначе появится ошибка:
По-умолчанию генерируется самоподписанный сертификат со следующим параметрами:
- Криптографический алгоритм: RSA;
- Размер ключа: 2048 бит;
- Допустимые варианты использования ключа: Client Authentication и Server Authentication;
- Сертификат может использоваться для: Digital Signature, Key Encipherment ;
- Срок действия сертификата: 1 год.
Данная команда создаст новый сертификат и импортирует его в персональное хранилище компьютера. Откройте оснастку certlm.msc и проверьте, что в разделе Personal хранилища сертификатов компьютера появился новый сертификат.
Как вы видите, в свойствах сертификата указано, что данный сертификат может использоваться для аутентификации клиентов (Client Authentication). Также он действителен и для аутентификации сервера (Server Authentication).С помощью командлета Get-ChildItem можно вывести все параметры созданного сертификата по его отпечатку (Thumbprint):
Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object Thumbprint -eq DC1A0FDE0120085A45D8E14F870148D1EBCB82AE | Select-Object *
Можно создать цепочку сертфикатов. Сначала создается корневой сертификат (CA), а на основании него генерируется SSL сертификат сервера:
$rootCert = New-SelfSignedCertificate -Subject "CN=TestRootCA,O=TestRootCA,OU=TestRootCA" -KeyExportPolicy Exportable -KeyUsage CertSign,CRLSign,DigitalSignature -KeyLength 2048 -KeyUsageProperty All -KeyAlgorithm 'RSA' -HashAlgorithm 'SHA256' -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" `
New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName "test2.contoso.com" -Signer $rootCert -KeyUsage KeyEncipherment,DigitalSignature
Для экспорта полученного сертификата c закрытым ключом в pfx файл, защищенный паролем, нужно получить его отпечаток (Thumbprint). Сначала нужно указать пароль защиты сертификата и преобразовать его в формат SecureString. Значение Thumbprint нужно скопировать из результатов выполнения команды New-SelfSignedCertificate.
$CertPassword = ConvertTo-SecureString -String “YourPassword” -Force –AsPlainText
Export-PfxCertificate -Cert cert:\LocalMachine\My\2779C0490D558B31AAA0CEF2F6EB1A5C2CA83B30 -FilePath C:\test.pfx -Password $CertPassword
Можно экспортировать открытый ключ сертификата:
Export-Certificate -Cert Cert:\LocalMachine\My\2779C0490D558B31AAA0CEF2F6EB1A5C2CA83B30 -FilePath C:\testcert.cer
Проверьте, что в указанном каталоге появился cer(PFX)файл сертификата. Если щелкнуть по нему правой клавишей и выбрать пункт меню Install Certificate, можно с помощью мастера импорта сертификатов добавить сертификат в корневые доверенные сертификаты компьютера.
Выберите Store location -> Local Machine, Place all certificates in the following store -> Trusted Root Certification Authorities.
$cert=New-SelfSignedCertificate …..
$certFile = Export-Certificate -Cert $cert -FilePath C:\certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName
Полученный открытый ключ или сам файл сертификата можно распространить на все компьютеры и сервера в домене с помощью GPO (пример установки сертификата на компьютеры с помощью групповых политик).
Одной из полезных возможностей командлета New-SelfSignedCertificate является возможность создать сертификат с несколькими различными именами Subject Alternative Names (SAN).
Примечание. Утилита Makecert.exe, в отличии от командлета New-SelfSignedCertificate, не умеет создавать сертификаты с SAN.Если создается сертификат с несколькими именами, первое имя в параметре DnsName будет использоваться в качестве CN (Common Name) сертификата. К примеру, создадим сертификат, у которого указаны следующие имена:
Команда создания сертификата будет такой:
Создать самоподписанный сертфикат типа Code Signing для подписывания кода
В PoweShell 3.0 командлет New-SelfSifgnedCertificate позволял генерировать только SSL сертификаты, которые нельзя было использоваться для подписывания кода драйверов и приложений (в отличии сертификатов, генерируемых утилитой MakeCert).
В версии PowerShell 5 новая версия командлета New-SelfSifgnedCertificate теперь может использоваться для выпуска сертификатов типа Code Signing.
Для создания самоподписанного сертфиката для подписывания кода приложений, выполните команду:
$cert = New-SelfSignedCertificate -Subject "Cert for Code Signing” -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My
Set-AuthenticodeSignature -FilePath C:\PS\test_script.ps1 -Certificate $cert
Если при выполнении команды появится предупреждение UnknownError, значит этот сертификат недоверенный, т.к. находится в персональном хранилище сертификатов пользователя.
Move-Item -Path $cert.PSPath -Destination "Cert:\CurrentUser\Root"
После этого вы можете подписать свой PowerShell скрипт с помощью данного самоподписанного сертификата.
Использование самоподписанного SSL сертификата SHA-256 в IIS
Обратите внимание, что при создании самоподписанный сертификат для IIS через консоль Internet Information Manager (пункт меню Create Self-Signed Certificate), создается сертификат с исопльзованием алгоритма шифрования SHA-1. Такие сертификаты многими браузерами считаются недоверенными, поэтому они могут выдавать предубеждение. Командлет New-SelfSignedCertificate позволяет создать более популырный тип сертификата с помощью алгоритма шифрования SHA-256.
Вы можете привязать самоподписанный сертификат SHA-256, созданный в PowerShell, к сайту IIS. Если вы с помощью PowerShell создали SSL сертификат и поместили его в хранилище сертификатов компьютера, он будет автоматически доступен для сайтов IIS.
Запустите консоль IIS Manager, выберите ваш сайт, затем в настройке Site Binding, выберите созданный вами сертификат и сохраните изменения.
Ниже представлены процедуры для получения сертификата от автономного центра сертификации (ЦС) с помощью служб сертификации — компонента ОС Windows Server 2003 и Windows Server 2008. Данные процедуры необходимо выполнить в следующем порядке.
-
Запросить сертификат от автономного ЦС.
Порядок запроса сертификата от автономного ЦС
Войдите в систему на компьютере, на котором планируется установить сертификат (например, на сервере шлюза или сервере управления).
На начальной странице служб сертификации Microsoft щелкните ссылку Запросить сертификат.
На странице Расширенный запрос сертификата щелкните ссылку Создать и выдать запрос к этому ЦС.
На странице Расширенный запрос сертификата сделайте следующее.
-
В разделе Идентифицирующие сведения в поле Имя введите уникальное имя, например полное доменное имя компьютера, для которого запрашивается сертификат. Заполните остальные поля соответствующими данными.
Примечание |
---|
Событие с кодом 20052 (ошибка) создается, если указанное в поле Имя полное доменное имя не соответствует имени компьютера. |
Порядок утверждения ожидающего запроса сертификата
Зарегистрируйтесь в компьютере со службами сертификации как администратор ЦС.
На рабочем столе Windows нажмите кнопку Пуск, выберите пункты Программы, Администрирование и Центр сертификации.
В окне Центр сертификации раскройте узел с именем требуемого центра сертификации, а затем выберите пункт Ожидающие запросы.
На панели результатов щелкните правой кнопкой мыши ожидающий запрос из предыдущей процедуры, выберите пункт Все задачи, а затем пункт Выпустить.
Щелкните Выданные сертификаты и убедитесь, что только что выданный сертификат указан в списке.
Закройте окно Центр сертификации.
Порядок получения сертификата
Войдите в систему на компьютере, на котором планируется установить сертификат (например, на сервере управления Essentials или на компьютере из рабочей группы).
На начальной странице служб сертификации Microsoft щелкните ссылку Просмотр состояния ожидаемого запроса сертификата.
На странице Просмотр состояния ожидаемого запроса сертификата выберите запрашиваемый сертификат.
На странице Сертификат выдан щелкните ссылку Установить этот сертификат.
В диалоговом окне Потенциальная ошибка сценария нажмите кнопку Да.
Создание сертификата в центре сертификации предприятия для Essentials 2010
Ниже представлены процедуры для получения сертификата от центра сертификации (ЦС) предприятия с помощью служб сертификации — компонента ОС Windows Server 2003 и Windows Server 2008. Данные процедуры необходимо выполнить в следующем порядке.
-
Создать шаблон сертификата.
Создание шаблона сертификата
На рабочем столе Windows компьютера, на котором размещен ЦС предприятия, нажмите кнопку Пуск, выберите пункты Программы, Администрирование и Центр сертификации.
В области навигации разверните имя ЦС, щелкните правой кнопкой мыши пункт Шаблоны сертификатов, а затем выберите команду Управление.
В области результатов консоли Шаблоны сертификатов щелкните правой кнопкой мыши пункт IPSec (автономный запрос), а затем выберите команду Скопировать шаблон.
В диалоговом окне Свойства нового шаблона на вкладке Общие в текстовом поле Отображаемое имя шаблона введите новое имя для шаблона (например, EssentialsCert).
На вкладке Обработка запроса установите флажок Разрешить экспортировать закрытый ключ, а затем нажмите кнопку Поставщики.
В диалоговом окне Выбор CSP выберите наиболее подходящего поставщика служб шифрования, а затем нажмите кнопку ОК.
Примечание |
---|
ОС Windows 2000 Server будет работать с Microsoft Enhanced Cryptographic Provider 1.0. ОС Windows Server 2008, Windows Server 2003 и Windows XP будут работать с Microsoft RSA SChannel Cryptographic Provider. |
Перейдите на вкладку Расширения. В разделе Расширения, включенные в этот шаблон выберите пункт Политики применения, а затем нажмите кнопку Удалить.
В диалоговом окне Изменение расширения политик применения выберите пункт IKE-посредник IP-безопасности, а затем нажмите кнопку Удалить.
Выберите команду Добавить, а затем выберите нужные элементы в списке Политики применения, удерживая нажатой клавишу CTRL. Выберите пункты Проверка подлинности клиента и Проверка подлинности сервера, а затем нажмите кнопку ОК.
В диалоговом окне Изменение расширения политик применения нажмите кнопку ОК.
Перейдите на вкладку Безопасность, проверьте наличие у группы пользователя разрешений на чтение и подачу заявки, а затем к нажмите кнопку ОК.
Порядок запроса сертификата от ЦС предприятия
Войдите в систему на компьютере, на котором планируется установить сертификат (например, на сервере управления Essentials или компьютере из рабочей группы).
На начальной странице служб сертификации Microsoft щелкните ссылку Запросить сертификат.
На странице Расширенный запрос сертификата щелкните ссылку Создать и выдать запрос к этому ЦС.
На странице Расширенный запрос сертификата сделайте следующее.
-
В разделе Шаблон сертификата выберите имя созданного шаблона (например, EssentialsCert).
В этой статье объясняется, как создать и экспортировать сертификат для подписывания пакета приложений с помощью инструментов PowerShell. рекомендуется использовать Visual Studio для упаковки приложений UWP и упаковки настольных приложений, но вы по-прежнему можете упаковать приложение вручную, если вы не использовали Visual Studio для разработки приложения.
Предварительные требования
Упакованное или распакованное приложение
Приложение, содержащее файл AppxManifest.xml. При создании сертификата, который будет использоваться для подписывания окончательного пакета приложений, потребуется сослаться на этот файл манифеста. Сведения о том, как вручную упаковать приложение, см. в разделе Создание пакета приложений с помощью инструмента MakeAppx.exe.
Командлеты инфраструктуры открытых ключей (PKI)
Вам потребуются командлеты PKI для создания и экспорта сертификата для подписи. Дополнительные сведения см. в разделе Командлеты инфраструктуры открытых ключей.
Создание самозаверяющего сертификата.
Самозаверяющий сертификат полезен для тестирования приложения, прежде чем вы будете готовы опубликовать его в магазине. Выполните действия, описанные в этом разделе, чтобы создать самозаверяющий сертификат.
При создании и использовании самозаверяющего сертификата только пользователи, которые устанавливают и доверяют сертификату, могут запускать приложение. Это легко реализовать для тестирования, но это может препятствовать установке дополнительных пользователей в приложение. Когда вы будете готовы опубликовать приложение, рекомендуется использовать сертификат, выданный доверенным источником. Эта система централизованного доверия помогает убедиться, что экосистема приложений имеет уровни проверки для защиты пользователей от вредоносных субъектов.
Определение субъекта вашего упакованного приложения
Чтобы использовать сертификат для подписывания пакета приложений, значение в поле сертификата "Субъект" должно совпадать с данными в разделе "Издатель" манифеста вашего приложения.
Например, раздел "Идентификатор" файла AppxManifest.xml вашего приложения должен выглядеть примерно следующим образом:
"Издатель" в данном случае — "CN=Contoso Software, O=Contoso Corporation, C=US", и именно его следует использовать для создания сертификата.
Использование командлета New-SelfSignedCertificate для создания сертификата
Используйте командлет PowerShell New-SelfSignedCertificate для создания самозаверяющего сертификата. New-SelfSignedCertificate имеет несколько параметров для настройки, но в данной статье мы рассмотрим создание простого сертификата, который будет работать с SignTool. Дополнительные примеры и варианты использования этого командлета см. в статье New-SelfSignedCertificate.
Основываясь на файле AppxManifest.xml из предыдущего примера, используйте следующий синтаксис для создания сертификата. В строке с повышенными привилегиями PowerShell:
Обратите внимание на следующие сведения о некоторых параметрах.
Кэйусаже. Этот параметр определяет, для чего может использоваться сертификат. Для самозаверяющего сертификата этот параметр должен иметь значение дигиталсигнатуре.
Текстекстенсион: этот параметр включает параметры для следующих расширений:
Расширенное использование ключа (EKU). это расширение указывает дополнительные цели, для которых может использоваться сертифицированный открытый ключ. Для самозаверяющего сертификата этот параметр должен включать строку расширения "2.5.29.37 = 1.3.6.1.5.5.7.3.3", которая указывает, что сертификат должен использоваться для подписывания кода.
Основные ограничения. это расширение указывает, является ли сертификат центром сертификации (ЦС). Для самозаверяющего сертификата этот параметр должен включать строку расширения "2.5.29.19 = ", которая указывает на то, что сертификат является конечной сущностью (а не центром сертификации).
После выполнения этой команды сертификат будет добавлен в локальное хранилище сертификатов, как указано в параметре "-CertStoreLocation". Результат выполнения команды также будет выдавать отпечаток сертификата.
Сертификат можно просмотреть в окне PowerShell, выполнив следующие команды:
Это позволит отобразить все сертификаты в вашем локальном хранилище.
Экспорт сертификата
Чтобы экспортировать сертификат из локального хранилища в файл обмена личной информацией (PFX), используйте командлет Export-PfxCertificate.
При использовании командлета Export-PfxCertificate следует либо создать и использовать пароль, либо с помощью параметра "-ProtectTo" указать, какие пользователи или группы могут осуществлять доступ к файлу без пароля. Обратите внимание, что если вы не используете параметр "-Password" или "-ProtectTo", отобразится ошибка.
Использование пароля
Использование ProtectTo
После создания и экспорт сертификата вы готовы подписать пакет приложений с помощью SignTool. Следующий шаг в процессе упаковки вручную описан в разделе Подпись пакета приложения с использованием инструмента SignTool.
Замечания по безопасности
Добавив сертификат в хранилища сертификатов локальной машины, вы меняете доверие сертификатов всех пользователей на компьютере. Рекомендуется удалить эти сертификаты, когда они больше не требуется, чтобы их невозможно было использовать для нарушения доверия системы.
Читайте также: