Dart SecurityContext
最后修改于 2025 年 4 月 4 日
Dart 中的 SecurityContext 类负责管理安全套接字连接的安全证书和私钥。它对于 HTTPS、TLS 和其他安全网络协议至关重要。
SecurityContext 提供证书链验证、私钥管理和信任设置。它是 Dart 的 dart:io 库的一部分,用于服务器端和安全客户端应用程序。
基本定义
SecurityContext 是用于安全通信的安全凭证的容器。它包含证书、私钥和信任设置。
主要功能包括证书链管理、客户端身份验证和自定义信任设置。它与 HttpClient 和 SecureSocket 一起使用。
创建基本的 SecurityContext
此示例演示了如何创建基本的 SecurityContext 实例。
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
使用客户端证书
此示例演示了客户端证书身份验证的配置。
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
自定义信任库
此示例演示了如何创建自定义信任库配置。
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
内存证书
此示例演示了直接从内存加载证书。
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 一起用于安全请求。
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
最佳实践
- 证书管理:妥善管理私钥权限,确保安全
- 信任库:定期更新信任库中的 CA 证书
- 验证:生产环境务必实现 badCertificateCallback
- 密码:安全存储私钥密码,切勿硬编码在代码中
- 上下文重用:尽可能重用 SecurityContext 实例
来源
本教程涵盖了 Dart 的 SecurityContext 类,并提供了实际示例,展示了证书管理、安全连接和 HttpClient 集成。
作者
列出 所有 Dart 教程。