You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6下RSA.ImportFromPem在WinForms正常,ASP.NET Core Web API报错

RSA签名在.NET 6 WinForms正常但ASP.NET Core Web API报错「系统找不到指定文件」的原因及解决

问题场景

这段C#代码在.NET 6 Windows Forms应用中运行正常:

using (RSA rsa = RSA.Create()) 
{
    rsa.ImportFromPem(privateKeyString);
    byte[] dataToSign = Encoding.UTF8.GetBytes(signData);
    byte[] signedData = rsa.SignData(dataToSign, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    signatureBase64 = Convert.ToBase64String(signedData);
}

但在.NET 6 ASP.NET Core Web API中执行时,抛出异常:

系统找不到指定文件

其中privateKeyString为PKCS#8格式:

-----BEGIN PRIVATE KEY----- 
..... 
-----END PRIVATE KEY-----

问题根源

核心差异在于.NET 6对RSA实现的平台默认选择:

  • Windows Forms运行在Windows环境,RSA.Create()默认使用Windows CNG加密库,处理PKCS#8私钥无需额外依赖,运行正常。
  • ASP.NET Core如果部署在Linux/macOS环境,RSA.Create()默认使用OpenSSL-backed的RSA实现。当导入PKCS#8私钥时,OpenSSL可能会尝试访问系统默认证书存储或依赖文件,若环境缺少OpenSSL库、权限不足,或私钥解析异常,就会抛出「找不到指定文件」的模糊错误(实际是OpenSSL内部依赖加载失败)。

解决方法

1. 显式指定跨平台兼容的RSA实现

根据运行平台选择对应的RSA实现,避免默认实现的平台差异:

using System.Runtime.InteropServices;
// ...
using (RSA rsa = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) 
    ? new RSACng() 
    : new RSAOpenSsl())
{
    rsa.ImportFromPem(privateKeyString);
    byte[] dataToSign = Encoding.UTF8.GetBytes(signData);
    byte[] signedData = rsa.SignData(dataToSign, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    signatureBase64 = Convert.ToBase64String(signedData);
}

注意:Linux环境需确保安装了OpenSSL库(如libssl-dev或openssl-libs)。

2. 清理私钥字符串的无效字符

私钥字符串中的多余换行、空白字符可能导致OpenSSL解析失败,先做清理:

privateKeyString = privateKeyString.Trim()
    .Replace("\r\n", "\n")
    .Replace("\r", "\n");

3. 安装Linux环境的OpenSSL依赖

若部署在Linux服务器,安装对应版本的OpenSSL运行时库:

  • Debian/Ubuntu:sudo apt-get install libssl1.1(根据系统版本调整)
  • CentOS/RHEL:sudo yum install openssl-libs

内容的提问来源于stack exchange,提问作者Orgil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:23:11