2009-07-22 3 views
0

Это не вопрос, а необходимость уточнения. Вот код. Весь этот код отправляет отправку серского файла на сервер в httpwebrequest, который помещается на локальный диск. Мой вопрос: что произойдет, если несколько пользователей попытаются получить доступ к приложению одновременно. Я имею в виду 5-10 запросов, читающих один и тот же граф за раз. будет ли он нарушаться, говоря, что файл cer заблокирован каким-то другим потоком, чтобы читать/или он не сломается, потому что он только что прочитан?Несколько пользователей, одновременно получающих доступ к файлу сертификата

//You must change the path to point to your .cer file location. 
X509Certificate Cert = X509Certificate.CreateFromCertFile("C:\\mycert.cer"); 
// Handle any certificate errors on the certificate from the server. 
ServicePointManager.CertificatePolicy = new CertPolicy(); 
// You must change the URL to point to your Web server. 
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://YourServer/sample.asp"); 
Request.ClientCertificates.Add(Cert); 
Request.UserAgent = "Client Cert Sample"; 
Request.Method = "GET"; 
HttpWebResponse Response = (HttpWebResponse)Request.GetResponse(); 
// Print the repsonse headers. 
Console.WriteLine("{0}",Response.Headers); 
Console.WriteLine(); 
// Get the certificate data. 
StreamReader sr = new StreamReader(Response.GetResponseStream(), Encoding.Default); 
int count; 
char [] ReadBuf = new char[1024]; 
do 
{ 
    count = sr.Read(ReadBuf, 0, 1024); 
    if (0 != count) 
    { 
     Console.WriteLine(new string(ReadBuf)); 
    } 

}while(count > 0); 

ответ

0

Почему бы не отправить сертификат от пользователя магазина вместо файла и устранить беспокойство, как и во втором способе, описанном в How to send a client certificate by using the HttpWebRequest. Вам все равно нужно загрузить закрытый ключ в хранилище ключей, поэтому я действительно не вижу смысла использовать сертификат из файла .cer.

+0

Да, я знаю эту ссылку, откуда я получил этот код. Но вы знаете, что я пробовал это, и это боль, чтобы заставить его работать. Также причина, по которой я пошел на эту реализацию, потому что наш код размещен на сервере приложений. Поэтому мне действительно не нужно беспокоиться о безопасности. 2-й. Мне не нужно загружать закрытый ключ из хранилища сертификатов. Я могу предоставить доступ к учетной записи пользователя, которая будет читать секретный ключ cert, используя «winhttpcertcfg.exe» - он работает. –

+0

Этот winhttpcertcfg.exe запускает то, что делает, загружает закрытый ключ в хранилище пользовательских сертификатов. Как еще вы объясните, что ваш код не указывает местоположение закрытого ключа и пароль для доступа к нему ?. В любом случае, загрузка его из файла .cer работает нормально. У кого-то, кто читает файл .cer, нет угрозы (так как это * public *). Кроме того, замена файла .cer также не является реальной угрозой, необходим другой закрытый ключ, и если он имеет доступ к закрытому ключу, то на самом деле это не атака. Только серьезная проблема связана с операцией, случайным удалением или перемещением файла .cer. –

+0

ДА, я не указываю закрытый ключ или пароль в своем коде. Есть трюк, который вам нужно сделать. 1. Предоставьте доступ к закрытому ключу для файла .p12 для учетной записи, которая будет читаться (обычно ASPNET). 2. Затем экспортируйте этот файл p12 в хранилище Cert к учетной записи «local computer» 3. Теперь экспортируйте этот сертификат из хранилища сертификатов на ваш локальный диск. Вот и все. вам не нужно использовать секретный ключ/пароль в вашем коде. И учетная запись получит доступ к закрытому ключу. HTH. –

1

Читает не блокирует файлы в Windows, ....

+0

Это очень смелое заявление. Я просто хотел бы утверждать, что файлы, открытые в режиме совместного доступа, также могут быть открыты другими процессами, которые запрашивают общий режим. http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx –

+0

@Remus Rusanu: Я согласен; с дополнительной точкой, по которой File.OpenRead по умолчанию используется режим чтения-совместного использования. – Stobor