web-dev-qa-db-ja.com

X509証明書がサーバーに秘密鍵ファイルをロードしていません

GoogleアナリティクスAPIを使用しており、このSOの質問に従ってOAuthを設定しています: https://stackoverflow.com/a/13013265/129936

ここに私のOAuthコード:

public void SetupOAuth ()
{
    var Cert = new X509Certificate2(
        PrivateKeyPath, 
        "notasecret", 
        X509KeyStorageFlags.Exportable);
    var Provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, Cert)
    {
        ServiceAccountId = ServiceAccountUser,
        Scope = ApiUrl + "analytics.readonly"
    };
    var Auth = new OAuth2Authenticator<AssertionFlowClient>(Provider, AssertionFlowClient.GetState);
    Service = new AnalyticsService(Auth);
}

PrivateKeyPathは、Google API Consoleが提供する秘密鍵ファイルのパスです。これはローカルマシンでは完全に機能しますが、テストサーバーにプッシュすると、

System.Security.Cryptography.CryptographicException: An internal error occurred.

次のスタックトレースを使用します(無関係な部分は削除されます)。

System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) +33
System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags) +237
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags) +140
Metrics.APIs.GoogleAnalytics.SetupOAuth() in <removed>\Metrics\APIs\GoogleAnalytics.cs:36
Metrics.APIs.GoogleAnalytics..ctor(String PrivateKeyPath) in <removed>\Metrics\APIs\GoogleAnalytics.cs:31

そのため、ファイルのロードに問題があるように見えます。渡されたPrivateKeyPathを確認しましたが、正しい場所を指しています。

何か案は?これがサーバー、ファイル、コード、または何に問題があるのか​​わかりません。

41
gwely

私の頭に浮かぶものの1つは、アプリプールのIDです。ユーザープロファイルの読み込みがオンになっていることを確認してください。オンにしないと、暗号サブシステムが機能しません。

83
Wiktor Zychla

_p12_ファイルをロードしています

_new X509Certificate2(
HostingEnvironment.MapPath(@"~/App_Data/GoogleAnalytics-privatekey.p12"), ....
_

File.Exists(filename)がtrueを返したにもかかわらず、実際にFileNotFoundExceptionを受け取りました。

@Wiktor Zychlaが言ったように、_Load User Profile_を有効にするのと同じくらい簡単です

変更が必要な設定の画像を次に示します

IIS)の[アプリケーションプール]の下にあるアプリケーションプールを右クリックし、[詳細設定]を選択すると、必要な設定はほぼ半分になります。

enter image description here

ヒント:これまでに出会ったことがないのであまりにもあいまいなので、将来の時間の浪費を防ぐために、これでコードをコメントすることをお勧めします。

_  // If this gives FileNotFoundException see 
  // http://stackoverflow.com/questions/14263457/
_
30
Simon_Weaver

X509KeyStorageFlagsも指定してみてください

    var certificate = new X509Certificate2(KeyFilePath, KeyFilePassword, 
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | 
X509KeyStorageFlags.Exportable);
10
VahidN

上記のように、IISを構成する必要がありますが、私たちの場合、次のフォルダーの許可を確認する必要がある場合があります。

C:\ ProgramData\Microsoft\Crypto\RSA\MachineKeys

X509KeyStorageFlagsパラメーターを設定すると、このフォルダーにキーファイルが作成されます。私の場合、このフォルダの許可に違いがありました。上記のフォルダーにプールアカウントは追加されませんでした。

2
Shani