У нас есть сертификат, импортированный из файла .p12 и не помеченный как экспортируемый по соображениям безопасности.![enter image description here](https://i.stack.imgur.com/4I437.png)
Я хочу прочитать сертификат из магазина и создать из него 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