IceRPC之伺服器地址與TLS的安全性->快樂的RPC

xlgwr發表於2024-05-12

作者引言 .Net 8.0 下的新RPC

很高興啊,我們來到了IceRPC之伺服器地址與TLS的安全性->快樂的RPC, 基礎引導,讓自已不在迷茫,快樂的暢遊世界。

伺服器地址 ServerAddress

瞭解伺服器地址的概念和語法。

語法

伺服器地址URI具有以下語法: protocol://host[:port][?name=value][&name=value...]

  • protocol 協議 (URI方案),目前支援 iceicerpc
  • host DNS 名稱 或 IP 地址
  • port 埠號; 未指定時,預設埠為 4061 ice 和 4062 icerpc

伺服器地址 URI 必須具有空路徑且沒有片段。它可以有查詢引數,這些引數通常是特定於傳輸的。

查詢引數傳輸 transport 指定底層傳輸的名稱。大多數應用程式使用單個傳輸,並將此傳輸配置作為它們可以使用的唯一傳輸。 因此,在伺服器地址中省略傳輸transport是很常見的。

C# 中,結構體 ServerAddress 是伺服器地址 URI 的解析和驗證,用於儲存URI資訊等。

客戶端連線配置

客戶端連線的主要配置是伺服器的地址。 它告訴客戶端連線如何到達伺服器。DNS 名稱在這些伺服器地址中是很常見的。

例如:

伺服器地址 說明
icerpc://hello.zeroc.com 使用 icerpc 協議連線到埠 4062 上的 hello.zeroc.com , 未指定底層傳輸。
icerpc://192.168.100.10:10000?transport=quic 使用 QUIC 上的 icerpc 協議,連線埠 10000 上的 192.168.100.10 Ip地址
ice://hello.zeroc.com 使用 ice 協議連線埠 4061 上的 hello.zeroc.com 地址

伺服器配置

指定構建伺服器時,要監聽的伺服器地址。

如果不指定伺服器地址,預設值為 icerpc://[::0],這意味著,監聽預設 icerpc 埠 (4062) 上所有介面上的 icerpc 連線。

構建伺服器時,伺服器地址的主機必須是[::0]這樣的萬用字元ip地址,或者是當前系統上特定介面的ip地址。

如果埠號指定 0,作業系統將自動分配其短暫範圍內的埠號。因為伺服器不會監聽 tcp 或 udp 埠 0。

以下是一些示例:

伺服器地址 說明
icerpc://192.168.100.10 使用預設 icerpc 埠 4062,監聽與 192.168.100.10 關聯的介面上的 icerpc 連線。
icerpc://[::0]:0 監聽所有介面上的 icerpc 連線;作業系統自動選擇要使用的埠號。
ice://0.0.0.0:10000 10000 埠上 IPv4 地址的所有介面上監聽 ice 連線。

C# 中, 當在伺服器地址中指定埠 0 時, Listen 會返回一個伺服器地址, 其中包含 OS 選擇的埠號;

using IceRpc;

await using var server = new Server(...,new Uri("icerpc://[::1]:0"));
ServerAddress actualServerAddress = server.Listen();
Console.WriteLine($"server is now listening on {actualServerAddress}"); // shows actual port
// then somehow share this server address with the clients

TLS 的安全性

瞭解如何使用TLS保護連線

TLS - 傳輸功能

Iceicerpc 協議既安全也並非不安全,因為使用 TLS 保護通訊,是底層傳輸的責任。

icerpc 協議沒有類似https"s"變化,也沒有用於安全 icerpc 連線的獨特安全埠。 當看到伺服器地址 icerpc://hello.zeroc.com 時, 可以看到伺服器正在監聽預設的 icerpc 埠,但無法判斷連線到該伺服器的連線,將使用哪種傳輸,以及該傳輸是否使用了 TLS

Quic

Quic 傳輸協議,始終是安全的。 如果將客戶端連線配置為使用 Quic,則該連線將使用 TLS

例如:

// Always uses TLS.
await using var connection = new ClientConnection(
    "icerpc://hello.zeroc.com",
    multiplexedClientTransport: new QuicClientTransport());

同樣的邏輯也適用於伺服器:如果將伺服器配置為使用 Quic,則該伺服器接受的任何連線都將使用 TLS

在 C# 中,需要為任何使用 Quic 的伺服器指定 TLS 配置,特別是 X.509 證書。

例如:

// SslServerAuthenticationOptions is required with QuicServerTransport.
await using var server = new Server(
    new Chatbot(),
    new SslServerAuthenticationOptions
    {
        ServerCertificate = new X509Certificate2("server.p12")
    },
    multiplexedServerTransport: new QuicServerTransport());

Tcp

Tcp 傳輸可以使用,也可以不使用 TLS。如果在為 Tcp 建立客戶端連線時指定 TLS 配置,則該連線將使用 TLS。如果不指定 TLS 配置,連線將不會使用 TLS

在 C# 中,該客戶端 TLS 配置由 SslClientAuthenticationOptions 引數提供。例如:

// The default multiplexed transport for icerpc is tcp (implemented by SlicClientTransport over TcpClientTransport).
// This connection does not use TLS since we don't pass a SslClientAuthenticationOptions parameter.
await using var plainTcpConnection = new ClientConnection("icerpc://hello.zeroc.com");

// We pass a non-null SslClientAuthenticationOptions so the connection uses TLS.
await using var secureTcpConnection = new ClientConnection(
    "icerpc://hello.zeroc.com",
    new SslClientAuthenticationOptions());

對於Tcp的伺服器來說,是一樣的。如果在建立此伺服器時,指定 TLS 配置,則伺服器將僅接受 TLS 保護的連線。 如果在建立此伺服器時未指定 TLS 配置,則伺服器將僅監聽並接受簡單的 tcp 連線。

SSL (限於ice)

Ice 伺服器地址可以指定ssl傳輸,比如 ice://hello.zeroc.com?transport=ssl. 這種Ice特定的 ssl 傳輸與 tcp 傳輸相同,連線始終安全。在這方面,ssl 就像 quic

例如:

// Uses the default client transport, TcpClientTransport.
await using var connection = new ClientConnection("ice://hello.zeroc.com?transport=ssl");

相當於:

await using var connection = new ClientConnection(
    "ice://hello.zeroc.com?transport=tcp",
    new SslClientAuthenticationOptions());

ssl 傳輸僅用於向後相容 Ice:Ice 應用程式請求安全連線的標準方式是使用具有 ssl 伺服器地址的代理。

IceRPC + Slice 解碼具有 ssl 伺服器地址的服務地址時,ssl 傳輸捕獲此資訊("需要 TLS")並確保客戶端在呼叫此服務地址時建立安全連線。

對於 Ice,tcp 傳輸意味著"不使用 TLS". 對於 IceRPC,tcp 傳輸意味著普通 tcptcp + tls,具體取決於 TLS 配置。

Icerpc 協議,客戶端和伺服器都必須有相同的 TLS 期望配置,並且帶有 transport=tcp 的 icerpc 伺服器地址,並不是指伺服器都需要 TLS

coloc 傳輸

用於測試的 coloc 傳輸,不支援 TLS,如果使用 coloc 指定 TLS 配置,將收到錯誤。

// Does not work: can't get a TLS connection with a transport that doesn't support TLS.
await using var connection = new ClientConnection(
    "icerpc://colochost",
    new SslClientAuthenticationOptions()
    multiplexedClientTransport: new SlicClientTransport(colocClientTransport));

作者結語

  • 一直做,不停做,才能提升速度
  • 翻譯的不好,請手下留情,謝謝
  • 如果對我有點小興趣,如可加我哦,一起探討人生,探討道的世界
  • 覺得還不錯的話,點個
    image

相關文章