Программно создать фиктивный сертификат с закрытым ключом для тестирования
У меня есть проект модульного тестирования 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);
}
}