статический метод 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 и может проверить его, а затем решить (или предоставить пользователю возможность решить), принимать ли соединение. Для продолжения SecureSocket соединения обработчик должен вернуть true.
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, для результирующего 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._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));
}
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.19.6/dart-io/SecureSocket/secure.html