![](/img/trans.png)
[英]Asking SslStream to accept ONLY a certificate signed by a particular public key
[英]SslStream accept certificate?
我在C#中創建了一個簡單的ftp客戶端,它可以滿足我的需求(連接到ftp,可選擇使用代理),但我也希望能夠使用AUTH SSL。
因此,我沒有使用NetworkStream,而是查看了SslStream,並希望它是一個相當容易的替代品。
但是當我與我的(glftpd,自簽名openssl證書)ftp握手時,我似乎遇到了很多問題。 這是一個代碼snippit:
TcpClient client = new TcpClient("192.168.0.2", 1337);
SslStream sslStream = new SslStream(
client.GetStream(),
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
null
);
try
{
sslStream.AuthenticateAsClient("192.168.0.2"); // or "glftpd", neither worked.
}
catch (AuthenticationException e)
{
Console.WriteLine("Exception: {0}", e.Message);
if (e.InnerException != null)
{
Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
}
Console.WriteLine("Authentication failed - closing the connection.");
client.Close();
return;
}
我使用IOException打破AuthenticateAsClient:“由於意外的數據包格式,握手失敗了。” 我不打破ValidateServerCertificate(從未到達)。
我發現很難調試此錯誤,因為我可以將TcpClient端口設置為1208219421並仍然收到相同的錯誤(所以我甚至不知道它是否無法與ssl端口通信)。
上面的代碼(在我看過的3-4個不同的C#ssl指南中)是從鏈接文本修改的
我已經嘗試了兩個sslStream.AuthenticateAsClient(...,...,SslProtocols.Tls,false)和sslStream.AuthenticateAsClient(...,...,SslProtocols.Ssl3,false)Ssl2和Default,我知道事實上TLS與我的glftpd安裝一起使用。
如果我不得不猜測我認為它與machinename / certname有關,但我已經嘗試了certname(這是“glftpd”),所以現在我對於握手失敗的原因一無所知。
還應注意證書是自簽名的。
任何幫助是極大的贊賞!
你檢查了端口號嗎? 那是問題嗎?
編輯1
http://en.wikipedia.org/wki/FTPS
也許您的服務器不處於“隱式”模式? 應該是嗎?
您可能也希望在您的產品中支持顯式模式支持。
編輯2
(道歉,我無法評論,沒有足夠的代表,所以我正在編輯。:-))
如果不需要對實時代碼中的顯式和隱式支持,我通常希望在可能的情況下同時在兩個端口上運行TCP服務器,一個用於隱式SSL,另一個用於顯式/非SSL。 您的服務器軟件可能支持也可能不支持。
編輯3
取決於您是否控制服務器/您希望符合標准的程度!
隱式模式將被視為略微不那么標准,但OTOH的工作較少。
編輯4
使用Explicit而非Implicit可能更好地防止拒絕服務問題,但我不確定,我必須研究協議。 我的經驗是XMPP。
編輯5
此外,明文模式的純文本啟動可能會使一些公司法律部門對任何未經授權的訪問的法律問題稍微放松一些,而不是開始直接在線上進行TLS亂碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.