Skip to content

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的支持

证书准备

证书类型选择

  1. 自签名证书

    • 优点:免费,创建简单
    • 缺点:安全性较低,客户端需要手动信任
    • 适用场景:测试环境,内部网络
  2. 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 19cOracle 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特有配置

  1. 简化的TLS 1.3配置

    • 不需要复杂的密码套件配置
    • 默认启用更安全的加密算法
  2. 移除对弱算法的支持

    • 不再支持TLS 1.0/1.1
    • 移除对DES、3DES、MD5等弱算法的支持
  3. 增强的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密码

配置优化

  1. 强制使用SSL/TLS

    SQLNET.ENCRYPTION_SERVER = REQUIRED
    SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
  2. 配置合适的SSL版本

    # Oracle 19c
    SSL_VERSION = 1.2
    
    # Oracle 21c
    SSL_VERSION = 1.3
  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 365

Q:如何验证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:

  1. 在sqlnet.ora中设置:
    SQLNET.AUTHENTICATION_SERVICES = (TCPS)
  2. 或者在监听器配置中只启用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:

  1. 提前准备:在证书过期前30-90天申请新证书
  2. 备份当前Wallet:在更新证书前备份当前Wallet
  3. 更新证书:将新证书导入Wallet
  4. 测试连接:更新后测试SSL连接是否正常
  5. 监控证书:设置告警,避免证书过期

Q:如何配置双向认证?

A:

  1. 服务器配置:在listener.ora中设置SSL_CLIENT_AUTHENTICATION = TRUE
  2. 客户端配置
    • 为客户端创建证书
    • 将客户端证书导入客户端Wallet
    • 将客户端证书添加到服务器的信任列表
  3. 测试连接:使用客户端证书测试连接

Q:如何排查SSL连接问题?

A:

  1. 检查监听器状态:lsnrctl status
  2. 检查Wallet内容:orapki wallet display -wallet /u01/app/oracle/wallet -complete
  3. 检查证书有效期:orapki wallet display -wallet /u01/app/oracle/wallet | grep -i valid
  4. 查看监听器日志:tail -f /u01/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
  5. 查看数据库日志:tail -f /u01/app/oracle/diag/rdbms/dbname/dbname/trace/alert_dbname.log
  6. 启用sqlnet日志:在sqlnet.ora中设置SQLNET.LOG_FILE_SERVER = sqlnet.log

Q:如何在多租户环境中配置SSL/TLS?

A:

  1. 为CDB配置SSL/TLS,所有PDB将继承CDB的SSL/TLS配置
  2. 可以为特定PDB配置不同的SSL/TLS参数
  3. 为每个PDB创建独立的服务名,使用相同的SSL端口
  4. 客户端连接时指定PDB的服务名

Q:如何迁移从TLS 1.2到TLS 1.3?

A:

  1. 检查版本支持:确保Oracle版本支持TLS 1.3(Oracle 19c实验性支持,Oracle 21c全面支持)
  2. 更新配置
    • 在sqlnet.ora中设置SSL_VERSION = 1.3
    • 配置合适的密码套件
  3. 测试连接:测试客户端是否能正常连接
  4. 监控性能:监控TLS 1.3连接的性能
  5. 逐步迁移:可以先同时支持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安全管理,定期监控和维护,确保数据库通信的安全性。