Как создать самозаверяющий сертификат с id-ecc для использования с подписью и проверкой ECDSA?

Я пытаюсь обновить код этой статьи, чтобы позволить мне создать (и использовать) самозаверяющий сертификат на основе ECC и выполнить базовую подпись и проверка с его помощью (ECDSA).

  • Есть ли способ сделать это с помощью кросс-платформенных API-интерфейсов .NET Core или требуется Win32 P/Invoke?

Согласно этому сообщению, мне нужно использовать the more standard id-ecctype


person Ran Dom    schedule 17.12.2018    source источник
comment
Вам действительно нужно создать сертификат с кодом С#? Это будет намного проще сделать с помощью API командной строки openssl.   -  person Zergatul    schedule 17.12.2018
comment
@Zergatul OpenSSL не одобрен для использования в строго контролируемой среде, с которой я работаю (как и в Bouncy Castle)   -  person Ran Dom    schedule 17.12.2018
comment
Вам нужно генерировать много сертификатов на лету? Если нет, вы можете сгенерировать сертификат один раз с помощью openssl, а затем использовать его в С#.   -  person Zergatul    schedule 17.12.2018
comment
openssl (и надувной замок) не разрешены в ограниченной среде, в которой я работаю. @Zergatul   -  person Ran Dom    schedule 17.12.2018
comment
Что ж, если вы не можете использовать библиотеки, вам, возможно, придется программировать их самостоятельно, не так ли? Я бы попросил сделать исключение из этого правила, потому что сертификаты программирования — со всеми задействованными ASN.1 — просто неинтересны. У BC есть разрешающая лицензия, поэтому вы можете просто скопировать соответствующие части (конечно, с надлежащим заявлением о вкладе в BC). Предупреждение: извлечение может занять некоторое время, это будет много кода. Вы также можете заглянуть в сам код .NET, в настоящее время он также распространяется под лицензией O/S (я думаю, IANAL).   -  person Maarten Bodewes    schedule 18.12.2018
comment
Ответ говорит, что вы можете использовать ECDSA /если/ вы не используете id-ecDH.   -  person bartonjs    schedule 19.12.2018
comment
@bartonjs Спасибо, что разъяснили это. я обновил вопрос   -  person Ran Dom    schedule 19.12.2018


Ответы (1)


Есть ли способ сделать это с помощью кросс-платформенных API-интерфейсов .NET Core?

Ага!

X509Certificate2 cert;

using (ECDsa key = ECDsa.Create(ECCurve.NamedCurves.nistP256))
{
    CertificateRequest request = new CertificateRequest(
        "CN=Self-Signed ECDSA",
        key,
        HashAlgorithmName.SHA256);

    request.CertificateExtensions.Add(
        new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, critical: false));

    request.CertificateExtensions.Add(
        new X509BasicConstraintsExtension(false, false, 0, false));

    // If it was for TLS, then Subject Alternative Names and
    // Extended (Enhanced) Key Usages would also be useful.

    DateTimeOffset start = DateTimeOffset.UtcNow;

    cert = request.CreateSelfSigned(notBefore: start, notAfter: start.AddMonths(3));
}

// If you want to save a PFX or something, you can do so now.
person bartonjs    schedule 19.12.2018
comment
Требуется .NET 7.1. Я надеюсь, что смогу привести достаточно убедительные аргументы, чтобы переключиться! - person Ran Dom; 19.12.2018