2011-01-12 5 views
1

Bei dem Versuch, von einer C-basierten SSL-Implementierung mit .NET SslStream in C# zu wechseln, haben wir Probleme mit der Verschlüsselung von .NET SslStream und a AS400 Maschine versuchen wir uns zu verbinden (was vorher funktioniert hat).Vollständige Codeliste kann nicht dekodiert werden. .NET SslStream-Handshake

Wenn wir nennen es SslStream.AuthenticateAsClient sendet die folgenden:

16 03 00 00 37 01 00 00 33 03 00 00 2c 4d 4e ee 99 0C 5d 83 14 77 78 5c 0F d3 8f 8b d5 e6 b8 cd 61 0F 29 08 AB 75 03 f7 fa 7d 70 00 00 0 C 00 05 00 0A 00 13 00 04 00 02 00 FF 01 00

die als (basierend auf http://www.mozilla.org/projects/security/pki/nss/ssl/draft302.txt) dekodiert

[16] Record Type 
[03 00] SSL Version 
[00 37] Body length 

[01] SSL3_MT_CLIENT_HELLO 
[00 00 33] Length (51 bytes) 

[03 00] Version number = 768 
[4d 2c 00 ee] 4 Bytes unix time 
[… ] 28 Bytes random number 
[00] Session number 
[00 0c] 12 bytes (2 * 6 Cyphers)? 
[00 05, 00 0a, 00 13, 00 04, 00 02, 00 ff] -> [RC4, PBE-MD5-DES, RSA, MD5, PKCS, ???] 
[01 00] Null compression method 

The as400 Server antwortet mit:

15 03 00 00 02 02 28 

[15] SSL3_RT_ALERT 
[03 00] SSL Version 
[00 02] Body Length (2 Bytes) 

[02 28] 2 = SSL3_RT_FATAL, 40 = SSL3_AD_HANDSHAKE_FAILURE 

Ich bin speziell auf die Decodierung der '00 FF 'am Ende der Ziffern. Habe ich es richtig dekodiert? Was entschlüsselt, wenn überhaupt, '00 FF '?

ich den folgenden Code verwenden zu testen/reproduzieren:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 
using System.Net.Security; 
using System.Security.Authentication; 
using System.IO; 
using System.Diagnostics; 
using System.Security.Cryptography.X509Certificates; 

namespace TestSslStreamApp 
{ 
    class DebugStream : 
     Stream 
    { 
     private Stream AggregatedStream { get; set; } 

     public DebugStream(Stream stream) { AggregatedStream = stream; } 

     public override bool CanRead { get { return AggregatedStream.CanRead; } } 
     public override bool CanSeek { get { return AggregatedStream.CanSeek; } } 
     public override bool CanWrite { get { return AggregatedStream.CanWrite; } } 
     public override void Flush() { AggregatedStream.Flush(); } 
     public override long Length { get { return AggregatedStream.Length; } } 

     public override long Position 
     { 
      get { return AggregatedStream.Position; } 
      set { AggregatedStream.Position = value; } 
     } 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      int bytesRead = AggregatedStream.Read(buffer, offset, count); 

      return bytesRead; 
     } 

     public override long Seek(long offset, SeekOrigin origin) { return AggregatedStream.Seek(offset, origin); } 
     public override void SetLength(long value) { AggregatedStream.SetLength(value); } 

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      AggregatedStream.Write(buffer, offset, count); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      const string HostName = "as400"; 

      TcpClient tcpClient = new TcpClient(HostName, 992); 

      SslStream sslStream = new SslStream(new DebugStream(tcpClient.GetStream()), false, null, null, 
                EncryptionPolicy.AllowNoEncryption); 

      sslStream.AuthenticateAsClient(HostName, null, SslProtocols.Ssl3, false); 
     } 
    } 
} 

Antwort

3

Quelle: RFC 5746 TLS Renegotiation Extension

3.3. Renegotiation Protection Request Signaling Cipher Suite Value 

    Both the SSLv3 and TLS 1.0/TLS 1.1 specifications require 
    implementations to ignore data following the ClientHello (i.e., 
    extensions) if they do not understand it. However, some SSLv3 and 
    TLS 1.0 implementations incorrectly fail the handshake in such a 
    case. This means that clients that offer the "renegotiation_info" 
    extension may encounter handshake failures. In order to enhance 
    compatibility with such servers, this document defines a second 
    signaling mechanism via a special Signaling Cipher Suite Value (SCSV) 
    "TLS_EMPTY_RENEGOTIATION_INFO_SCSV", with code point {0x00, 0xFF}. 
    This SCSV is not a true cipher suite (it does not correspond to any 
    valid set of algorithms) and cannot be negotiated. Instead, it has 
    the same semantics as an empty "renegotiation_info" extension, as 
    described in the following sections. Because SSLv3 and TLS 
    implementations reliably ignore unknown cipher suites, the SCSV may 
    be safely sent to any server. The SCSV can also be included in the 
    SSLv2 backward compatible CLIENT-HELLO (see Appendix E.2 of 
    [RFC5246]).
+0

Jetzt, da ich das weiß, kann ich mich darauf konzentrieren herauszufinden, was der Server tatsächlich akzeptieren wird. – karmasponge

0

Der einfachste Weg, um zu überprüfen wäre, was ist Ihre C-Implementierung sendet und finde deine SSL Version und CipherSuites, die es anfordert, und schließlich sehen, mit welchem ​​Server antwortet - SSL-Version und gewählte CipherSuite.

+0

Ja, das ist mein nächster Schritt. – karmasponge

Verwandte Themen