c# - 使用 C# 从 CA 证书创 build 备的 X509 证书

标签 c# .net azure x509certificate x509certificate2

我声明我对证书主题不是很专家,并且我可能不了解有关证书链签名的某些内容。

我们的客户将向我们发送一个 CA 证书,该证书是中间证书,我们必须创 build 备证书,该证书将存储在我们的设备中,以便与设备配置服务连接,其中将使用中间证书注册一个组。

是否可以仅使用 C# 从 CA 证书创 build 备证书? 我们想将CA证书(中间证书)添加到我们的设备中,并使用C#编写的软件为设备创建证书? (如果需要,我们也可以使用其他类型的脚本或openssl)。可以吗?

我做了一些测试。我使用此链接中的脚本创建了根证书和中间证书 奥 git _a 然后,使用中间证书,我尝试了这个

    X509Certificate2 certificate = new X509Certificate2("myIntermediateCA.pem");
    
    ECDsa ecd = ECDsa.Create();
    CertificateRequest req = new CertificateRequest("CN=myDevice",   
    ecd,
    HashAlgorithmName.SHA256);
    req.CertificateExtensions.Add(new X509BasicConstraintsExtension(false, false, 0, false));
    req.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment, 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));
    X509Certificate2 cert2 = req.Create(
                        certificate,
                        DateTimeOffset.UtcNow.AddDays(-1),
                        DateTimeOffset.UtcNow.AddDays(2),
                        new byte[] { 1, 2, 3, 4 });
   byte[] exported = cert2.Export(X509ContentType.Pfx, "pass12345678");
   string certificatePfxPath = "myDevice.pfx";
   File.WriteAllBytes(certificatePfxPath, exported);

但是它不起作用。如果我使用 myDevice.pfx 连接到设备配置服务,在该服务中我创建了一个使用中间证书的组,则会出现错误,表明该设备未获得授权。 (使用此代码创建的设备证书似乎没有私钥。 但一定有还是没有?)

谢谢!

最佳答案

Our Customer will send to us a CA certificate that is an Intermediate certificate and we have to create device certificates that will be stored in our devices for connection with the Device Provisioning Service where a group will be enrolled using the Intermediate certificate.

有一个根本性的问题。客户仅向您发送 CA 证书的公共(public)部分。您不能使用此证书签署其他证书,因为签名过程需要与 CA 证书关联的私钥,而客户很可能未提供该私钥。

有两个选项可以解决此问题:

  1. 在您的环境中安装由客户 CA 内部签名的从属 CA。也就是说,您安装 CA、生成 CA 请求、提交给客户进行签名并接收您安装到 CA 的签名 CA 证书。然后使用本地 CA 签署设备证书。
  2. 要求客户提供证书签名 API(或其他流程),该 API 接受 PKCS#10 请求作为输入并返回签名的 x.509 证书。

选项 1 在大多数情况下都是有问题的,因为这允许您颁发客户信任的任意证书。这将引起您和客户之间的隐私和安全问题,因为您可以轻松欺骗客户的 PKI 及其安全性。

每次需要签署证书时,选项 2 都需要与客户环境/API 进行交互。另一方面,如果客户发现请求未经授权或不符合合规/政策规则,则可以审查每个请求并拒绝该请求。

Is it possible to create a device certificate from a CA certificate using only C#?

在任何情况下,您都不应这样做,而应使用专门的 CA 软件。例如,Microsoft ADCS、PKI Prime EJBCA、您选择的其他 CA 供应商/软件(也不要使用纯 OpenSSL)。

为什么需要使用专门的CA软件?这是因为,请求签名只是 CA 操作的一部分。其他操作包括:正确的扩展生成、CRL 和 CA 证书分发点(CDP 和 AIA 扩展)定义和维护、CA 数据库维护、吊销功能等。这些任务中的大多数都在 RFC 5280 中定义。 。不要推出自己的加密货币/CA,因为即使对于有经验的人来说,这也不是一件容易的事。

关于c# - 使用 C# 从 CA 证书创 build 备的 X509 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69971613/

相关文章:

c# - StringBuilder.AppendFormat 抛出异常

c# - AES 64 key 生成

c# - Windows Phone 8 应用程序上的流量数据,如何?使用条款呢?

.net - '1-dimensional array of byte' 类型的值无法转换为字节

c# - Serilog 序列化字段

c# - 错误的重载构造函数

azure - 使用合作伙伴组织的 Azure AD 角色

azure - Azure 搜索建议中存在不同的值?

c# - Visual Studio 不断崩溃

.net - Windows Azure 套接字