我正在try 使用我用OpenSSL生成的密钥.以下是我用来创建它们的命令:
openssl genrsa -out keypair-2023.pem 4096
openssl rsa -in keypair-2023.pem -pubout -out pub-2023.crt
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair-2023.pem -out priv-2023-v8.key
文件的格式是这样的……
-----BEGIN PUBLIC KEY-----
{{ public key contents }}
-----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
{{ private key contents }}
-----END PRIVATE KEY-----
下面是我try 过的几个代码片段,目的是让它们正常工作(以及结果)
var rsaKey = RSA.Create();
rsaKey.ImportFromPem(privateKeyStr);
rsaKey.ImportFromPem(publicKeyStr);
var rsaParams = rsaKey.ExportParameters(true);
var securityKey = new RsaSecurityKey(rsaParams);
结果:"ExportParameters"行中的System.Security.Cryptography.CryptographicException: 'Key does not exist.'
var privateKeyBuffer = new Span<byte>(new byte[privateKeyStr.Length]);
Convert.TryFromBase64String(privateKeyStr, privateKeyBuffer, out _);
var rsaKey = RSA.Create();
rsaKey.ImportRSAPrivateKey(privateKeyBuffer, out _);
rsaKey.ImportFromPem(publicKeyStr);
var rsaParams = rsaKey.ExportParameters(true);
结果:"ImportRSAPrivateKey"行为AsnContentException: The provided data is tagged with 'Universal' class value '0', but it should have been 'Universal' class value '16'
.
将"ImportRSAPrivateKey"方法替换为"ImportPkcs8PrivateKey"会引发相同的异常.
现在,这些密钥的用途是对JWT令牌进行签名和验证.如果我使用第一个代码片段,但使用"rsaKey"对象创建了"securityKey",则代码如下:
var rsaKey = RSA.Create();
rsaKey.ImportFromPem(privateKeyStr);
rsaKey.ImportFromPem(publicKeyStr);
var securityKey = new RsaSecurityKey(rsaKey);
_signingCredentials = new SigningCredentials(securityKey, Security算法rithms.RsaSha512);
_securityTokenHandler = new JwtSecurityTokenHandler();
应用程序启动,但是当我找到在创建JWT令牌时使用"_signingCredentials"的代码时,我得到了这个异常:System.Security.Cryptography.CryptographicException: 'Key does not exist.'
有没有一种方法可以正确使用密钥,以便我可以创建JWT令牌?(我怀疑,如果我可以超过var rsaParams = rsaKey.ExportParameters(true)
行,那么JWT令牌签名应该可以工作).