Метод secure
- Socket socket,
- {dynamic host,
- SecurityContext? context,
-
bool onBadCertificate(
- X509Certificate certificate
- void keyLog(
- String line
- @Since("2.6") List<
String>? supportedProtocols}
Инициализирует TLS для существующего подключения.
Принимает уже подключенное socket и запускает TLS-рукопожатие со стороны клиента, чтобы обеспечить безопасность связи. Когда возвращаемое будущее завершается, SecureSocket завершает TLS-рукопожатие. Для использования этой функции необходимо, чтобы другой конец подключения был готов к TLS-рукопожатию.
Если у socket уже есть подписка, эта подписка больше не будет получать события. В большинстве случаев правильным действием является вызов StreamSubscription.pause для этой подписки перед запуском TLS-рукопожатия.
Переданный 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 для полученного SecureSocket будет иметь переданный 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 as dynamic /*_Socket*/)._detachRaw() as Future)
.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));
}
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.18.5/dart-io/SecureSocket/secure.html