РЕДАКТИРОВАТЬ: Путь GitHub к примеру проекта находится здесь: https://oobi.visualstudio.com/_git/HttpHost
пожалуйста, извините мою noobi sh -ness с SSL и безопасными потоками. Я провел исследование, чтобы попытаться справиться с этим самостоятельно, но не видел подобного случая.
Я пытаюсь создать модуль переносимого сервера HTTPS (называемый HttpHost, потому что он также поддерживать HTTP, как только трудные вещи не в порядке) для использования в других программах, которые я могу иметь в виду в будущем, но из-за своей жизни я не могу заставить сервер принимать соединения, даже если у клиентов нет проблем с рукопожатием.
Мой код довольно прост для инициализации и запуска:
X509Certificate2 inputCert = new X509Certificate2("C:\\matt\\Matthew.pfx"); //self signed cert
HttpHost host = new HttpHost(inputCert);
host.StartSecureListen();
HttpHost при инициализации делает это:
public HttpHost(X509Certificate cert, int HTTPSport = DEFAULT_HTTPS_PORT) {
// variable validation and some other unrelated junk here...
this._listener = new TcpListener(_localIP, _port);
}
Класс HttpHost создает новый поток с ParameterizedThreadStart для каждого входящего запроса и обрабатывает их через эту пустоту:
private void ProcessSecureRequest(object arg) {
TcpClient client = arg as TcpClient;
string outputHTTPstatus = HttpStatusCode.OK.ToString();
string outputMimeType = "text/xml";
Console.WriteLine("InboundConnection: Client(" + client.Client.RemoteEndPoint.AddressFamily.ToString() + ")");
Console.WriteLine("DATA: " + ReadMessageFromSecureClient(client));
client.Close();
}
Здесь все становится интереснее
У меня есть пустота отвечает за прием клиента TCP и считывание отправляемых данных:
private string ReadMessageFromSecureClient(TcpClient client) {
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
SslStream sslStream = new SslStream(client.GetStream(), false);
sslStream.AuthenticateAsServer(_serverCert, false, SslProtocols.Tls, false); // <--- ERROR HERE
byte[] byteBuff = new byte[];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
do {
bytes = sslStream.Read(byteBuff , 0, byteBuff.Length);
Decoder dec = Encoding.UTF8.GetDecoder();
char[] chars = new char[dec .GetCharCount(byteBuff, 0, bytes) - 1 + 1];
dec .GetChars(buffer, 0, bytes, chars, 0);
messageData.Append(chars);
}
while (bytes != 0);
return messageData.ToString();
}
При переходе к 'https://localhost' из браузера (Edge Dev на основе Chromium), когда п rogram отлаживает, исключение составляет всегда , выдаваемое при установлении отношения к AuthenticateAsServer. Отладчик говорит:
System.Security.Authentication.AuthenticationException: 'A call to SSPI failed, see inner exception.'
Inner: Win32Exception: An unknown error occurred while processing the certificate
И при использовании Insomnia (REST / HTTP API Tester) и отправке пустого запроса GET на сервер я получаю эту ошибку:
System.Security.Authentication.AuthenticationException: 'A call to SSPI failed, see inner exception.'
Inner: Win32Exception: The certificate chain was issued by an authority that is not trusted
I ' мы уже установили этот сертификат в папку «Доверенные Root центры сертификации» на локальном компьютере. Но при использовании OpenSSL для проверки SSL-квитирования между клиентом и сервером (запускается на другом компьютере, чем отладчик), он завершается без ошибок:
openssl s_client -connect 192.168.0.100:443 -tls1_2
CONNECTED(0000011C)
───
no peer certificate available
───
No client certificate CA names sent
───
SSL handshake has read 1399 bytes and written 201 bytes
Verification: OK
───
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1583735493
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
───
Я создал этот сертификат с PowerShell "New-SelfSignedCertificate", и я не могу найти способ успешно аутентифицировать соединение SSL. Извините, это так долго, я хотел быть как можно более подробным.