ZetCode

Dart SecurityContext

最后修改于 2025 年 4 月 4 日

Dart 中的 SecurityContext 类负责管理安全套接字连接的安全证书和私钥。它对于 HTTPS、TLS 和其他安全网络协议至关重要。

SecurityContext 提供证书链验证、私钥管理和信任设置。它是 Dart 的 dart:io 库的一部分,用于服务器端和安全客户端应用程序。

基本定义

SecurityContext 是用于安全通信的安全凭证的容器。它包含证书、私钥和信任设置。

主要功能包括证书链管理、客户端身份验证和自定义信任设置。它与 HttpClient 和 SecureSocket 一起使用。

创建基本的 SecurityContext

此示例演示了如何创建基本的 SecurityContext 实例。

main.dart
import 'dart:io';

void main() {
  // Create a new security context
  var securityContext = SecurityContext();
  
  // Set default trust store
  securityContext.setTrustedCertificates(
    'assets/certificates/ca.pem'
  );
  
  print('SecurityContext created with default trust store');
}

我们创建一个 SecurityContext,并从 PEM 文件加载受信任的根证书。此上下文现在可用于与这些 CA 进行验证的安全连接。

$ dart main.dart
SecurityContext created with default trust store

使用客户端证书

此示例演示了客户端证书身份验证的配置。

main.dart
import 'dart:io';

void main() async {
  var securityContext = SecurityContext();
  
  // Load client certificate and private key
  securityContext.useCertificateChain(
    'assets/certificates/client.pem'
  );
  securityContext.usePrivateKey(
    'assets/certificates/client_key.pem',
    password: 'securepassword'
  );
  
  // Create secure socket
  var socket = await SecureSocket.connect(
    'example.com',
    443,
    context: securityContext
  );
  
  print('Connected with client certificate');
  socket.destroy();
}

我们使用客户端凭据配置 SecurityContext 以进行双向 TLS。私钥受密码保护。此上下文可将客户端验证到需要证书的服务器。

$ dart main.dart
Connected with client certificate

自定义信任库

此示例演示了如何创建自定义信任库配置。

main.dart
import 'dart:io';

void main() {
  var securityContext = SecurityContext();
  
  // Add multiple trusted certificates
  securityContext.setTrustedCertificates(
    'assets/certificates/ca1.pem'
  );
  securityContext.setTrustedCertificates(
    'assets/certificates/ca2.pem'
  );
  
  // Explicitly distrust a certificate
  securityContext.setClientAuthorities(
    'assets/certificates/distrusted.pem'
  );
  
  print('Custom trust store configured');
}

我们通过添加多个 CA 证书并明确不信任特定证书来构建自定义信任库。这提供了对信任的细粒度控制。

$ dart main.dart
Custom trust store configured

内存证书

此示例演示了直接从内存加载证书。

main.dart
import 'dart:io';

void main() {
  var securityContext = SecurityContext();
  
  // Certificate data as strings
  const certPem = '''
-----BEGIN CERTIFICATE-----
MII...certificate data...Q==
-----END CERTIFICATE-----''';
  
  const keyPem = '''
-----BEGIN PRIVATE KEY-----
MII...private key data...Q==
-----END PRIVATE KEY-----''';
  
  // Load from memory
  securityContext.useCertificateChainBytes(
    certPem.codeUnits
  );
  securityContext.usePrivateKeyBytes(
    keyPem.codeUnits
  );
  
  print('Certificates loaded from memory');
}

我们使用内存中的字符串而不是文件创建了一个 SecurityContext,这些字符串提供了证书。这对于嵌入式证书或动态加载很有用。

$ dart main.dart
Certificates loaded from memory

安全 HttpClient 配置

此示例显示了将 SecurityContext 与 HttpClient 一起用于安全请求。

main.dart
import 'dart:io';

void main() async {
  var securityContext = SecurityContext()
    ..setTrustedCertificates('assets/certificates/ca.pem');
  
  var client = HttpClient(context: securityContext)
    ..badCertificateCallback = (cert, host, port) {
      print('Bad certificate from $host:$port');
      return false; // Reject invalid certificates
    };
  
  try {
    var request = await client.getUrl(
      Uri.https('example.com', '/secure')
    );
    var response = await request.close();
    print('Secure request completed: ${response.statusCode}');
  } catch (e) {
    print('Request failed: $e');
  } finally {
    client.close();
  }
}

我们使用 SecurityContext 配置了一个 HttpClient,该上下文会根据我们的信任库验证服务器证书。badCertificateCallback 会根据我们的安全策略处理无效证书。

$ dart main.dart
Secure request completed: 200

最佳实践

来源

Dart SecurityContext 文档

本教程涵盖了 Dart 的 SecurityContext 类,并提供了实际示例,展示了证书管理、安全连接和 HttpClient 集成。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程