ZetCode

Dart SecureServerSocket

最后修改于 2025 年 4 月 4 日

Dart 中的 SecureServerSocket 类使用 SSL/TLS 协议提供安全网络通信。它对于客户端-服务器应用程序中的加密数据传输至关重要。

SecureServerSocket 创建加密套接字服务器,这些服务器对客户端进行身份验证并保护数据完整性。它是 Dart 的 dart:io 库的一部分。

基本定义

SecureServerSocket 是一个服务器套接字,通过 SSL/TLS 提供安全通信。它需要安全上下文配置。

主要功能包括加密、证书管理和安全连接处理。它通过安全功能扩展了 ServerSocket。

基本的 SecureServerSocket 用法

此示例展示了基本的安全套接字服务器创建。

main.dart
import 'dart:io';

void main() async {
  var context = SecurityContext()
    ..useCertificateChain('cert.pem')
    ..usePrivateKey('key.pem');
  
  var server = await SecureServerSocket.bind(
    'localhost', 4040, context);
  
  print('Secure server listening on port 4040');
  
  await for (var socket in server) {
    socket.write('Secure hello!');
    await socket.close();
  }
}

我们使用证书文件创建一个安全上下文,然后绑定一个安全服务器。服务器接受连接,并向每个客户端发送安全消息。

$ dart main.dart
Secure server listening on port 4040

处理客户端连接

此示例演示了安全客户端连接处理。

main.dart
import 'dart:io';
import 'dart:convert';

void main() async {
  var context = SecurityContext()
    ..useCertificateChain('cert.pem')
    ..usePrivateKey('key.pem');
  
  var server = await SecureServerSocket.bind(
    'localhost', 4040, context);
  
  await for (var socket in server) {
    socket.transform(utf8.decoder).listen((data) {
      print('Received: $data');
      socket.write('Secure echo: $data');
    });
  }
}

服务器以安全的方式将接收到的数据回显。我们使用转换器进行流处理。每个连接都会自动加密。

$ dart main.dart
Received: Test message

客户端身份验证

此示例展示了服务器端客户端证书验证。

main.dart
import 'dart:io';

void main() async {
  var context = SecurityContext()
    ..useCertificateChain('cert.pem')
    ..usePrivateKey('key.pem')
    ..setClientAuthorities('ca.pem');
  
  var server = await SecureServerSocket.bind(
    'localhost', 4040, context,
    requestClientCertificate: true);
  
  await for (var socket in server) {
    var cert = socket.peerCertificate;
    if (cert == null) {
      print('Client failed authentication');
      await socket.close();
      continue;
    }
    print('Client authenticated: ${cert.subject}');
    socket.write('Welcome authenticated client!');
  }
}

服务器需要客户端证书进行身份验证。我们在处理连接之前检查对等证书。这提供了双向身份验证。

$ dart main.dart
Client authenticated: CN=Client1

自定义安全参数

此示例演示了自定义 SSL/TLS 协议配置。

main.dart
import 'dart:io';

void main() async {
  var context = SecurityContext()
    ..useCertificateChain('cert.pem')
    ..usePrivateKey('key.pem')
    ..setAlpnProtocols(['h2', 'http/1.1'], true);
  
  var server = await SecureServerSocket.bind(
    'localhost', 4040, context,
    supportedProtocols: ['TLSv1.3']);
  
  print('Server using TLS 1.3 with ALPN support');
  
  await for (var socket in server) {
    print('Negotiated protocol: ${socket.selectedProtocol}');
    socket.write('Secure connection established');
  }
}

我们配置 ALPN 协议并限制为 TLS 1.3。服务器报告每个连接协商的协议。这支持现代安全功能。

$ dart main.dart
Server using TLS 1.3 with ALPN support
Negotiated protocol: h2

安全 Web 服务器

此示例创建了一个基本的安全 HTTP 服务器。

main.dart
import 'dart:io';

void main() async {
  var context = SecurityContext()
    ..useCertificateChain('cert.pem')
    ..usePrivateKey('key.pem');
  
  var server = await SecureServerSocket.bind(
    'localhost', 4433, context);
  
  await for (var socket in server) {
    socket.write('HTTP/1.1 200 OK\r\n'
      'Content-Type: text/plain\r\n'
      '\r\n'
      'Secure Hello from Dart!');
    await socket.close();
  }
}

服务器使用简单的消息响应 HTTPS 请求。请注意正确的 HTTP 标头和响应格式。这展示了安全 Web 通信。

$ dart main.dart
(Server running, accessible via https://:4433)

最佳实践

来源

Dart SecureServerSocket 文档

本教程介绍了 Dart 的 SecureServerSocket 类,并提供了实际示例,展示了安全通信、身份验证和现代协议配置。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程