Программно создать фиктивный сертификат с закрытым ключом для тестирования

У меня есть проект модульного тестирования C#, где я хотел бы протестировать некоторые написанные мной расширения шифрования. Я хотел бы использовать фиктивный сертификат для тестирования, но у меня есть следующие ограничения:

  • Сборка и тестирование выполняются удаленно на компьютере, к которому у меня нет доступа. Таким образом, я не могу установить сертификат на машине сборки.
  • Я не могу включить секреты (такие как .pfx файл) как часть репозитория или сборки git, так как это нарушит протоколы безопасности. Таким образом, я не могу прочитать сертификат из файла, включенного в проект.

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

1 ответ

Решение

Один из способов сделать это - создать сертификат для тестирования, преобразовать его в строку base 64 и затем прочитать сертификат из этой строки в коде. Это требует четырех шагов:

1. Создайте файлы.cer и.pvk

Для этого можно использовать MakeCert.exe (обратите внимание, что этот инструмент устарел, и Microsoft рекомендует использовать командлет New-SelfSignedCertificate PowerShell. Я не пробовал этого, но, предположительно, любой из этих методов будет работать.). Это инструмент.NET Framework, который входит в состав Windows SDK. Я случайно установил Windows 7 SDK на мою машину, так что для меня этот exe был расположен под C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\, но ваши результаты могут отличаться. Этот инструмент делает именно то, что мы хотим! Из документации:

Средство создания сертификатов создает сертификаты X.509 только для целей тестирования. Он создает пару открытых и закрытых ключей для цифровых подписей и сохраняет их в файле сертификата. Этот инструмент также связывает пару ключей с указанным именем издателя и создает сертификат X.509, который связывает указанное пользователем имя с открытой частью пары ключей.

Ради этого примера, давайте назовем сертификат TestCert, Чтобы создать файлы.cer и.pvk, выполните следующую команду:

MakeCert.exe -sv TestCert.pvk -n "cn=Test Certificate" TestCert.cer -r

-sv флаг указывает имя файла.pvk для создания, -n flag - это имя нашего сертификата, совместимое с X.500 (проще всего использовать формат "cn=CertName", как указано выше), и -r флаг указывает, что он будет самоподписанным. Если вы хотите указать даты начала и окончания для вашего сертификата, используйте -b а также -e флаги и форматировать даты как mm/dd/yyyy (по умолчанию сертификат действителен со дня создания до 2039 года). Если ваш сертификат будет использоваться для шифрования и дешифрования (как мой), вы должны указать -sky Exchange а также -pe флаги. Вам будет предложено создать пароль для сертификата во время процесса.

2. Создайте файл.pfx

Это можно сделать с помощью pvk2pfx.exe инструмент, который должен быть в том же месте, что и MakeCert.exe, Этот инструмент преобразует файлы.pvk и.cer в файл.pfx. Чтобы использовать этот инструмент, выполните следующую команду:

pvk2pfx.exe -pvk TestCert.pvk -spc TestCert.cer -pfx TestCert.pfx

-pvk флаг - это имя файла.pvk, который будет использоваться (создан на шаге 1), -csp flag - это имя файла.cer для использования (созданного на шаге 1), а -pfx flag - это имя файла.pfx, который будет создан. Во время процесса вам будет предложено ввести пароль, который вы создали на шаге 1.

3. Получить базовое 64 строковое представление.pfx файла

Это довольно просто и может быть сделано с Get-Content Командлет Powershell и System.Convert.ToBase64String метод. Для этого откройте окно Powershell и выполните следующее:

$content = Get-Content TestCert.pfx -Encoding Byte
[System.Convert]::ToBase64String($content) | Out-File "TestCert.txt"

Теперь у нас есть строка base 64 для нашего файла.pfx в TestCert.txt.

4. Создайте сертификат программно

Теперь мы можем создать сертификат в коде так:

namespace MyTests
{
    using System;
    using System.Security.Cryptography.X509Certificates;

    public class MyTests
    {
        // Copy and paste the string from TestCert.txt here.
        private const string CertText = "<text>";

        // Use the password you created in steps 1 and 2 here.
        private const string Password = "p4ssw0rd";

        // Create the certificate object.
        private readonly X509Certificate2 TestCert = new X509Certificate2(
            Convert.FromBase64String(MyTests.CertText),
            MyTests.Password);
    }
}
Другие вопросы по тегам