
# 加密解析失败
#### 故障现象
旁路TLS流量未成功解析。
#### 可能原因
- 上传数据库服务器的SSL私钥错误。
- 私钥算法与格式错误。
- 协议与套件配置错误。
- 未捕获到连接建立时的完整双向握手流量。
- 数据库安全审计系统采用旁路模式解析TLS加密流量，该方式依赖完整准确的网络数据包序列。由于旁路审计采用被动监听方式，网络波动可能导致部分加密流量解析不完整。
 
#### 解决办法
先排除常规非解密解析失败的问题，如数据库配置错误、Agent配置错误、网络不通、安全组未放通、端口未放通等问题。
确认其他配置正确后，请逐项排查以下约束：
1. 请上传数据库服务器的SSL私钥，而非证书文件。
2. **私钥算法与格式** ：必须为RSA算法、PEM格式且无密码；不支持ECC/ECDSA证书，且需确保私钥与数据库当前证书严格匹配。
   可用openssl x509 -noout -modulus -in server.crt \| openssl md5与openssl rsa -noout -modulus -in server.key \| openssl md5比对模数哈希，应相等。
   正确格式参考：
   ```
   -----BEGIN RSA PRIVATE KEY-----
   ...
   -----END RSA PRIVATE KEY-----
   ```
   错误格式参考：有密码加密密钥
   ```
   -----BEGIN RSA PRIVATE KEY-----
   Proc-Type: 4,ENCRYPTED
   DEK-Info: AES-256-CBC,...
   ...
   -----END RSA PRIVATE KEY-----
   ```
   其他错误类型：
   ```
   -----BEGIN CERTIFICATE-----
   ...
   -----END CERTIFICATE-----
   ```
   
3. **协议与套件配置**：必须禁用TLS 1.3及ECDHE/DHE类套件（前向保密），仅允许配置TLS_RSA_\*系列（如AES128-SHA），否则静态私钥无法推导会话密钥。
4. 如PostgreSQL的postgresql.conf中ssl = on，且ssl_min_protocol_version = 'TLSv1'、ssl_max_protocol_version = 'TLSv1.2'（禁用TLS 1.3），ssl_ciphers必须仅包含静态RSA密钥交换套件，推荐如指定算法ssl_ciphers = 'AES256-SHA'，或多种指定算法ssl_ciphers = 'AES256-SHA:AES128-SHA:AES128-SHA256:AES256-SHA256'（不能包含ECDHE/DHE算法）。 不推荐GCM或RC4算法：RC4属于同步流密码，一旦流量发生丢包或字节缺失后续皆不能成功解析；GCM在旁路环境下的TCP重传包、空报文等极易导致解析器的计数器出现偏差，出现偏差后续流量不能被成功解析。
   参考配置文件如postgresql.conf部分配置：
   ```
   # 开启 SSL
   ssl = on
   # 1. 指定加密套件
   ssl_ciphers = 'AES256-SHA:AES128-SHA:AES128-SHA256:AES256-SHA256'
   # 2. 指定协议版本范围
   ssl_min_protocol_version = 'TLSv1'
   ssl_max_protocol_version = 'TLSv1.2'
   # 3. 指定证书和私钥 (确保权限 600)
   ssl_cert_file = 'server.crt'
   ssl_key_file = 'server.key'
   ssl_ca_file = 'cacert.pem'
   ```
   
5. **握手流量捕获**：解密依赖握手包中的Client Key Exchange，必须捕获到连接建立时的完整双向握手流量；若连接在抓包前、上传密钥前已建立或握手包丢失，将无法解密。
 
