【问题标题】:Create CSR with Bouncy Castle (C#) inclusive EC Curve Name使用 Bouncy Castle (C#) 包含 EC 曲线名称创建 CSR
【发布时间】:2021-07-05 15:30:53
【问题描述】:

我使用 Bouncy Castle 创建了一个 CSR,并在 HSM(EC 密钥)上签名。它工作正常!但在 CSR 内容中(以及后来的证书中)没有 EC 曲线名称。相反,有曲线的参数。一些客户对此有问题,例如:Phyton。在屏幕截图中,您可以看到 OpenSSL 是如何做到的。如何强制 Bouncy Castle 在 CSR 中写入曲线名称?

将公钥添加到 CSR 的代码:

IList oids = new ArrayList();
IList values = new ArrayList();
..........

SubjectKeyIdentifier subjectKeyIdentifier = new SubjectKeyIdentifierStructure(publicKey);
X509Extension ski = new X509Extension(true, new DerOctetString(subjectKeyIdentifier));
oids.Add(X509Extensions.SubjectKeyIdentifier);
values.Add(ski);

AttributePkcs attribute = new AttributePkcs(PkcsObjectIdentifiers.Pkcs9AtExtensionRequest,
                  new DerSet(new X509Extensions(oids, values)));
//End Extensions

// SIGN on HSM
Pkcs10CertificationRequestDelaySigned csr = new Pkcs10CertificationRequestDelaySigned(
                    signatureAlgorithmStr,
                    subject,
                    publicKey,
                    new DerSet(attribute)
                );
......

屏幕截图:使用 Bouncy Castle 和 OpenSSL 的 CSR

【问题讨论】:

    标签: c# bouncycastle


    【解决方案1】:

    问题不在于BouncyCastle,而在于如何生成/初始化公钥。 您可以选择命名曲线扩展组参数,但不能同时选择两者。
    从技术上讲,它们是等效的,但在使用方面,它们不能很好地相互混合。因此,如果您想同时满足这两种情况,则必须同时生成两者。
    我不知道您是如何初始化公钥的,但您可以在签名之前转换为不同的公钥类型。

    AsymmetricKeyParameter publicKey = null;
    // ... existing public key by some means
    var castedPublicKey = (ECPublicKeyParameters)publicKey;
    var newPublicKey = new ECPublicKeyParameters(
                    castedPublicKey.AlgorithmName
                    ,castedPublicKey.Q,
                    X9ObjectIdentifiers.Prime256v1);
    // ... rest of code
    // SIGN on HSM
    Pkcs10CertificationRequestDelaySigned csr = new Pkcs10CertificationRequestDelaySigned(
                        signatureAlgorithmStr,
                        subject,
                        newPublicKey,
                        new DerSet(attribute)
                    );
    

    Prime256v1 更改为您正在使用的任何曲线

    【讨论】:

    • 谢谢,它有帮助。当我从 HSM 查询 EC-Public 并从 EC-Point 创建它时,我必须使用“NamedCurve”-> X9ObjectIdentifiers.Prime256v1 它可以工作。谢谢!
    • ECPublicKeyParameters pubKeyParameters = new ECPublicKeyParameters("ECDSA", ecPoint, X9ObjectIdentifiers.Prime256v1);
    • 很高兴它有帮助,如果它有助于解决问题,您可以投票或将答案标记为已接受
    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2018-02-20
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多