c# - 如何构建在我的计算机中有效的自认证 x509 证书
问题描述
我需要通过 C# 代码构建一个在我的计算机上有效的自签名 x509 证书。
如果需要,可以使用管理员权限运行。
我当前的代码如下
public static X509Certificate2 GenerateCertificate(string name)
{
string subjectName = $"CN={name}";
using (RSA rsa = RSA.Create(2048))
{
CertificateRequest req = new CertificateRequest(
subjectName,
rsa,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1);
req.CertificateExtensions.Add(
new X509BasicConstraintsExtension(false, false, 0, false));
req.CertificateExtensions.Add(
new X509KeyUsageExtension(
X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.NonRepudiation,
false));
req.CertificateExtensions.Add(
new X509EnhancedKeyUsageExtension(
new OidCollection
{
new Oid("1.3.6.1.5.5.7.3.8")
},
true));
req.CertificateExtensions.Add(
new X509SubjectKeyIdentifierExtension(req.PublicKey, false));
return req.CreateSelfSigned(
DateTimeOffset.UtcNow.AddDays(-1),
DateTimeOffset.UtcNow.AddYears(50));
}
}
public static X509Certificate2 GetOrCreateCertificate(string serverName)
{
using (X509Store store = new X509Store(StoreLocation.LocalMachine))
{
X509Certificate2 certificate;
store.Open(OpenFlags.ReadWrite);
X509Certificate2Collection certificateCollection = store.Certificates.Find(X509FindType.FindBySubjectName, serverName, true);//With true, my certificates are not returned
if (certificateCollection.Count > 0)
{
certificate = certificateCollection[0];
return certificate;
}
certificate = GenerateCertificate(serverName);
store.Add(certificate);
return certificate;
}
}
目前,如果我进入 windows MMC,证书管理单元,我会看到证书,但它被认为是无效的。
我错过了什么?
编辑
- 这是基于问题如何使用 C# 创建自签名证书?这会生成一个被视为无效的证书。
- 我想使用 .Net 4.7.2 中可用的 .Net 类,而不是 bouncyCastle、com 对象或外部第三方库。
解决方案
您遇到的问题似乎是系统不信任新证书。
为了被信任,证书链的根必须在以下存储之一中表示:
- 本地机器\根
- LocalMachine\ThirdPartyRoot
- 当前用户\根
(还涉及一些其他存储,用于域管理的根权限)
所以在你这样做之后
certificate = GenerateCertificate(serverName);
store.Add(certificate);
你也会想做
using (X509Store rootStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine))
using (X509Certificate2 withoutPrivateKey = new X509Certificate2(certificate.RawData))
{
rootStore.Open(OpenFlags.ReadWrite);
rootStore.Add(withoutPrivateKey);
}
现在系统将能够验证(单节点)链到受信任的证书,并且validOnly: true
对 Find 的约束将认为证书是“有效的”(对于该方法,这意味着链受信任且未过期) .
推荐阅读
- django - 一对多 django 添加作者到书
- php - 如何在今天从 00:00:00 到 23:59:59 在 Laravel 中输入
- r - SVM 预测正在下降值
- python - '没有名为'deploy'的模块:这个错误是什么意思,我该如何解决?
- python - 如何使用python使用for循环来反转字符串中的单词?
- wordpress - WordPress wp_email() 没有正确接受价值
- python - 对空值执行算术运算
- javascript - IFrame 不尊重用户代理
- jquery - 结账前计算购物车总价
- javascript - 即使安装了基础站点并设置了应用程序,Zurb 课程也无法正常工作