secure 静态方法

Future<SecureSocket> secure(
  1. Socket socket,
  2. {dynamic host,
  3. SecurityContext? context,
  4. bool onBadCertificate(
    1. X509Certificate certificate
    )?,
  5. void keyLog(
    1. String line
    )?,
  6. @Since("2.6") List<String>? supportedProtocols}
)

在现有连接上启动 TLS。

接收已连接的 socket 并开始客户端 TLS 握手以使通信安全。当返回的 future 完成,则 SecureSocket 完成了 TLS 握手。使用此函数需要连接的另一端已准备好 TLS 握手。

如果 socket 已有订阅,则此订阅将不再接收事件。在大多数情况下,在开始 TLS 握手之前调用 StreamSubscription.pause 是正确的做法。

给定的 socket 被关闭并且不能再使用。

如果传递了 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,则结果的 InternetAddress 的主机值将是传递的 host,而其地址值将是已连接套接字的互联网地址。

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

实现

static Future<SecureSocket> secure(Socket socket,
    {host,
    SecurityContext? context,
    bool onBadCertificate(X509Certificate certificate)?,
    void keyLog(String line)?,
    @Since("2.6") List<String>? supportedProtocols}) {
  return socket._detachRaw().then<RawSecureSocket>((detachedRaw) {
    return RawSecureSocket.secure(detachedRaw[0] as RawSocket,
        subscription: detachedRaw[1] as StreamSubscription<RawSocketEvent>?,
        host: host,
        context: context,
        onBadCertificate: onBadCertificate,
        keyLog: keyLog,
        supportedProtocols: supportedProtocols);
  }).then<SecureSocket>((raw) => new SecureSocket._(raw));
}