它不像单一方法那么简单,但这应该可以在 .Net 4.6.1 中解决问题。它仅适用于包含 RSA 密钥的 PFX,但这基本上是 PFX 和 KeyVault 都支持的唯一内容。代码如下:
X509Certificate2 cert = new X509Certificate2(
pfxBytes,
password,
X509KeyStorageFlags.Exportable);
using (RSA rsa = cert.GetRSAPrivateKey())
{
var parameters = rsa.ExportParameters(true);
KeyBundle bundle = new KeyBundle
{
Key = new JsonWebKey
{
Kty = JsonWebKeyType.Rsa,
// Private stuff
D = parameters.D,
DP = parameters.DP,
DQ = parameters.DQ,
P = parameters.P,
Q = parameters.Q,
QI = parameters.InverseQ,
// Public stuff
N = parameters.Modulus,
E = parameters.Exponent,
},
};
}
如果您使用的是旧版本的 .Net,则必须使用 RSA rsa = (RSA) cert.PrivateKey 而不是 cert.GetRSAPrivateKey(),但建议使用上面的代码,因为它可以更清楚地处理 IDisposable 和非 RSA 密钥。