Я пытаюсь защитить закрытый ключ сертификата в Windows 10, но похоже, что я неправильно понимаю, что делает «Управление закрытыми ключами».
Я следовал этому процессу:
Изменить - я попытался повторить весь процесс сегодня утром, и теперь получаю ошибку, как и ожидалось. Смотрите мой ответ ниже.
New-SelfSignedCertificate -DnsName test.pfx -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddDays(7)
бегать certlm.msc
Найти test.pfx
сертификат, щелкните его правой кнопкой мыши и выберите all tasks > manage private keys
удалять все из списка, включая администраторов, поэтому вы получите сообщение: «Никакие группы или пользователи не имеют разрешения на доступ к этому объекту. Однако владелец этого объекта может назначать разрешения». и нажмите ОК.
дважды щелкните сертификат, перейдите на вкладку сведений, выберите «только свойства» в раскрывающемся списке, щелкните отпечаток пальца, скопируйте и вставьте его в блокнот.
откройте Visual Studio (как обычный пользователь, а не администратор, т.е. другую учетную запись), создайте новое консольное приложение и введите следующий код:
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
const string thumbprint = "<THUMBPRINT>";
using (var store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
if (certs.Count != 1)
throw new Exception("certificate count <> 1");
var cert = certs[0];
// why doesn't this fail?
var privateKey = cert.GetRSAPrivateKey();
privateKey.Dispose();
}
}
}
}
скопируйте / вставьте отпечаток пальца из блокнота, чтобы заменить его в коде
запустить код
Я ожидаю, что GetRSAPrivateKey () завершится неудачно, но это не так. (Я также могу использовать закрытый ключ для расшифровки материалов, если добавлю больше кода).
Я также посмотрел на% ALLUSERSPROFILE% \ Application Data \ Microsoft \ Crypto \ Keys, и разрешения для последнего измененного "файла" закрытого ключа соответствуют ожиданиям (т.е. нет доступа для всех).
Я попытался повторить весь процесс сегодня утром, и теперь получаю ожидаемую ошибку. Однако, если я использую вчерашний отпечаток сертификата, я все равно не получаю ошибки, несмотря на то, что они настроены точно так же в certlm.msc
Впоследствии я понял (мой плохой!), что в случае предыдущего сертификата я забыл, что я импортировал его дважды во время тестирования, то есть создал + импортировал с помощью команды powershell, как указано выше, разрешил чтение для пользователя, но затем удалил и повторно импортировал pfx файл.
Таким образом, я обнаружил, что когда вы удаляете файл сертификата из certlm.msc, он НЕ удаляет связанный файл ключа в% ALLUSERSPROFILE% \ Application Data \ Microsoft \ Crypto \ Keys, и если пользователь, например, права на чтение предыдущего ключевого файла, тогда у пользователя по-прежнему будет доступ к сертификату. Точно так же обновление разрешений в certlm.msc не влияет на предыдущий файл. Кроме того, изменение прав доступа к старому ключевому файлу повлияет на права доступа к сертификату. Таким образом, предположительно, действующие разрешения объединяют все существующие разрешения из всех связанных файлов ключей, но я не вникал в это подтверждение.
Вывод: certlm.msc показывает текущие связанные права доступа к ключевому файлу не ключевые разрешения (которые создаются из всех файлов ключей с одним и тем же ключом).
Таким образом, решение состоит в том, чтобы удалить предыдущий связанный файл ключей из% ALLUSERSPROFILE% \ Application Data \ Microsoft \ Crypto \ Keys.
Я поднял его в MS на случай, если они могут предоставить дополнительную информацию: https://social.technet.microsoft.com/Forums/en-US/27e7780e-c755-41bc-9d9f-f141ba842733/certlmmsc-private-key-permissions-are-misleading-and-could-lead-to-a- нарушение безопасности? forum = winserversecurity