Как приложение для настольного компьютера подписывает сообщение с помощью 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 в качестве клиентского сертификата.

0 ответов

Другие вопросы по тегам