2017-12-07 86 views
6

TLS 1.2가있는 요청에 System.Net.WebRequest을 사용할 수 없습니다. 이렇게하면 예외 The request was aborted: Could not create SSL/TLS secure channel.이 표시되고 프로토콜 오류 Handshake Failure이 표시됩니다.System.Net.WebRequest 및 TLS 1.2가 haproxy를 사용하여 '핸드 셰이크 실패'를 만듭니다.

TLS 1.2를 통한 연결 및 인증은 Internet Explorer 및 Chrome에서 작동합니다. OpenSSL은 TLS 1.2를 통해이 enpoint에 연결할 수 있습니다. 비 기본을 사용하여 인증

  • 에 대한

    설정

    1. 사용 ClientCertificates 포트 TLS 1.2을 사용하여
    2. 엔드 포인트는 haproxy하지만 이것은 블랙 박스
    3. .NET 4.7과 C#
    4. 입니다

    코드 스 니펫

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
    var req = WebRequest.Create($"https://{host}:{port}"); 
    ((HttpWebRequest)req).ClientCertificates = new X509Certificate2Collection(GetCertificate()); 
    var requestStream = req.GetRequestStream(); 
    

    GetCertificate() 메서드는이 소프트웨어에 포함 된 개인 키가있는 certificat를 반환합니다. 순서에서 와이어 샤크

    와이어 샤크

    텍스트 출력 발생 시킬수.

    클라이언트 안녕하세요

    Secure Sockets Layer 
        TLSv1.2 Record Layer: Handshake Protocol: Client Hello 
         Content Type: Handshake (22) 
         Version: TLS 1.2 (0x0303) 
         Length: 207 
         Handshake Protocol: Client Hello 
          Handshake Type: Client Hello (1) 
          Length: 203 
          Version: TLS 1.2 (0x0303) 
          Random: 5a292ab72d2173fc286aebe2c4cc991ee619e1cc81b5bb39... 
          Session ID Length: 0 
          Cipher Suites Length: 60 
          Cipher Suites (30 suites) 
          Compression Methods Length: 1 
          Compression Methods (1 method) 
          Extensions Length: 102 
          Extension: server_name (len=43) 
           Type: server_name (0) 
           Length: 43 
           Server Name Indication extension 
            Server Name list length: 41 
            Server Name Type: host_name (0) 
            Server Name length: 38 
            Server Name: [REMOVED] 
          Extension: supported_groups (len=8) 
           Type: supported_groups (10) 
           Length: 8 
           Supported Groups List Length: 6 
           Supported Groups (3 groups) 
          Extension: ec_point_formats (len=2) 
           Type: ec_point_formats (11) 
           Length: 2 
           EC point formats Length: 1 
           Elliptic curves point formats (1) 
          Extension: signature_algorithms (len=20) 
           Type: signature_algorithms (13) 
           Length: 20 
           Signature Hash Algorithms Length: 18 
           Signature Hash Algorithms (9 algorithms) 
          Extension: SessionTicket TLS (len=0) 
           Type: SessionTicket TLS (35) 
           Length: 0 
           Data (0 bytes) 
          Extension: extended_master_secret (len=0) 
           Type: extended_master_secret (23) 
           Length: 0 
          Extension: renegotiation_info (len=1) 
           Type: renegotiation_info (65281) 
           Length: 1 
           Renegotiation Info extension 
            Renegotiation info extension length: 0 
    

    Server Name: [REMOVED] 오른쪽 서버 이름을 포함합니다.

    서버 안녕하세요

    Secure Sockets Layer 
        TLSv1.2 Record Layer: Handshake Protocol: Server Hello 
         Content Type: Handshake (22) 
         Version: TLS 1.2 (0x0303) 
         Length: 65 
         Handshake Protocol: Server Hello 
          Handshake Type: Server Hello (2) 
          Length: 61 
          Version: TLS 1.2 (0x0303) 
          Random: 5a292ab7238205b2b8a2e6692abfd518a054515e53cd5b16... 
          Session ID Length: 0 
          Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) 
          Compression Method: null (0) 
          Extensions Length: 21 
          Extension: server_name (len=0) 
           Type: server_name (0) 
           Length: 0 
          Extension: renegotiation_info (len=1) 
           Type: renegotiation_info (65281) 
           Length: 1 
           Renegotiation Info extension 
            Renegotiation info extension length: 0 
          Extension: ec_point_formats (len=4) 
           Type: ec_point_formats (11) 
           Length: 4 
           EC point formats Length: 3 
           Elliptic curves point formats (3) 
          Extension: SessionTicket TLS (len=0) 
           Type: SessionTicket TLS (35) 
           Length: 0 
           Data (0 bytes) 
    

    인증서

    Secure Sockets Layer 
        TLSv1.2 Record Layer: Handshake Protocol: Certificate 
         Content Type: Handshake (22) 
         Version: TLS 1.2 (0x0303) 
         Length: 3855 
         Handshake Protocol: Certificate 
          Handshake Type: Certificate (11) 
          Length: 3851 
          Certificates Length: 3848 
          Certificates (3848 bytes) 
    

    서버는 안녕하세요 완료

    Secure Sockets Layer 
        TLSv1.2 Record Layer: Handshake Protocol: Server Key Exchange 
         Content Type: Handshake (22) 
         Version: TLS 1.2 (0x0303) 
         Length: 589 
         Handshake Protocol: Server Key Exchange 
          Handshake Type: Server Key Exchange (12) 
          Length: 585 
          EC Diffie-Hellman Server Params 
           Curve Type: named_curve (0x03) 
           Named Curve: secp256r1 (0x0017) 
           Pubkey Length: 65 
           Pubkey: ... 
           Signature Hash Algorithm: 0x0401 
           Signature Length: 512 
           Signature: ... 
    

    여러 핸드 셰이크 메시지

    Secure Sockets Layer 
        TLSv1.2 Record Layer: Handshake Protocol: Multiple Handshake Messages 
         Content Type: Handshake (22) 
         Version: TLS 1.2 (0x0303) 
         Length: 77 
         Handshake Protocol: Certificate 
          Handshake Type: Certificate (11) 
          Length: 3 
          Certificates Length: 0 
         Handshake Protocol: Client Key Exchange 
          Handshake Type: Client Key Exchange (16) 
          Length: 66 
          EC Diffie-Hellman Client Params 
           Pubkey Length: 65 
           Pubkey: ... 
        TLSv1.2 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec 
         Content Type: Change Cipher Spec (20) 
         Version: TLS 1.2 (0x0303) 
         Length: 1 
         Change Cipher Spec Message 
        TLSv1.2 Record Layer: Handshake Protocol: Encrypted Handshake Message 
         Content Type: Handshake (22) 
         Version: TLS 1.2 (0x0303) 
         Length: 40 
         Handshake Protocol: Encrypted Handshake Message 
    

    핸드 셰이크 실패 @에

    Secure Sockets Layer 
        TLSv1.2 Record Layer: Alert (Level: Fatal, Description: Handshake Failure) 
         Content Type: Alert (21) 
         Version: TLS 1.2 (0x0303) 
         Length: 2 
         Alert Message 
          Level: Fatal (2) 
          Description: Handshake Failure (40) 
    

    업데이트

    들으 지금 자세한 내용을 user3484348.

    TLS 1.2 (하지 작업)

    System.Net Information: 0 : [11752] InitializeSecurityContext(
    credential = System.Net.SafeFreeCredential_SECURITY, 
    context = 1054ea8:6091710, 
    targetName = api.company.com, 
    inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
    
    System.Net Information: 0 : [11752] InitializeSecurityContext(
    In-Buffers count=2, 
    Out-Buffer length=0, 
    returned code=IllegalMessage) 
    

    TLS 1.0 (작업) TLS 1.2

    System.Net Information: 0 : [11752] InitializeSecurityContext(
    credential = System.Net.SafeFreeCredential_SECURITY, 
    context = 12a5eb0:641d900, 
    targetName = api.company.com, 
    inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation) 
    
    System.Net Information: 0 : [11752] InitializeSecurityContext(
    In-Buffers count=2, 
    Out-Buffer length=0, 
    returned code=ContinueNeeded) 
    

    returned codeIllegalMessage이며 TLS 1.0 그것은 ContinueNeeded예요.

  • +0

    암호화 제품군'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256' 선택한 서버를 저장소에 인증서를 추가 할 키 파일에 대한 액세스 권한을 부여 ...이 목록에있는 경우 확인하신 후 클라이언트가 지원합니까? –

    +0

    가능한 경우 서버에 접속하여 보안 로그를 조사하여 자세한 정보를 얻을 수 있는지 확인하십시오. –

    +0

    아마도 도움이 될 것입니다. 동일한 문제가 발생합니다 https://stackoverflow.com/questions/6232746/c-sharp-httpwebrequest-sec-i-renegotiate-intermittent-errors –

    답변

    1

    아마도 GetCertificate()는 Windows 인증서 저장소가 아닌 인증서를 반환합니다. 당신이 당신의 .config 파일에

    <system.diagnostics> 
    <sources> 
        <source name="System.Net"> 
        <listeners> 
         <add name="System.Net"/> 
        </listeners> 
        </source> 
        <source name="System.Net.Cache"> 
        <listeners> 
         <add name="System.Net"/> 
        </listeners> 
        </source> 
        <source name="System.Net.Http"> 
        <listeners> 
         <add name="System.Net"/> 
        </listeners> 
        </source> 
        <source name="System.Net.Sockets"> 
        <listeners> 
         <add name="System.Net"/> 
        </listeners> 
        </source> 
        <source name="System.Net.WebSockets"> 
        <listeners> 
         <add name="System.Net"/> 
        </listeners> 
        </source> 
    </sources> 
    <switches> 
        <add name="System.Net" value="Verbose"/> 
        <add name="System.Net.Cache" value="Verbose"/> 
        <add name="System.Net.Http" value="Verbose"/> 
        <add name="System.Net.Sockets" value="Verbose"/> 
        <add name="System.Net.WebSockets" value="Verbose"/> 
    </switches> 
    <sharedListeners> 
        <add name="System.Net" 
        type="System.Diagnostics.TextWriterTraceListener" 
        initializeData="network.log" 
        /> 
    </sharedListeners> 
    <trace autoflush="true"/> 
    

    을 추가하여 응용 프로그램의 System.Net 디버그 정보를 설정하면 "오류 0X8009030D 실패했습니다) AcquireCredentialsHandle을 (."볼 또는 비슷한 것. 키가 MachineKeys 시스템 폴더에 없으면 System.Net에서 개인 키가있는 인증서를 사용할 수없는 것 같습니다.

    전통적인 경로를 이동 - 등

    +0

    인증서를 컴퓨터 키 저장소에 추가하고 사용자에게 권한을 설정했습니다. , 그러나 어떤 변화도없이. 하지만 내 경우에는'AcquireCredentialsHandle'은 내 로그에 오류를 발생시키지 않습니다. 나는 그 질문을 갱신했다. –

    +0

    인증서에 예를 들어 개인 키가 있습니다. "C : \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys"이고 응용 프로그램은 해당 개인 키가있는 파일에 액세스 할 수 없습니다 (관리자로 실행 또는 응용 프로그램 풀 ID에 대한 액세스 권한 부여)? – user3484348