secure 静态方法
- RawSocket socket, {
- StreamSubscription<
RawSocketEvent> ? subscription, - dynamic host,
- SecurityContext? context,
- bool onBadCertificate(
- X509Certificate certificate
- void keyLog(
- String line
- List<
String> ? supportedProtocols,
在现有连接上启动 TLS。
接受一个已经连接的 socket
并启动客户端 TLS 握手以使通信安全。当返回的 future 完成时,RawSecureSocket 已经完成了 TLS 握手。使用此函数要求连接的另一端已准备好 TLS 握手。
如果 socket
已经有一个订阅,请通过 subscription
参数传递现有的订阅。安全操作将通过用其自己的安全处理程序替换处理程序来接管订阅。调用者不得再触摸此订阅。传递已暂停的订阅是错误的。
如果传递了 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 对于 SecureSocket 的主机值将是传递给 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);
}