У нас есть приложение 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?
Есть мысли?