外观
Oracle SSL/TLS配置与最佳实践
SSL/TLS(Secure Sockets Layer/Transport Layer Security)是用于保护网络通信的加密协议,Oracle数据库支持使用SSL/TLS加密客户端与数据库之间的通信,防止数据在传输过程中被窃取或篡改。合理配置SSL/TLS可以提高数据库通信的安全性,保护敏感数据的安全。
SSL/TLS基础
SSL/TLS的核心作用
- 加密客户端与服务器之间的通信数据
- 验证服务器身份,防止中间人攻击
- 可选验证客户端身份
- 确保数据完整性,防止数据被篡改
SSL/TLS的工作原理
- 使用非对称加密(RSA、ECC等)交换会话密钥
- 使用对称加密(AES等)加密实际通信数据
- 使用数字证书验证身份
- 使用消息认证码(MAC)确保数据完整性
Oracle版本的SSL/TLS支持
| Oracle版本 | SSL/TLS支持情况 |
|---|---|
| 11g | 基础SSL/TLS支持,支持TLS 1.0/1.1 |
| 12c | 增强SSL/TLS支持,支持TLS 1.2 |
| 18c | 改进的TLS 1.2支持 |
| 19c | 支持TLS 1.0/1.1/1.2,实验性支持TLS 1.3 |
| 21c | 全面支持TLS 1.2/1.3,移除对TLS 1.0/1.1的支持 |
证书准备
证书类型选择
自签名证书
- 优点:免费,创建简单
- 缺点:安全性较低,客户端需要手动信任
- 适用场景:测试环境,内部网络
CA签发证书
- 优点:安全性高,客户端自动信任
- 缺点:需要付费,申请流程复杂
- 适用场景:生产环境,外部网络
证书格式
Oracle支持以下证书格式:
- PEM:Base64编码的文本格式
- DER:二进制格式
- PKCS#12:包含证书和私钥的加密文件
Oracle Wallet配置
Oracle使用Wallet存储SSL/TLS证书和私钥,Wallet是一个加密的容器,用于安全存储敏感信息。
创建Oracle Wallet
步骤1:创建Wallet目录
bash
mkdir -p /u01/app/oracle/wallet
chown oracle:oinstall /u01/app/oracle/wallet
chmod 700 /u01/app/oracle/wallet步骤2:创建Wallet
bash
# 使用orapki工具创建Wallet
orapki wallet create -wallet /u01/app/oracle/wallet -pwd WalletPass123 -auto_login
# 查看Wallet信息
orapki wallet display -wallet /u01/app/oracle/wallet添加证书到Wallet
添加自签名证书
bash
# 生成自签名证书
orapki wallet add -wallet /u01/app/oracle/wallet -pwd WalletPass123 -dn "CN=oracle.example.com,OU=Database,O=Example,C=US" -keysize 2048 -self_signed -validity 365
# 验证证书链
orapki wallet display -wallet /u01/app/oracle/wallet -complete添加CA签发证书
bash
# 添加CA证书
orapki wallet add -wallet /u01/app/oracle/wallet -pwd WalletPass123 -trusted_cert -cert /path/to/ca.crt
# 添加中间证书(如果有)
orapki wallet add -wallet /u01/app/oracle/wallet -pwd WalletPass123 -trusted_cert -cert /path/to/intermediate.crt
# 添加服务器证书和私钥
orapki wallet add -wallet /u01/app/oracle/wallet -pwd WalletPass123 -user_cert -cert /path/to/server.crt -key /path/to/server.key
# 验证证书链
orapki wallet display -wallet /u01/app/oracle/wallet -complete监听器SSL/TLS配置
配置listener.ora文件
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCPS)(HOST = oracle.example.com)(PORT = 2484))
)
)
# SSL配置
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/wallet)
)
)
# 客户端认证配置(FALSE:仅验证服务器,TRUE:验证服务器和客户端)
SSL_CLIENT_AUTHENTICATION = FALSE配置sqlnet.ora文件
# 认证服务配置
SQLNET.AUTHENTICATION_SERVICES = (BEQ, TCPS)
# SSL配置
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/wallet)
)
)
# SSL版本配置
# Oracle 19c:SSL_VERSION = 1.2 或 1.3(实验性)
# Oracle 21c:SSL_VERSION = 1.3(推荐)或 1.2
SSL_VERSION = 1.3
# 加密算法配置
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
# 完整性检查配置
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA384, SHA256)重启监听器
bash
# 停止监听器
lsnrctl stop
# 启动监听器
lsnrctl start
# 查看监听器状态,确认TCPS端口已配置
lsnrctl status数据库SSL/TLS配置
配置数据库参数
sql
-- 设置本地监听器,包含SSL端口
ALTER SYSTEM SET LOCAL_LISTENER = '(ADDRESS=(PROTOCOL=TCP)(HOST=oracle.example.com)(PORT=1521), (ADDRESS=(PROTOCOL=TCPS)(HOST=oracle.example.com)(PORT=2484)))' SCOPE=BOTH;
-- Oracle 19c配置TLS 1.3(实验性)
ALTER SYSTEM SET SSL_CIPHER_SUITES = '(TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256)' SCOPE=SPFILE;
ALTER SYSTEM SET SSL_VERSION = '1.3' SCOPE=SPFILE;
-- Oracle 21c配置TLS 1.3(推荐)
ALTER SYSTEM SET SSL_CIPHER_SUITES = '(TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256)' SCOPE=SPFILE;
ALTER SYSTEM SET SSL_VERSION = '1.3' SCOPE=SPFILE;
-- 重启数据库使参数生效
SHUTDOWN IMMEDIATE;
STARTUP;验证数据库SSL配置
sql
-- 查看SSL相关参数
SELECT name, value FROM V$PARAMETER WHERE name LIKE '%ssl%' OR name LIKE '%crypto%' ORDER BY name;
-- 查看加密算法支持
SELECT * FROM V$SSL_CIPHER_SUITES WHERE STATUS = 'ENABLED' ORDER BY CIPHER_SUITE_NAME;
-- 查看数据库版本
SELECT * FROM V$VERSION;客户端SSL/TLS配置
配置客户端Wallet
bash
# 创建客户端Wallet目录
mkdir -p /client/app/oracle/wallet
# 创建客户端Wallet
orapki wallet create -wallet /client/app/oracle/wallet -pwd ClientWalletPass123 -auto_login
# 添加CA证书到客户端Wallet(如果使用自签名证书,需要添加服务器证书)
orapki wallet add -wallet /client/app/oracle/wallet -pwd ClientWalletPass123 -trusted_cert -cert /path/to/ca.crt配置客户端sqlnet.ora
# SSL配置
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /client/app/oracle/wallet)
)
)
# 认证服务配置
SQLNET.AUTHENTICATION_SERVICES = (TCPS)
# SSL版本配置
SSL_VERSION = 1.3
# 加密算法配置
SQLNET.ENCRYPTION_CLIENT = REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128)
# 完整性检查配置
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA384, SHA256)配置客户端tnsnames.ora
ORCL_SSL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = oracle.example.com)(PORT = 2484))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
(SECURITY =
(SSL_SERVER_CERT_DN = "CN=oracle.example.com,OU=Database,O=Example,C=US")
)
)测试客户端SSL连接
bash
# 使用sqlplus测试SSL连接
sqlplus scott/tiger@orcl_ssl
# 验证连接是否使用SSL
SQL> SELECT SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') AS PROTOCOL,
SYS_CONTEXT('USERENV', 'SSL_VERSION') AS SSL_VERSION,
SYS_CONTEXT('USERENV', 'SSL_CIPHER') AS SSL_CIPHER,
SYS_CONTEXT('USERENV', 'AUTHENTICATED_IDENTITY') AS AUTH_IDENTITY
FROM DUAL;Oracle 19c与21c SSL/TLS差异
核心差异
| 特性 | Oracle 19c | Oracle 21c |
|---|---|---|
| TLS版本支持 | 支持TLS 1.0/1.1/1.2,实验性支持TLS 1.3 | 仅支持TLS 1.2/1.3,推荐使用TLS 1.3 |
| 加密算法支持 | 支持AES、3DES等,有限支持AES-GCM | 增强对AES-GCM等现代加密算法的支持,移除对弱算法的支持 |
| Wallet管理 | 支持传统Wallet | 增强Wallet管理,支持更多证书格式,简化配置 |
| TLS 1.3支持 | 实验性,需要额外配置 | 完全支持,配置更简单 |
| 性能优化 | 基础优化 | 增强SSL/TLS性能,减少加密开销,改进握手过程 |
| 安全默认值 | 较宽松的默认配置 | 更严格的安全默认值,默认启用更强的加密 |
Oracle 21c特有配置
简化的TLS 1.3配置
- 不需要复杂的密码套件配置
- 默认启用更安全的加密算法
移除对弱算法的支持
- 不再支持TLS 1.0/1.1
- 移除对DES、3DES、MD5等弱算法的支持
增强的Wallet管理
- 支持更多证书格式
- 简化的证书导入导出流程
生产环境最佳实践
加密算法选择
- 推荐TLS版本:TLS 1.3(Oracle 21c)或 TLS 1.2(Oracle 19c)
- 推荐对称加密算法:AES-256-GCM、AES-128-GCM
- 推荐非对称加密算法:RSA-2048或更高,ECC-256或更高
- 推荐哈希算法:SHA-256、SHA-384、SHA-512
- 禁用算法:TLS 1.0/1.1、DES、3DES、MD5、SHA-1
Wallet安全管理
- 使用强密码:Wallet密码至少12位,包含大小写字母、数字和特殊字符
- 权限控制:将Wallet目录权限设置为700,仅允许oracle用户访问
- 定期备份:定期备份Wallet文件,存储在安全的位置
- 使用auto_login:使用auto_login Wallet,减少密码输入,提高安全性
- 定期更换密码:每6-12个月更换一次Wallet密码
配置优化
强制使用SSL/TLS
SQLNET.ENCRYPTION_SERVER = REQUIRED SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED配置合适的SSL版本
# Oracle 19c SSL_VERSION = 1.2 # Oracle 21c SSL_VERSION = 1.3启用完整的日志记录
SQLNET.LOG_DIRECTORY_SERVER = /u01/app/oracle/log SQLNET.LOG_FILE_SERVER = sqlnet.log SQLNET.AUTHENTICATION_SERVICES = (TCPS)
监控与维护
- 监控证书有效期:设置告警,在证书过期前30-90天提醒更新
- 监控SSL连接:监控SSL连接的数量、状态和性能
- 监控握手失败:及时发现和处理SSL握手失败情况
- 定期审查配置:每季度审查一次SSL/TLS配置,确保符合安全要求
- 定期测试连接:每季度测试一次SSL/TLS连接,确保正常工作
常见问题(FAQ)
Q:如何检查Oracle数据库是否支持SSL/TLS?
A:可以通过查询V$VERSION视图查看Oracle数据库版本,然后参考版本支持表确认:
sql
SELECT * FROM V$VERSION;Q:如何创建自签名证书?
A:使用orapki工具创建自签名证书:
bash
orapki wallet add -wallet /u01/app/oracle/wallet -pwd WalletPass123 -dn "CN=oracle.example.com,OU=Database,O=Example,C=US" -keysize 2048 -self_signed -validity 365Q:如何验证SSL连接是否成功?
A:使用以下SQL查询验证:
sql
SELECT SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') AS PROTOCOL,
SYS_CONTEXT('USERENV', 'SSL_VERSION') AS SSL_VERSION,
SYS_CONTEXT('USERENV', 'SSL_CIPHER') AS SSL_CIPHER
FROM DUAL;Q:如何强制客户端使用SSL连接?
A:
- 在sqlnet.ora中设置:
SQLNET.AUTHENTICATION_SERVICES = (TCPS) - 或者在监听器配置中只启用TCPS协议,不启用TCP协议
Q:TLS 1.3与TLS 1.2有什么区别?
A:
- TLS 1.3更安全:移除了不安全的加密算法和特性
- TLS 1.3更快:减少了握手次数,从2-3次往返减少到1次往返
- TLS 1.3更简单:简化了协议设计,减少了攻击面
- TLS 1.3更高效:使用更现代的加密算法,提高了性能
Q:如何处理证书过期问题?
A:
- 提前准备:在证书过期前30-90天申请新证书
- 备份当前Wallet:在更新证书前备份当前Wallet
- 更新证书:将新证书导入Wallet
- 测试连接:更新后测试SSL连接是否正常
- 监控证书:设置告警,避免证书过期
Q:如何配置双向认证?
A:
- 服务器配置:在listener.ora中设置
SSL_CLIENT_AUTHENTICATION = TRUE - 客户端配置:
- 为客户端创建证书
- 将客户端证书导入客户端Wallet
- 将客户端证书添加到服务器的信任列表
- 测试连接:使用客户端证书测试连接
Q:如何排查SSL连接问题?
A:
- 检查监听器状态:
lsnrctl status - 检查Wallet内容:
orapki wallet display -wallet /u01/app/oracle/wallet -complete - 检查证书有效期:
orapki wallet display -wallet /u01/app/oracle/wallet | grep -i valid - 查看监听器日志:
tail -f /u01/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml - 查看数据库日志:
tail -f /u01/app/oracle/diag/rdbms/dbname/dbname/trace/alert_dbname.log - 启用sqlnet日志:在sqlnet.ora中设置
SQLNET.LOG_FILE_SERVER = sqlnet.log
Q:如何在多租户环境中配置SSL/TLS?
A:
- 为CDB配置SSL/TLS,所有PDB将继承CDB的SSL/TLS配置
- 可以为特定PDB配置不同的SSL/TLS参数
- 为每个PDB创建独立的服务名,使用相同的SSL端口
- 客户端连接时指定PDB的服务名
Q:如何迁移从TLS 1.2到TLS 1.3?
A:
- 检查版本支持:确保Oracle版本支持TLS 1.3(Oracle 19c实验性支持,Oracle 21c全面支持)
- 更新配置:
- 在sqlnet.ora中设置
SSL_VERSION = 1.3 - 配置合适的密码套件
- 在sqlnet.ora中设置
- 测试连接:测试客户端是否能正常连接
- 监控性能:监控TLS 1.3连接的性能
- 逐步迁移:可以先同时支持TLS 1.2和TLS 1.3,然后逐步过渡到仅TLS 1.3
总结
SSL/TLS配置是Oracle数据库安全的重要组成部分,通过配置SSL/TLS可以加密客户端与数据库之间的通信,保护敏感数据的安全。DBA应该根据Oracle版本选择合适的TLS版本和加密算法,合理配置Wallet和监听器,加强Wallet安全管理,定期监控和维护SSL/TLS连接。
Oracle 21c全面支持TLS 1.3,提供了更好的性能和安全性,DBA可以考虑升级到新版本以获得更好的SSL/TLS支持。在生产环境中,建议使用CA签发的证书,强制使用SSL/TLS,配置强加密算法,加强Wallet安全管理,定期监控和维护,确保数据库通信的安全性。
