Perl DBI->connect触发ORA-12650无通用加密算法错误解决方案咨询
解决方案
可以通过DBI->connect传入属性参数的方式解决该问题,不需要修改服务端配置。
报错原因
ORA-12650错误的本质是Oracle客户端和服务端协商数据完整性校验算法时没有找到双方都支持的公共算法:服务端只允许SHA256/SHA384/SHA512三类校验算法,而你当前连接时没有指定客户端校验算法,默认使用的SHA1不在服务端允许列表内,所以连接失败。
实现代码
DBD::Oracle支持在连接的属性哈希中传入Oracle网络层配置参数,直接覆盖本地sqlnet.ora的默认配置,示例代码如下:
my $dbh = DBI->connect( "dbi:Oracle:$your_db_name", $your_username, $your_password, { RaiseError => 1, AutoCommit => 1, # 配置数据完整性校验参数 ora_net_crypto_checksum_client => 'required', ora_net_crypto_checksum_types_client => '(SHA256,SHA384,SHA512)', # 若服务端同时配置了加密算法限制,可补充以下参数,取值和服务端配置保持一致 # ora_net_encryption_client => 'required', # ora_net_encryption_types_client => '(AES256,AES192,AES128)', } ) or die "连接失败: $DBI::errstr";
注意事项
- 请确保本地Oracle客户端版本不低于11gR2,更早版本的Oracle客户端不支持SHA256及以上的校验算法,需要先升级客户端
- 若配置后仍报错,可根据服务端的校验策略调整
ora_net_crypto_checksum_client的取值:服务端SQLNET.CRYPTO_CHECKSUM_SERVER为required时客户端也要设为required,服务端为accepted时客户端设为accepted或required均可
内容的提问来源于stack exchange,提问作者user419534
相关产品推荐
相关产品推荐

