Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Введение
В этом разделе описываются некоторые проблемы с настройкой и конфигурацией, которые могут возникнуть при использовании стороннего сетевого модуля безопасности оборудования (HSM) для хранения сертификатов расширенной проверки (EV).
Фон
Упаковка HLK
Файлы пакетов HLKX используют соглашения о открытой упаковке. Спецификация является частью рабочей группы ISO, подразумевая, что файлы HLKX несовместимы с Signtool.
Подпись пакета HLK
Когда HLK подписывает пакет, подпись и связи помещаются в пакет вместе с данными HLK. Это данные, которые System.IO.Packaging.PackageDigitalSignature используются для проверки подписи данных в пакете.
Примечание.
В настоящее время подпись пакета HLK поддерживает только сертификаты RSA и DSA, как определено библиотекой .NET, используемой для подписывания System.Security.Cryptography.Xml.SignedXml
Поставщики служб шифрования
Поставщик служб шифрования (CSP) содержит реализации криптографических стандартов и алгоритмов. Как минимум, CSP состоит из библиотеки динамической компоновки (DLL), реализующей функции в CryptoSPI (системный программный интерфейс). Большинство поставщиков СЛУЖБ содержат реализацию всех своих собственных функций. Однако некоторые поставщики услуг реализуют свои функции главным образом в программе службы под управлением диспетчера управления службами Windows. Другие реализуют функции в оборудовании, например смарт-карточку или безопасный сопроцессор. Если CSP не реализует собственные функции, библиотека DLL выступает в качестве сквозного слоя, упрощая взаимодействие между операционной системой и фактической реализацией CSP.
Хранилище сертификатов и реестр
Сертификаты в хранилище сертификатов сопоставляют библиотеку DLL CSP, которая будет выполнять окончательную подпись. Это можно увидеть в записи реестра ниже.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider]
"Image Path"="%SystemRoot%\\system32\\dssenh.dll"
"SigInFile"=dword:00000000
"Type"=dword:0000000d
Подпись пакета HLKX с сертификатом, размещенным сетевым HSM
Конфигурация контроллера
Чтобы настроить контроллер HLK для входа с помощью сертификата HSM, в системе должно присутствовать следующее:
- Центр сертификации (ЦС) из HSM
- CSP-файл из HSM
Инструкции по настройке клиента HSM с этими компонентами должны быть описаны поставщиком HSM.
Подписывание с помощью HLK
Если контроллер настроен правильно, вы сможете указать сертификат из HSM, так как локально установленный сертификат из HLK и подписать пакет.
Тестирование конфигурации HSM
Использование средства входа
Первый шаг, чтобы понять, можно ли подписать файл с помощью средства входа. Это позволит нам убедиться, что рабочий процесс подписывания работает правильно. Сначала мы подписываем PE-файл (exe или dll). Например, подписывание с помощью имени:
signtool sign /f HighValue.cer /csp "Hardware Cryptography Module" /kHighValueContainerMyControl.exe
signtool sign /n "My Company Certificate" MyFile.exe
или для подписывания с помощью хэша SHA1 установленного сертификата:
signtool sign /sha1 0cf1d2f7befc7d143678f86963aef5572b710cf2 MyFile.exe
Имя сертификата найдено в сведениях субъекта, а хэш SHA1 находится в отпечатке. При использовании хэша удалите все пробелы и специальные символы, которые находятся в хэше, чтобы формат выглядел как приведенный выше пример. Вы также можете подписаться с помощью PFX-файла. Скорее всего, это не то, что нужно сделать, так как PFX-файл может содержать закрытый ключ, где сертификат содержит только открытый ключ.
signtool sign /f certdata.pfx MyFile.exe
Сигнатуру можно проверить с помощью средства входа
signtool verify /v /pa MyFile.exe
Если вы смогли подписать и проверить файл, используя что-либо, кроме PFX-файла, можно попытаться подписать пакет HLK. Если вы не смогли подписаться, ознакомьтесь с разделом "Устранение неполадок".
Использование PackageDigitalSignature
В конце этого документа в разделе "Примеры кода" представлен пример кода для подписывания PackageDigitalSignature . Вы также должны получить полный файл C# при получении этого документа. Чтобы использовать этот пример, необходимо предоставить полный путь к неподписанном пакету и отпечаток сертификата, который будет использоваться для подписи. Если вы не смогли подписаться, ознакомьтесь с разделом "Устранение неполадок".
Устранение неполадок
Наиболее вероятной причиной является отсутствие сертификата и связанного CSP, установленного в вашей системе из HSM. Ниже приведены некоторые действия, которые вы можете попробовать:
- Вы можете войти в эту систему, используя только средства, поддерживаемые поставщиком HSM?
- Устанавливает ли поставщик HSM сертификат и CSP в этой системе?
- Каковы свойства сертификата?
- Поддерживает ли поставщик HSM и документ с помощью средства входа? Если файл можно подписать с помощью средства signtool с HSM, это индикатор правильной настройки системы и подразумевает, что HLK также может подписывать пакеты HLKX.
- При выполнении примера кода (HSM_example.cs), который печатается для CspKeyContainerInfo.ProviderName
- Сопоставляет ли это имя поставщика с правильной виртуальной машиной, предоставленной библиотекой DLL CSP. Эти сведения можно найти в реестре, как показано выше.
Примеры кода
PackageDigitalSignatureManager
public static void Sign(string package, X509Certificate2 certificate)
{
// Open the package to sign it
Package packageToSign = Package.Open(package);
// Specify that the digital signature should exist
// embedded in the signature part
PackageDigitalSignatureManager signatureManager = new PackageDigitalSignatureManager(packageToSign);
signatureManager.CertificateOption = CertificateEmbeddingOption.InCertificatePart;
// We want to sign every part in the package
List<Uri> partsToSign = new List<Uri>();
foreach (PackagePart part in packageToSign.GetParts())
{
partsToSign.Add(part.Uri);
}
// We will sign every relationship by type
// This will mean the signature is invalidated if *anything* is modified in //the package post-signing
List<PackageRelationshipSelector> relationshipSelectors = new List<PackageRelationshipSelector>();
foreach (PackageRelationship relationship in packageToSign.GetRelationships())
{
relationshipSelectors.Add(new PackageRelationshipSelector(relationship.SourceUri, PackageRelationshipSelectorType.Type, relationship.RelationshipType));
}
try
{
signatureManager.Sign(partsToSign, certificate, relationshipSelectors);
}
finally
{
packageToSign.Close();
}
}