写入 NetworkStream 以使用 Varnish 进行身份验证失败

Writing to NetworkStream to authenticate with Varnish fails

我正在尝试从需要身份验证的简单 Telnet 服务器 (Varnish) 读取和写入。这是通过挑战短语完成的,我必须提供正确的答案。

我有一个简单的 C# 测试,它执行类似这样的操作来获取挑战短语(服务器发送一堆行,其中一个包含挑战):

System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
clientSocket.Connect("1.2.3.4", 81);

byte[] inStream = new byte[65536];
NetworkStream serverStream = clientSocket.GetStream();
serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
var lines = returndata.Split('\n');
var challenge = lines[1];

我现在在 challenge 中接受挑战。

要生成正确的响应,我必须构建一些文本和 SHA256:

var secret = "secretpassword";
var response = string.Format("{0}\n{1}\n{0}\n", challenge, secret);
char[] chars = response.ToCharArray();

var bytes = Encoding.ASCII.GetBytes(response)
var sha = SHA256Managed.Create();
var crypto = sha.ComputeHash(bytes);
var hash = string.Empty;
foreach (byte bit in crypto)
{
    hash += bit.ToString("x2");
}

这一切的结尾是一个 SHA256 字符串。

服务器希望我发送短语 "auth " 后跟字符串,所以我发送:

var auth = string.Format("auth {0}\n", hash);

byte[] outStream = System.Text.Encoding.ASCII.GetBytes(auth);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
returndata = System.Text.Encoding.ASCII.GetString(inStream);

如果我通过自己尝试通过 Telnet 连接然后将挑战短语注入我的代码来调试它,我可以将 auth 值复制并粘贴到我的 telnet 客户端并且它工作正常。它在我的代码中不起作用,所以我怀疑最后的 "write to server" 部分有问题。

这是使用 Putty 进行复制粘贴的示例。您可以在第 2 行看到挑战,在第 5 行我发送响应。

CLI Authentication: The Gory Details

好吧,这对我来说是一个荒谬的错误 - 与 Varnish、套接字或任何真正有价值的东西无关。

我完全忘了实际读取身份验证令牌的响应,所以我只是检查原始 'failed' 结果的值...

最后一节应该是:

var auth = string.Format("auth {0}\n", hash);

byte[] outStream = System.Text.Encoding.ASCII.GetBytes(auth);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); // Don't forget to read the response!!
returndata = System.Text.Encoding.ASCII.GetString(inStream);