2016-12-29 7 views
1

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

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

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

+0

Может быть, как [это] (http://stackoverflow.com/a/ 22237794/3245057)? – pepo

ответ

3

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

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

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

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

Для этого примера позвоним cert TestCert. Для создания .CER и .pvk файлов, выполните следующую команду:

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

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

2. Создайте.pfx file

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

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

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

3. Получить строковое представление PFX-файла

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

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

Теперь у нас есть строка базы 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); 
    } 
} 
Смежные вопросы