【发布时间】:2016-02-27 12:21:00
【问题描述】:
我必须使用证书和私钥在 C# 中对一些数据进行数字签名。我使用的证书具有自定义根 CA 以及自定义中间 CA。
我可以使用这样的代码毫无问题地进行签名,如果根 CA 和中间 CA 已安装到 Windows 证书存储中:
var content = new ContentInfo(manifest);
var cms = new SignedCms(content, true);
var signer = new CmsSigner(SubjectIdentifierType.SubjectKeyIdentifier, myCertificate);
signer.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));
cms.ComputeSignature(signer);
return cms.Encode();
不幸的是,我无法将根 CA 和中间 CA 安装到服务器的证书存储中(我正在使用 Azure Web 应用程序)。如果它们存储在磁盘上,我正在尝试使用根证书和中间 CA 证书进行签名。我想在打电话给cms.Encode() 之前我可以做这样的事情:
// add CAs from disk
var intermediateCACertificate = new X509Certificate2(@"pathToIntermediateCertificate.cer");
signer.Certificates.Add(intermediateCACertificate);
var rootCACertificate = new X509Certificate2(@"pathToRootCertificate.cer");
signer.Certificates.Add(rootCACertificate);
但是当我执行这个时,我得到了一个 CryptographicException 抛出 "A certificate chain could not be built to a trusted root authority."。
是否可以使用非标准 CA 进行数字签名而不将它们安装到 Windows 证书存储中?
【问题讨论】:
-
这不会破坏拥有 CA 的目的吗?您不能(不应该)能够在没有管理员权限的情况下添加受信任的证书颁发机构。签名与将证书添加为受信任的 CA 非常不同 - 但您可能不会被允许使用不受信任的 CA 链进行签名
-
可能,是的——虽然我不能添加 CA,我也不想信任它,只需使用它生成的证书对某些东西进行数字签名。由于 CA 的架构,这可能是不可能的,但我想确定一下。
-
我想基本上我想做的就是告诉系统“为了这个操作的目的,将此链视为受信任的”,如果这有意义的话。
-
我认为 Windows 不会让你这样做,但我不经常使用它,你是否尝试过使用自签名证书而不是 CA 链?
-
我在使用的证书中没有任何选择。
标签: c# cryptography certificate x509certificate