Получить GoogleCredential из неэкспортируемого сертификата - PullRequest
0 голосов
/ 13 февраля 2019

У нас есть сертификат, импортированный из файла .p12 и не помеченный как экспортируемый по соображениям безопасности.enter image description here

Я хочу прочитать сертификат из магазина и создать из него GoogleCredential для Google Cloud.
Я читаю сертификат как

public X509Certificate2 GetCetificate(StoreName store, StoreLocation location, string thumbprint)
        {
            try
            {
                X509Store x509Store = new X509Store(store, location);
                x509Store.Open(OpenFlags.ReadOnly);
                X509Certificate2Collection collection = x509Store.Certificates;
                collection = (X509Certificate2Collection)x509Store.Certificates.Find(X509FindType.FindByThumbprint,
                    thumbprint, false);
                if (collection.Count > 0)
                {
                    return collection[0];
                }
                else
                {
                    throw new CryptographicException(string.Format(
                        "Certificate not found, Please install the certficate @ {0}",
                        location.ToString()));
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

Когдапопробуйте создать учетные данные учетной записи службы Google из сертификата, как показано ниже, получая ошибку как System.Security.Cryptography.CryptographicException: 'Key not valid for use in specified state.

var certificate = GetCetificate(StoreName.My, toreLocation.LocalMachine, _thubmprint);
var credential = new ServiceAccountCredential(
                    new ServiceAccountCredential.Initializer(
                        _serviceAccountName
                    )
                    {
                        Scopes = scopes
                    }.FromCertificate(certificate));
 var googleCredential =
                    GoogleCredential.FromAccessToken(credential.GetAccessTokenForRequestAsync().Result);

Для получения дополнительной информации я проверил метод ServiceAccountCredential.FromCertificate в Google SDK и он выглядит следующим образом:

 /// <summary>Extracts a <see cref="Key"/> from the given certificate.</summary>
            public Initializer FromCertificate(X509Certificate2 certificate)
            {
#if NETSTANDARD1_3 || NETSTANDARD2_0
                Key = certificate.GetRSAPrivateKey();
#elif NET45
                // Workaround to correctly cast the private key as a RSACryptoServiceProvider type 24.
                RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certificate.PrivateKey;
                byte[] privateKeyBlob = rsa.ExportCspBlob(true);
                Key = new RSACryptoServiceProvider();
                Key.ImportCspBlob(privateKeyBlob);
#else
#error Unsupported target
#endif
                return this;
            }
        }

Если коротко, у меня есть вопросы

  • Как экспортировать закрытый ключ из сертификата, который был помечен как неэкспортируемый (как устранить ошибку System.Security.Cryptography.CryptographicException: 'Key not valid for use in specified state.)
  • или как сделать метод ServiceAccountCredential.FromCertificate работоспособным для неэкспортируемого ключа
  • Существуют ли другие способы / методы для создания учетных данных Google из сертификата неэкспортируемого ключа
  • Если мы пометим ключ как экспортируемый,какова будет проблема безопасности
  • Если сертификат не экспортируемого ключа не работает для Google SDK, то какойctly использование подобных сертификатов
  • Некоторые ссылка утверждает, что это возможно, у кого-нибудь есть идеи, как мы можем сделать это в .Net
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...