• IceRPC之服务器地址与TLS的安全性->快乐的RPC


    作者引言 .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
  • 相关阅读:
    Vue生产环境调试的方法
    设计模式-工厂设计模式
    Linux-编译器
    【Python机器学习】零基础掌握RandomForestClassifier集成学习
    代码实现:求前N个数字的阶乘
    机器学习——实践
    Tomcat突然停止运行/Server Tomcat v8.5 Server at localhost fail
    代码比较模板
    #include <hardware/bluetooth.h>
    Java21 + SpringBoot3整合springdoc-openapi,自动生成在线接口文档,支持SpringSecurity和JWT认证方式
  • 原文地址:https://www.cnblogs.com/xlgwr/p/18187552