1

さまざまな SSL サービスを管理する必要があるサーバー アプリケーションを開発しています。各サービスには独自の証明書があります (もちろん、CN は異なります)。SNIを使用して正しい証明書を提供したいのですが、ストリームを認証する前に ClientHello (SNI 拡張機能がある場所) を読み取るのに苦労しています。

それがコードです:

byte[] ClientHello = new byte[3000];
Stream TargetStream = TargetTcpClient.GetStream();

//Whatever I write here let me be unable to successfully authenticate 
//If I don't read anything (like in this way), it works perfectly  
int ClientHelloN = 0; //TargetStream.ReadByte();// TargetStream.Read(ClientHello, 0, 3000);

/*SNI Logic to extract Server-name*/
Certificate = new X509Certificate2(/*PATH TO CORRECT CERTIFICATE*/);

SslStream SSLStream = new SslStream(TargetStream);
SSLStream.AuthenticateAsServer(Certificate);

プレフィックス付きの証明書を使用して直接認証しても問題はありませんが、認証にストリームから 1 バイトでも読み取ろうとすると、AuthenticateAsServer メソッドで永遠にループします。

4

2 に答える 2

1

データを読み取ると、データがTargetStreamなくなりSslStream、ハンドシェイクの始まりが失われます。

あなたがする必要があるのはStream、あなたが得たものTargetTcpClient.GetStream()をあなた自身のStreamサブクラスでラップすることだと思います。サブクラスでは、ストリームからバイトを読み取って Client Hello を解析できますが、これらすべてのバイトをバッファーに保存する必要があります。サブクラスはStream.Read()をオーバーライドする必要があります-オーバーライドが呼び出されたときにバッファに何かがある場合はそれを返し、そうでない場合は呼び出しをラップされたストリームに転送します。アプローチは、サブクラス化して単一の文字のみをバッファリングすることを除いて、この回答に似ています。StreamReader

于 2013-07-02T19:02:46.213 に答える