【问题标题】:X509Certificate2 - the system cannot find the path specifiedX509Certificate2 - 系统找不到指定的路径
【发布时间】:2013-05-26 03:57:31
【问题描述】:

我希望通过服务帐户获取 Google Analytics 的数据。 当我第一次启动应用程序时,一切正常并且我可以访问数据。但是当我第二次启动应用程序时,出现以下错误:“系统找不到指定的路径”。你有想法吗?我以为它可以是一把锁。

这是我的源代码:

   public static String GetAccessToken(string clientIdEMail, string keyFilePath, String scope)
    {
        // certificate
        var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);

        // header
        var header = new { typ = "JWT", alg = "RS256" };

        // claimset
        var times = GetExpiryAndIssueDate();
        var claimset = new
        {
            iss = clientIdEMail,
            scope = scope,
            aud = "https://accounts.google.com/o/oauth2/token",
            iat = times[0],
            exp = times[1],
        };

        JavaScriptSerializer ser = new JavaScriptSerializer();

        // encoded header
        var headerSerialized = ser.Serialize(header);
        var headerBytes = Encoding.UTF8.GetBytes(headerSerialized);
        var headerEncoded = Convert.ToBase64String(headerBytes);

        // encoded claimset
        var claimsetSerialized = ser.Serialize(claimset);
        var claimsetBytes = Encoding.UTF8.GetBytes(claimsetSerialized);
        var claimsetEncoded = Convert.ToBase64String(claimsetBytes);

        // input
        var input = headerEncoded + "." + claimsetEncoded;
        var inputBytes = Encoding.UTF8.GetBytes(input);

        // signiture
        var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
        var cspParam = new CspParameters
        {
            KeyContainerName = rsa.CspKeyContainerInfo.KeyContainerName,
            KeyNumber = rsa.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2,
            Flags = CspProviderFlags.UseMachineKeyStore
        };
        var aescsp = new RSACryptoServiceProvider(1024,cspParam) { PersistKeyInCsp = false };
        var signatureBytes = aescsp.SignData(inputBytes, "SHA256");
        var signatureEncoded = Convert.ToBase64String(signatureBytes);

        // jwt
        var jwt = headerEncoded + "." + claimsetEncoded + "." + signatureEncoded;

        var client = new WebClient();
        client.Encoding = Encoding.UTF8;
        var uri = "https://accounts.google.com/o/oauth2/token";
        var content = new NameValueCollection();

        content["assertion"] = jwt;
        content["grant_type"] = "urn:ietf:params:oauth:grant-type:jwt-bearer";

        string response = Encoding.UTF8.GetString(client.UploadValues(uri, "POST", content));

        JsonGoogleResponse result = (ser.Deserialize<JsonGoogleResponse>(response));



        return result.access_token;
    }

这是堆栈:

  à   System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
  à System.Security.Cryptography.SafeProvHandle._FreeCSP(IntPtr pProvCtx)
  à System.Security.Cryptography.SafeProvHandle.ReleaseHandle()
  à System.Runtime.InteropServices.SafeHandle.InternalFinalize()
  à System.Runtime.InteropServices.SafeHandle.Dispose(Boolean disposing)
  à System.Runtime.InteropServices.SafeHandle.Finalize()

【问题讨论】:

    标签: asp.net google-api oauth-2.0 x509certificate2


    【解决方案1】:

    所以,我遇到了完全相同的问题。我尝试解决了将近 4 个小时。

    问题出在密钥的传递路径中。因为我使用了 Google 示例控制台应用程序中的代码,其中路径只是“key.p12”,并且密钥与 exe 文件位于同一目录中。

    当我想创建MVC应用程序时,我没有意识到,虚拟服务器路径的根不能像“key.p12”一样被调用。

    解决方案

    仔细检查密钥的路径。如果是 MVC 应用程序(或其他 ASP Web),则将密钥文件添加到根目录并在代码中使用 Server.MapPath("key.p12") 调用密钥。

    【讨论】:

      【解决方案2】:

      如果您在 IIS 中运行,您需要在应用程序池的高级设置中将“加载用户配置文件”设置为 True,以便能够通过文件名和密码加载证书。

      【讨论】:

      • 非常感谢你,你是最棒的:)
      • 如何在 Azure 中执行此操作?
      • Google 现在允许通过 json 而不是证书文件进行身份验证。我还没有玩过它,但实际上我今天刚刚为一个项目下载了我的 json 文件。转到:console.developers.google.com/apis/credentials 选择一个项目,单击“创建凭据”并选择“服务帐户密钥”。然后选择 JSON 而不是 P12。
      • 非常感谢
      【解决方案3】:

      我刚刚遇到了同样的问题,在我的情况下,它是路径中的一个空格。我不知道为什么,但是当我将 p12 文件放在 c:\ root 上时,它正在工作......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 2018-12-12
        • 2016-04-23
        • 2017-01-04
        • 2014-04-24
        • 2017-03-03
        相关资源
        最近更新 更多