作者引言 .Net 8.0 下的新RPC
很高興啊,我們來到了IceRPC之服務器地址與TLS的安全性->快樂的RPC, 基礎引導,讓自已不在迷茫,快樂的暢遊世界。
服務器地址 ServerAddress
瞭解服務器地址的概念和語法。
語法
服務器地址URI具有以下語法: protocol://host[:port][?name=value][&name=value...]
protocol
協議 (URI方案),目前支持ice
或icerpc
host
DNS 名稱 或 IP 地址port
端口號; 未指定時,默認端口爲 4061ice
和 4062icerpc
服務器地址 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 - 傳輸功能
Ice
和 icerpc
協議既安全也並非不安全,因爲使用 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
傳輸意味着普通tcp
或tcp
+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));
作者結語
- 一直做,不停做,才能提升速度
- 翻譯的不好,請手下留情,謝謝
- 如果對我有點小興趣,如可加我哦,一起探討人生,探討道的世界。
- 覺得還不錯的話,點個贊哦