2010-09-09 3 views
1

У меня есть клиентское и серверное приложение, использующее SSLStream для связи через порт 80. И клиент, и сервер работают как службы Windows.Аутентификация клиента/сервера с SSLStream

Все работает в моей тестовой среде (мой компьютер разработки под ОС Windows 7 Ultimate). Моя проблема заключается в том, что когда я отправляюсь развертывать клиентское и серверное приложение в свои среды развертывания (сервер на Windows Server 2008 и клиент, находящийся на Windows Server 2003), он не работает, и я получаю сообщение об ошибке: «Клиент и сервер не может обмениваться данными, потому что у них нет общего алгоритма « Обратите внимание, что я установил тот же сертификат с помощью команд makecert (перечисленных в разделе« Первое »ниже)

Кроме того, когда я сдался пытаясь заставить клиента пройти аутентификацию на компьютере под управлением Windows Server 2003, я переместил его на совершенно новый/другой компьютер с Windows Server 2008 .. и затем получил новую ошибку в соответствии с «учетными данными, предоставленными для отказа пакета».

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

Во-первых, я использовал следующие команды с помощью Makecert.exe для создания самозаверяющими X509 Сертификаты (?):

- makecert -n "CN=Transcert" -r -sv Transcert.pvk Transcert.cer 
- makecert -sk Transcert -iv Transcert.pvk -n "CN=Transcert" -ic Transcert.cer Transcert.cer -sr LocalMachine -ss Root 

(Пожалуйста, обратите внимание, что я использовал «LocalMachine» на месте магазина, потому что это мое понимание что службы Windows использовать это место магазина через LocalSystem счет, я могу ошибаться)

Во-вторых, на сервере, я извлечь сертификат из магазина следующим кодом:?

X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); 
store.Open(OpenFlags.ReadOnly); 
X509CertificateCollection cert = store.Certificates.Find(X509FindType.FindBySubjectName, "Transcert", false); 
if (cert.Count > 0) 
{ 
    return cert[0]; 
} 

В-третьих, на сервере, я начинаю прослушивать TCP клиентов на порт 80:

public virtual void StartListening() 
{ 
    sslServer = new TcpListener(HostPort); 

    sslServer.Start(); 

    AcceptClientThread = new Thread(new ThreadStart(AcceptClientThread_Run)); 
    AcceptClientThread.Start(); 
} 

private void AcceptClientThread_Run() 
{ 
    try 
    { 
    TcpClient client = sslServer.AcceptTcpClient(); 

    ProcessNewClient(client); 
    } 
    catch (Exception ex) 
    { 

    } 

    AcceptClientThread_Run(); 
} 

В-четвертых, на сервере, я подготовить код для обработки, когда клиент подключается:

SslClient = pSslClient; 
    SSLCertificate = pSSLCertificate; 

    _SslStream = new SslStream(SslClient.GetStream()); 
    _SslStream.AuthenticateAsServer(SSLCertificate, false, SslProtocols.Tls, false); 

    Output = new StreamWriter(_SslStream); 
    Output.AutoFlush = true; 
    Input = new StreamReader(_SslStream); 

    ReadThread = new Thread(new ThreadStart(ReadIncomingData)); 
    ReadThread.Start(); 

Наконец о клиенте, я готовлю код для подключения клиента к серверу:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3; 

    sslClient = new TcpClient(); 
    sslClient.Connect(HostAddress, HostPort); 

    //ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; 

    sslStream = new SslStream(sslClient.GetStream(), false, new RemoteCertificateValidationCallback(CertificateValidationCallback)); 
    sslStream.AuthenticateAsClient("Trancert"); 

    showSslInfo(HostAddress, sslStream, true); 

- Выше все, что я есть в наличии в связи с этой проблемой -

ответ

1

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

Посмотрите на свойства сертификата в оснастке MMC диспетчера сертификатов, и вы увидите крошечный значок значка рядом с «У вас есть закрытый ключ, соответствующий этому сертификату».

Смежные вопросы