google API を呼ぶために、X509Certificate2を使用して、サービスアカウント認証をする際に、証明書ファイルが見つからないとエラーになる場合の対処方法

投稿者: | 1月 4, 2015

Google APIs Client Library for .NETの解説ページで、Service accountのサンプルプログラムが掲載されている。しかし、このコード、環境によってはエラーが発生してしまう。

指定されたパスが見つかりません。
   場所 System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   場所 System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(String fileName)
   場所 System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
   場所 System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
   場所 System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
   場所 Loki.googleAdminReportMVC.usageReportService.<Run>d__e.MoveNext() 場所 e:\Loki\Loki.googleAdminReportMVC\usageReportService.cs:行 22

英語だと「The certificate file does not exist.」、日本語だと「指定されたパスが見つかりません。」と言われてしまう。

問題のコードは次のようなコード。

            var certificate = new X509Certificate2(@"~/key.p12", "notasecret", X509KeyStorageFlags.Exportable);
            ServiceAccountCredential credential = new ServiceAccountCredential(
               new ServiceAccountCredential.Initializer(serviceAccountEmail)
               {
                   Scopes = new[] { ReportsService.Scope.AdminReportsUsageReadonly },
               }.FromCertificate(certificate));

間違いなくファイルもあるのだけど、無いと言われる。

仕方が無いので次のように、「HostingEnvironment.MapPath」を使うように書き換えたら、エラーが出なくなった。

ちなみに、上記コードだと、まだ認証が通らないので、プロパティを一つ追加している。

            var certificate = new X509Certificate2(HostingEnvironment.MapPath(@"~/key.p12"), "notasecret", X509KeyStorageFlags.Exportable);
            ServiceAccountCredential credential = new ServiceAccountCredential(
               new ServiceAccountCredential.Initializer(serviceAccountEmail)
               {
                   Scopes = new[] { ReportsService.Scope.AdminReportsUsageReadonly },
                   User = "hoge@example.com"
               }.FromCertificate(certificate));

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください