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);
}
}
}
Jetzt, da ich das weiß, kann ich mich darauf konzentrieren herauszufinden, was der Server tatsächlich akzeptieren wird. – karmasponge