在 BouncyCastle .Net 中复制 openssl 命令

Duplicating openssl command in BouncyCastle .Net

我正在尝试生成 CSR 以用于 ApplePay。我们将在服务器上 运行 并随着时间的推移生成 1000 个。我更愿意在 code/memory 而不是 运行 中直接执行 openssl 命令,这样私钥永远不会在 HHD 上。

我知道这些 openssl 命令有效。

openssl ecparam -out private.key -name prime256v1 -genkey
openssl req -new -sha256 -key private.key -nodes -out request.csr -subj '/O=Your Name or Company/C=US' 

这是我的代码:

// generate the key with a specified curve,
X9ECParameters curve = NistNamedCurves.GetByName("P-256");
ECDomainParameters ecParam = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H, curve.GetSeed());
ECKeyPairGenerator keyGen = new ECKeyPairGenerator();
keyGen.Init(new ECKeyGenerationParameters(ecParam, new SecureRandom()));

AsymmetricCipherKeyPair keyPairServer = keyGen.GenerateKeyPair();

var p10builder = new Pkcs10CertificationRequest
(
    "SHA256WITHECDSA",
    new X509Name("O=NAB Test,C=US"),
    keyPairServer.Public,
    null,
    keyPairServer.Private
);

// build string to send to Apple
string csr = CSR_HEADER + "\r\n" + Convert.ToBase64String(p10builder.GetEncoded()) + "\r\n" + CSR_FOOTER;

Apple 的页面接受了证书并为我提供了响应证书,以便我从中提取一些信息。然而,当我 'activate' 这个证书时,我得到 'unknown error'。因为我正在使用 BC Apple 支持拒绝提供帮助。我注意到的一件事是我的 CSR 数据大约是 OpenSSL 数据的两倍。

我认为这可能与节点有关,但我不确定。

原来问题出在曲线如何传递到密钥生成器上。如果您传递密钥参数,则所有数据最终都会出现在证书中。如果您只使用曲线的 OID,它不会传递所有曲线数据,这就是 Apple 不高兴的地方。

DerObjectIdentifier ecParam = new DerObjectIdentifier("1.2.840.10045.3.1.7");