secure 静态方法

Future<RawSecureSocket> secure(
  1. RawSocket socket,
  2. {StreamSubscription<RawSocketEvent>? subscription,
  3. dynamic host,
  4. SecurityContext? context,
  5. bool onBadCertificate(
    1. X509Certificate certificate
    )?,
  6. void keyLog(
    1. String line
    )?,
  7. List<String>? supportedProtocols}
)

在现有连接上启动 TLS。

接受已连接的 socket 并启动客户端 TLS 握手以使通信安全。当返回的 future 完成时,RawSecureSocket 已完成 TLS 握手。使用此函数要求连接的另一端已准备进行 TLS 握手。

如果 socket 已经有了订阅,请将现有的订阅传递到 subscription 参数中。secure 操作将通过用自身的安全处理程序替换处理程序来接管订阅。调用者不得再接触此订阅。传递暂停的订阅是错误的。

如果传递了 host 参数,它将用作 TLS 握手的域名。如果没有传递 host,将使用 socket 中的域名。该 host 可以是一个 String 或一个 InternetAddress

onBadCertificate 是一个用于不可验证证书的可选处理程序。处理程序接收 X509Certificate,可以检查它并决定(或让用户决定)是否接受连接。处理程序应返回 true 以继续 SecureSocket 连接。

keyLog 是一个可选的回调,当与服务器交换新的 TLS 密钥时将被调用。 keyLog 将在每次调用时从 NSS Key Log Format 接收一行文本。将这些行写入文件将允许工具(如 Wireshark)解密通过此套接字发送的内容。这是为了让网络安全套接字进行网络级调试,不应在生产代码中使用。例如

final log = File('keylog.txt');
final socket = await SecureSocket.connect('www.example.com', 443,
    keyLog: (line) => log.writeAsStringSync(line, mode: FileMode.append));

supportedProtocols 是一个可选的协议列表(按首选顺序递减),在服务器 ALPN 协议协商期间使用。示例值是 "http/1.1" 或 "h2"。可以通过 SecureSocket.selectedProtocol 获取选择的协议。

调用此函数将 不会 导致 DNS 域名查找。如果传递的 host 是一个 String,则结果 SecureSocketInternetAddress 将使用传递的 host 作为其主机值,并将已连接套接字的网络地址作为其地址值。

有关参数的更多信息,请参阅 connect

实现

static Future<RawSecureSocket> secure(RawSocket socket,
    {StreamSubscription<RawSocketEvent>? subscription,
    host,
    SecurityContext? context,
    bool onBadCertificate(X509Certificate certificate)?,
    void keyLog(String line)?,
    List<String>? supportedProtocols}) {
  socket.readEventsEnabled = false;
  socket.writeEventsEnabled = false;
  return _RawSecureSocket.connect(
      host != null ? host : socket.address.host, socket.port, false, socket,
      subscription: subscription,
      context: context,
      onBadCertificate: onBadCertificate,
      keyLog: keyLog,
      supportedProtocols: supportedProtocols);
}