SslStream с TcpListener: не могу аутентифицироваться как сервер - PullRequest
0 голосов
/ 09 марта 2020

РЕДАКТИРОВАТЬ: Путь 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. Извините, это так долго, я хотел быть как можно более подробным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...