.NET SslStreamを使用して 'C'ベースのSSL実装からC#に移行しようとしていますが、.NET SslStreamと私たちが接続しようとしているAS400マシン(以前は動作していました)。.NET SslStreamハンドシェイクで完全な暗号リストをデコードできません
我々はそれが次のように送信されるSslStream.AuthenticateAsClientを呼び出す:
16 03 00 00 37 01 00 00 33 03 00 4D 2C 00 EE 99 4E 0C 5D 83 14 77 78 5C 0F D3 8F 8B D5 E6 B8 CD 61 0F 29 08 AB 75 03 F7 FA(http://www.mozilla.org/projects/security/pki/nss/ssl/draft302.txtに基づく)としてデコード7D 70 00 00 0C 00 05 00 0A 00 13 00 04 00 02 00 FF 01 00
[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
as400サーバーが返信します。
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
私は具体的には、サイファーの最後に「FF」をデコードしようとしています。 正しくデコードしましたか?何があれば、'00 FF 'もデコードされますか?
私は再現/テストするには、次のコードを使用しています:
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);
}
}
}
これを知ったので、私はサーバーが実際に受け入れることを考え出すことに移ります。 – karmasponge