secure 静态方法
- Socket socket, {
- dynamic host,
- SecurityContext? context,
- bool onBadCertificate(
- X509Certificate certificate
- void keyLog(
- String line
- @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));
}