Как хранить сертификаты SSL / TLS в частном магазине - PullRequest
0 голосов
/ 10 октября 2019

У нас есть приложение ac #, которое связывается с устройствами. К настоящему времени мы просто устанавливаем сертификаты в магазине Windows.

Теперь нам нужно поведение, подобное «удаленному рабочему столу Windows». Как только мы подключаемся к устройству, мы получаем (самоподписанный) сертификат. Затем мы спрашиваем пользователя, доверяет ли он сертификату. Это довольно просто с SslStream.

Инициализация потока SSL:

SslStream sslStream = new SslStream(.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);

Обработчик:

static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors != SslPolicyErrors.None)
    {
        string certificateHash = CreateHash(certificate);

        //pseudo code -> go to database and check if the certificate is already trusted
        if(database.TrustedCertificates.Contains(certificateHash))
        {
            return true;
        }

        //TODO ask for permission 
        bool isTrusted = true;
        if (isTrusted)
        {
            //TODO add certificate (hash) to store
            database.TrustedCertificates.Add(certificateHash);
        }
    }
    return true;
}

Мы не хотим добавлять доверенные вручную сертификаты в окна, встроенные в хранилище. Вместо этого у нас будет собственный магазин сертификатов в нашей базе данных. Поэтому доверенный сертификат будет действителен только для нашего приложения.

Теперь мне интересно, лучше ли хранить доверенные сертификаты в собственном хранилище, а не добавлять их в хранилище сертификатов Windows (certlm.msc). Достаточно ли этого для сохранения их в базе данных приложения (просто создайте таблицу TrustedCertificates)? Нужно ли хэшировать сертификаты как пароли? Следует ли этого избежать в любом случае и использовать только хранилище сертификатов Windows?

Есть мысли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...