2016-10-24 3 views
17

.Net (4.5.2) 서버에 장치를 연결하는 데 아무런 노력이 없습니다. TLS 1.2를 사용하는 장치에서 열린 TCP 연결입니다. TLS 1.2를 사용하여 TCP 서버에 클라이언트 연결

모든 .NET 클라이언트가 성공적으로 연결할 수 SslStream 내가 장치에 아무것도 변경할 수 없습니다 DotNetty

  • 을 통해 포장 : 서버 측에
    • , 나는 TCP 서버의 표준 닷넷 구현을 보안 TLS 연결을 사용하여 내 서버에 연결합니다. CURL을 시도 할 때도 작동하므로 TCP 서버가 정상적으로 작동한다고 결론을 냈습니다.

      그래서 나는 (Wireshark를 사용하여) 연결할 수없는 장치에서 보낸 작업 클라이언트가 보낸 것을 비교했습니다. 내가 찾은 중요한 차이점은 클라이언트 Hello TLS 메시지에 Server Name Extension (SNI)이 없다는 것입니다 (장치의 경우).

      내가 시도한 것은 수동으로 을 사용하여 서버에 데이터를 수동으로 전송하는 것입니다. 즉, 원시 바이트 배열을 사용하여 TCP SYN/TCP ACK/클라이언트 Hello 메시지를 수동으로 전송하는 것입니다 (원시 데이터 (Wireshark 덕분에) 내 서버에 연결). 서버 이름 확장명을 추가하여 작동하지 않는 클라이언트 Hello 원시 바이트 배열을 조정하면 TLS 핸드 셰이크가 작동하는 것으로 확인되었습니다.

      SNI 확장을 포함하지 않는 클라이언트와이 정보가없는 경우 핸드 셰이크를 거부하는 서버에 문제가 발생했습니다.

      내 TCP 서버가 서버 이름 확장명을 제공하지 않는 클라이언트를 받아들이는 방식을 어떻게 변경할 수 있습니까? 처음에는 .Net SslStream 클래스를 사용하여 표준을 사용할 수 있습니까?

      AFAIK, SNI 확장은 필수는 아니며 클라이언트가 사용할지 여부를 결정해야하므로 서버는 이론적으로에 클라이언트 Hello 메시지를 받아 들여야합니다.

      모든 포인터가 크게 감사하겠습니다.

  • +0

    나는 .NET이에 대한 제어가없는 유감 - SslStream'이 보안 채널에 대한 단지 관리되는 래퍼이며, 항상 아니다' 현재까지. 인증서 유효성 검사 콜백을 망쳐 봤니? 고객 안녕하세요 당신에게 잘 보이나요? 그것을 작동시키기 위해 더자를 수 있습니까? – Luaan

    +0

    클라이언트 장치가 * TLS1.2 연결을 설정할 수 있습니까? 예 : 주어진 https 웹 사이트에 브라우저를 통해? – wal

    +0

    이 작업을 절대적으로 받아 들여야하는 경우 SSLStream과 같은 다른 구현을 고려해야합니다. 예 : https://www.eldos.com/sbb/desc-ssl-spec.php와 같은 제품 (첫 번째 대안을 보증하지는 않습니다. 찾음) – wal

    답변

    1

    .Net 4.5.2는 TLS1.2를 지원하지만 기본적으로 사용하지 않도록 설정되어 있습니다.

    이 기능을 사용하려면 보안 프로토콜 집합을 명시 적으로 정의해야합니다.

    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 
    

    자세한 내용은 다음 링크를 참조하십시오 https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.securityprotocol%28v=vs.110%29.aspx

    +0

    API 호출 내에서이 작업을 수행 할 수 있는지 궁금합니다. – brendo234

    +0

    @ brendo234 나는 당신이 의미하는 바를 이해하지 못합니다. System.Net.ServicePointManager.SecurityProtocol은 API 호출입니다. – cristallo

    관련 문제