NetStandard 2.0 显然不包括`System.Security.Cryptography.X509Certificates.CertificateRequest'。
那么是否无法在 .NETStandard 2.0 库中创建 X509Certificates ?如果没有,为什么不呢? X509 证书包含在内,因此这似乎是一个奇怪的排除。
.NET Standard 2.0 是在 .NET Framework 4.6.1 和 4.6.2 之间构建的,并且不具有 .NET Framework 4.6.2 中不存在的类型。
CertificateRequest
已在 4.7.2 中添加到 .NET Framework。
最简单的答案是针对 .NET Framework 或 .NET Core 而不是 .NET Standard,然后该类型将可用(前提是您使用足够高的版本)。或者,除非您使用自定义
X509SignatureGenerator
,否则类型足够简单,您可以通过反射绑定它。
var certificateRequestType =
Type.GetType("System.Security.Cryptography.X509Certificates.CertificateRequest");
var request = certificateRequestType.GetConstructor(
new[] { typeof(string), typeof(RSA), typeof(HashAlgorithmName), typeof(RSASignaturePadding) }).Invoke(
new object[] { certDN, key, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1 });
var extensions = (Collection<X509Extension>)
certificateRequestType.GetProperty("CertificateExtensions").GetValue(request);
// add things to the extensions collection
...
var now = DateTimeOffset.UtcNow;
return (X509Certificate2)certificateRequestType.GetMethod("CreateSelfSigned")
.Invoke(request, new object[] { now.AddMinutes(-5), now.AddDays(30) });
好吧,这个评论太大了。为了使 bartonjs 工作,我被迫以这种方式获取类型:
var systemCoreAssembly = AppDomain.CurrentDomain.GetAssemblies()
.Where(x => x.GetName().Name == "System.Core").Single();
certificateRequestType = systemCoreAssembly
.GetType("System.Security.Cryptography.X509Certificates.CertificateRequest");