Сертификат X509 не загружает файл закрытого ключа на сервер

Я использую API Google Analytics, и я выполнил этот вопрос SO, чтобы настроить OAuth: qaru.site/info/52157/...

Вот мой код 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, который был передан, и он указывает на правильное местоположение.

Любые идеи? Я не знаю, если это проблема с сервером, файлом, кодом или чем-то.

Ответ 1

Одна из вещей, которая приходит мне на ум - это идентификатор вашего пула приложений, убедитесь, что включен Загрузить пользовательский профиль, иначе криптоподсистема не работает.

Ответ 2

Я загружаю файл p12

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

На самом деле я получил исключение FileNotFoundException, хотя File.Exists(filename) возвратил true.

Как @Wiktor Zychla сказал это так же просто, как включение Load User Profile

Здесь изображение настройки, которая нуждается в изменении

Просто щелкните правой кнопкой мыши на пуле приложений в разделе "Пулы приложений" в IIS и выберите "Дополнительные настройки", а нужный вам параметр находится на полпути вниз.

enter image description here

Совет. Я бы рекомендовал комментировать ваш код с этим, чтобы предотвратить трату времени впустую, так как это неясно, если вы никогда не сталкивались с этим раньше.

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

Ответ 3

Также попробуйте указать X509KeyStorageFlags

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

Ответ 4

Как уже упоминалось выше, вам нужно настроить IIS, но как наш случай, некоторое время вам нужно проверить разрешение следующей папки:

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

Если вы установите параметр X509KeyStorageFlags, он создаст файл ключа в этой папке. В моем случае была разница в разрешении этой папки. Учетная запись пула не была добавлена ​​в указанную папку.

Ответ 5

Нет, это "File.Exists(...)" также в расширенных настройках? У меня было 3 пула, все они были включены для "Загрузить профиль пользователя". Я думаю, что моя проблема может иметь какое-то отношение к зависимостям и пакетам NuGet, поскольку код работает отлично, как приложение консоли, но дает мне проблемы в MVC.