Как приложение для настольного компьютера подписывает сообщение с помощью Microsoft Passport (Windows Hello)?
Используя Microsoft Password (Windows Hello), пользователю предоставляется пара открытых / закрытых пар ключей, когда они устанавливают ПИН для своей локальной учетной записи. Эта пара ключей хранится в TPM компьютера.
Вы можете создать сертификат для своей учетной записи, попросив в меню "Пуск" "Настроить вход с помощью PIN-кода".
В следующей статье описываются API, используемые в приложении UWP ("Metro"): https://msdn.microsoft.com/en-us/windows/uwp/security/microsoft-passport
Существуют API для извлечения открытого ключа пользователя и подписания сообщения:
var openKeyResult = await KeyCredentialManager.OpenAsync(AccountId);
if (openKeyResult.Status == KeyCredentialStatus.Success)
{
var userKey = openKeyResult.Credential;
var publicKey = userKey.RetrievePublicKey();
var signResult = await userKey.RequestSignAsync(message);
if (signResult.Status == KeyCredentialStatus.Success)
{
return signResult.Result;
}
else if (signResult.Status == KeyCredentialStatus.UserPrefersPassword)
{
}
}
Как получить открытый ключ и подписать сообщение с помощью приложения для настольного компьютера (Win32)?
Я проверил, используя certmgr.msc
: сертификат Microsoft Passport, к сожалению, не отображается в "личном" хранилище сертификатов пользователя, поэтому я не вижу способа получить к нему доступ с помощью CryptoAPI/CNG, который мое приложение уже поддерживает.
В идеале я хотел бы сделать отдельную подпись. Было бы интересно / полезно узнать, возможно ли использовать паспортный сертификат с SChannel в качестве клиентского сертификата.