1

我从部署机器中得到了这个异常,这在我的开发机器中没有发生。这是一个 .net 框架网站。

System.Security.Cryptography.CryptographicException: The system cannot find the file specified.

   at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   at System.Security.Cryptography.Utils._CreateCSP(CspParameters param, Boolean randomKeyContainer, SafeProvHandle& hProv)
   at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
   at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
   at Org.BouncyCastle.Security.DotNetUtilities.CreateRSAProvider(RSAParameters rp)
   at Box.V2.JWTAuth.BoxJWTAuth..ctor(IBoxConfig boxConfig)

我的案例是网站中使用的 SDK 之一是读取 RSA private_keys.pem 文件。并在 github 中查看该 SDK 代码:

 var pwf = new PEMPasswordFinder(this.boxConfig.JWTPrivateKeyPassword);
        AsymmetricCipherKeyPair key;
        using (var reader = new StringReader(this.boxConfig.JWTPrivateKey))
        {
            key = (AsymmetricCipherKeyPair)new PemReader(reader, pwf).ReadObject();
        }
        var rsa = DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters)key.Private);

SDK 在我的开发机器上运行良好,但在部署机器上却不行。我不知道找不到什么指定的文件,我认为它不是 private_key.pem 文件。

所以我四处寻找,试图找出 Cryptogrphy 的工作原理。这是我发现的,如有错误请指出。看起来像 cryptoAPI,创建一个 RSA 密钥容器,如果应用程序级别没有权限访问密钥容器,它会抛出异常。那是在寻找指定的文件系统吗?

如果是,如何解决?

4

1 回答 1

1

我们在办公室遇到了类似的问题。最近的组策略更新从%ProgramData%\Microsoft\Crypto\RSA\MachineKeys文件夹中删除了权限。我们的应用程序正在使用 BouncyCastle 创建一个自签名证书。在政策更新之前安装了该应用程序的用户能够继续运行该应用程序。更新后安装该应用程序的用户无法运行该应用程序。使用 Process Monitor 帮助我们识别正在发生的事情(使用 Windows 资源管理器,我们可以看到创建的文件,但应用程序没有list folder contents)。

推送此组策略更新是为了使硬盘加密勒索软件应用程序无法创建加密驱动器所需的密钥。我们将努力为这个问题找到一个符合我们安全部门政策的永久解决方案。

于 2017-11-28T17:35:19.947 回答