TLS 1.3
TLS 1.3 是目前互联网广泛采用的安全通信协议,其实现完全基于 OpenSSL 提供的高层 SSL/TLS 接口 。应用程序通常只需创建一个 SSL/TLS 上下文、配置密码套件、设置协议版本和支持的密钥交换群,然后调用 SSL_connect()/SSL_accept() 完成握手。握手过程、密钥派生、数据加密等全部由 OpenSSL 内部调用一系列 EVP、HKDF、EVP_CIPHER 等函数完成。
例如,TLS 1.3 在握手阶段就会使用 EVP_PKEY_derive() 进行 ECDHE 密钥交换,并用 HKDF 算法派生出握手密钥和主密钥,再由内部调用 EVP_CIPHER 系列函数完成 AEAD(如 AES-GCM 或 ChaCha20-Poly1305)加密。
DLMS suite 2
在电网、智能计量等专用领域中,DLMS/COSEM 安全套件 2(suite2)主要用于对数据进行保护,其安全设计通常比较固定且轻量。
由于设备(如电表)资源受限,suite2 的实现一般不需要完整的 TLS 握手过程,而是采用预共享密钥或简化的挑战---响应认证机制,并直接调用 OpenSSL 的低层加密接口来完成对称加密、消息摘要与认证。
例如,AES-GCM 作为常用算法,其加密、解密过程一般由 EVP_EncryptInit_ex()、EVP_EncryptUpdate() 和 EVP_EncryptFinal_ex() 实现;而用于消息完整性或 HMAC 校验则会调用 HMAC() 或 EVP_Digest() 系列函数。
Suite2 与 TLS 对比
DLMS(Device Language Message Specification)的Suite 2和TLS 1.3是两种不同的加密方式,尽管它们都用于保障通信安全,但在设计、应用场景和实现细节上有显著差异。
1. DLMS Suite 2
- 定义:DLMS Suite 2是DLMS/COSEM标准中的一种安全套件,专为智能电表和能源管理系统设计。
- 加密算法:通常使用对称加密算法(如AES)和非对称加密算法(如ECC)结合,确保数据的机密性、完整性和身份验证。
- 应用场景:主要用于智能电表与数据集中器或管理系统之间的通信。
- 实现细节:DLMS Suite 2在应用层实现,与DLMS协议紧密集成,提供端到端的安全保障。
2. TLS 1.3
- 定义:TLS 1.3是传输层安全协议的最新版本,广泛应用于互联网通信,如网页浏览、电子邮件等。
- 加密算法:支持多种现代加密算法(如AES、ChaCha20、ECDHE),提供前向安全性,确保即使密钥泄露,历史通信仍安全。
- 应用场景:适用于各种需要安全通信的场景,包括网页、电子邮件、VPN等。
- 实现细节:TLS 1.3在传输层实现,独立于应用层协议,可为多种应用层协议提供安全保障。
主要区别
- 协议层次:DLMS Suite 2在应用层实现,TLS 1.3在传输层实现。
- 应用场景:DLMS Suite 2专为智能电表设计,TLS 1.3适用于广泛的互联网通信。
- 加密算法:DLMS Suite 2使用特定算法组合,TLS 1.3支持更多现代算法,提供前向安全性。
总结
DLMS Suite 2和TLS 1.3是两种不同的加密方式,分别针对特定应用场景设计,不能互相替代。DLMS Suite 2专为智能电表通信优化,而TLS 1.3则适用于广泛的互联网通信需求。
TLS 参数含义
cpp
enum TLSVersion {
TLS_1_2 = 0,
TLS_1_3 = 1,
TLS_1_2_1_3 = 2
};
TLSVersion tls_version_;
bool client_auth_;
std::string server_cert_;
std::string server_key_;
std::string ca_cert_;
std::string cipher_list_;
std::string cipher_suites_;
这些参数是用于配置 TLS(传输层安全) 通信的关键参数。它们决定了 TLS 的行为、安全性和功能。以下是每个参数的详细解释:
1. tls_version_
-
含义:指定使用的 TLS 版本。
-
类型 :
TLSVersion(可能是一个枚举类型,表示不同的 TLS 版本)。 -
可选值 :
TLS1_2_VERSION:TLS 1.2。TLS1_3_VERSION:TLS 1.3。
-
作用 :
- 控制服务器和客户端之间使用的 TLS 协议版本。
- TLS 1.3 是最新版本,提供了更好的性能和安全性(如 1-RTT 握手、前向安全性)。
-
示例 :
cpptls_version_ = TLS1_3_VERSION; // 使用 TLS 1.3
2. client_auth_
-
含义:是否启用客户端认证(双向认证)。
-
类型 :
bool。 -
可选值 :
true:启用客户端认证,客户端必须提供有效的证书。false:禁用客户端认证,客户端无需提供证书。
-
作用 :
- 启用客户端认证后,服务器会验证客户端的证书,确保客户端的身份。
- 适用于高安全性场景(如金融、医疗)。
-
示例 :
cppclient_auth_ = true; // 启用客户端认证
3. server_cert_
-
含义:服务器证书文件的路径。
-
类型 :
std::string。 -
作用 :
- 服务器证书用于向客户端证明服务器的身份。
- 证书通常由受信任的证书颁发机构(CA)签发。
-
文件格式 :
- PEM 格式(Base64 编码的文本文件)。
- 文件内容以
-----BEGIN CERTIFICATE-----开头,以-----END CERTIFICATE-----结尾。
-
示例 :
cppserver_cert_ = "/path/to/server.crt"; // 服务器证书路径
4. server_key_
-
含义:服务器私钥文件的路径。
-
类型 :
std::string。 -
作用 :
- 服务器私钥用于解密客户端发送的数据,并用于签名操作。
- 私钥必须与服务器证书匹配。
-
文件格式 :
- PEM 格式(Base64 编码的文本文件)。
- 文件内容以
-----BEGIN PRIVATE KEY-----开头,以-----END PRIVATE KEY-----结尾。
-
示例 :
cppserver_key_ = "/path/to/server.key"; // 服务器私钥路径
5. ca_cert_
-
含义:CA 证书文件的路径。
-
类型 :
std::string。 -
作用 :
- CA 证书用于验证客户端证书的有效性(在启用客户端认证时)。
- 如果客户端证书由受信任的 CA 签发,服务器会接受该证书。
-
文件格式 :
- PEM 格式(Base64 编码的文本文件)。
- 文件内容以
-----BEGIN CERTIFICATE-----开头,以-----END CERTIFICATE-----结尾。
-
示例 :
cppca_cert_ = "/path/to/ca.crt"; // CA 证书路径
6. cipher_list_
-
含义:TLS 1.2 及以下版本支持的加密套件列表。
-
类型 :
std::string。 -
作用 :
- 指定服务器和客户端之间可以使用的加密算法组合。
- 加密套件的格式为
算法:密钥长度:模式,例如ECDHE-ECDSA-AES128-GCM-SHA256。
-
示例 :
cppcipher_list_ = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256";
7. cipher_suites_
-
含义:TLS 1.3 支持的加密套件列表。
-
类型 :
std::string。 -
作用 :
- 指定 TLS 1.3 可以使用的加密算法组合。
- TLS 1.3 的加密套件格式为
算法:模式,例如TLS_AES_128_GCM_SHA256。
-
示例 :
cppcipher_suites_ = "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256";
8. 参数之间的关系
- TLS 版本 :
tls_version_决定了是否使用cipher_list_(TLS 1.2 及以下)或cipher_suites_(TLS 1.3)。
- 客户端认证 :
- 如果
client_auth_为true,则需要提供ca_cert_来验证客户端证书。
- 如果
- 服务器证书和私钥 :
server_cert_和server_key_必须匹配,否则 TLS 握手会失败。
9. 示例配置
以下是一个完整的配置示例:
cpp
tls_version_ = TLS1_3_VERSION; // 使用 TLS 1.3
client_auth_ = true; // 启用客户端认证
server_cert_ = "/path/to/server.crt"; // 服务器证书
server_key_ = "/path/to/server.key"; // 服务器私钥
ca_cert_ = "/path/to/ca.crt"; // CA 证书
cipher_suites_ = "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256"; // TLS 1.3 加密套件
10. 总结
这些参数共同定义了 TLS 通信的行为和安全性:
tls_version_决定了使用的 TLS 协议版本。client_auth_控制是否启用客户端认证。server_cert_和server_key_用于服务器身份验证。ca_cert_用于验证客户端证书。cipher_list_和cipher_suites_分别指定 TLS 1.2 和 TLS 1.3 的加密算法组合。
