У меня есть клиентское и серверное приложение, использующее 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);
- Выше все, что я есть в наличии в связи с этой проблемой -