簡體   English   中英

SslStream 和身份驗證

[英]SslStream and Authentication

我閱讀 MSDN 信息文章已經很長時間了,但仍然無法理解。

基於不需要客戶端身份驗證的假設:

1.當我調用SslStream.AuthenticateAsServer(...) ,我是在服務器端還是在客戶端調用這個方法?

2.當建立一個SslStream時,是只有服務端負責建立SslStream還是服務端和客戶端都負責?

3.如果僅僅服務器的責任,它意味着客戶端可以只使用普通send()receive()操作,而無需創建一個獨居SslStream?

4.客戶端是否需要獲取證書文件才能對服務器進行身份驗證?

非常感謝您,我真的找不到關於這個主題的太多信息,我已經搜索了很長時間...

編輯:MSDN 在本頁底部有一個完整的工作示例: https : //msdn.microsoft.com/en-us/library/system.net.security.sslstream?f=255&MSPPError=-2147217396 - 所以你應該真正開始在那里進行試驗,因為那個例子已經說明了一切。

原答案

我必須在這個答案之前說“不需要客戶端身份驗證”是大多數 SSL 實現的情況。 客戶端身份驗證很少見:您可能會在 VPN 應用程序、銀行業和其他安全應用程序中看到它。 因此,當您嘗試使用 SslStream() 在沒有客戶端身份驗證的情況下啟動時是明智的。

當您瀏覽 HTTPS 網站時,您不會使用客戶端證書對瀏覽器進行身份驗證,而只是想確認您要連接的服務器名稱與證書中找到的 CNAME 匹配,並且服務器證書由以下人員簽名您的機器信任的 CA - 它還有更多,但本質上這就是它歸結為。

那么,說了這么多,讓我回答你的問題:

1) SslStream.AuthenticateAsServer(...)僅在服務器端使用服務器 509 證書完成。 在客戶端,您必須調用SslStream.AuthenticateAsClient(serverName) ,服務器名稱是您證書的 CNAME(通用名稱)(例如:“domain.com”)

2) 必須為客戶端和服務器創建SslStream 您只需通過在其周圍“包裝”一個TcpClient NetworkStream來創建它(例如,但還有其他方法)

服務器示例:

// assuming an 509 certificate has been loaded before in an init method of some sort
X509Certificate serverCertificate = X509Certificate2.CreateFromCertFile("c:\\mycert.cer"); // for illustration only, don't do it like this in production
...

// assuming a TcpClient tcpClient was accepted somewhere above this code
slStream sslStream = new SslStream(tcpClient.GetStream(), false);
sslStream.AuthenticateAsServer(
                serverCertificate,
                false, 
                SslProtocols.Tls, 
                true);

3) 否。通信在兩端都進行了加密。 所以雙方都必須使用SslStream 在客戶端使用receive()send()會產生二進制加密數據。

4) 否。客戶端將回調方法傳遞給SslStream創建以驗證服務器收到的證書。

例子:

// assuming a TcpClient tcpClient was connected to the server somewhere above this code
SslStream sslStream = new SslStream(
            tcpClient.GetStream(),
            false,
            new RemoteCertificateValidationCallback(ValidateServerCertificate),
            null
            ); 
sslStream.AuthenticateAsClient(serverName); // serverName: "domain.com" for example

然后在您的代碼中的其他地方:

public static bool ValidateServerCertificate(
          object sender,
          X509Certificate certificate,
          X509Chain chain,
          SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None) {
            return true;
        }

        Console.WriteLine("Certificate error: {0}", sslPolicyErrors);

        // refuse connection
        return false;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM