使用 .netstandard 2.0 库创建证书请求

Create a certificate request using .netstandard 2.0 library

NetStandard 2.0 显然不包括`System.Security.Cryptography.X509Certificates.CertificateRequest'.

难道不能在 .NETStandard 2.0 库中创建 X509Certificates 吗?如果不是,为什么不呢?包含 X509Certificates,所以这似乎是一个奇怪的排除。

.NET Standard 2.0 是在 .NET Framework 4.6.1 和 4.6.2 之间构建的,并且没有 .NET Framework 4.6.2 中不存在的类型。

CertificateRequest 已添加到 .NET Framework 4.7.2。

最简单的答案是针对 .NET Framework 或 .NET Core 而不是 .NET Standard,然后该类型将可用(前提是您使用足够高的版本)。或者,除非您使用的是自定义 X509SignatureGenerator,否则该类型非常简单,您可以通过反射将其绑定。

Type certificateRequestType =
    Type.GetType("System.Security.Cryptography.X509Certificates.CertificateRequest");

object request = certificateRequestType.GetConstructor(
    new[] { typeof(string), typeof(RSA), typeof(HashAlgorithmName), typeof(RSASignaturePadding) }).Invoke(
    new object[] { certDN, key, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1 });

Collection<X509Extension> extensions = (Collection<X509Extension>)
    certificateRequestType.GetProperty("CertificateExtensions").GetValue(request);

// add things to the extensions collection
...

DateTimeOffset now = DateTimeOffset.UtcNow;

return (X509Certificate2)certificateRequestType.GetMethod("CreateSelfSigned").Invoke(
    new object[] { now.AddMinutes(-5), now.AddDays(30) });