使用Oracle Wallet连接Logstash时遇ORA-01017用户名/密码无效错误
问题分析
你遇到的ORA-01017错误,根源在于Logstash JDBC插件对空字符串jdbc_user的处理逻辑与Oracle JDBC驱动的外部认证(Wallet)逻辑不兼容:当你将jdbc_user设为空字符串时,插件会把空用户参数传递给驱动,驱动将其视为无效的认证请求,而非触发Wallet的无密码认证逻辑;而sqlplus /@name_high的写法会直接触发外部认证,因此可以正常连接。
解决方案
1. 修正JDBC驱动类
ojdbc10推荐使用标准驱动类,废弃的旧驱动类可能对Wallet支持存在兼容性问题:
将配置中的jdbc_driver_class从Java::oracle.jdbc.driver.OracleDriver改为:
jdbc_driver_class => "Java::oracle.jdbc.OracleDriver"
2. 调整jdbc_user参数
不要设置为空字符串,改为传递"/",这会触发Oracle JDBC驱动的外部认证逻辑,与sqlplus /@name_high的行为一致。同时确保不配置jdbc_password参数。
3. 验证Wallet配置文件
确认${ORACLE_HOME}/network/admin/wallet下的sqlnet.ora包含以下配置,确保驱动能正确识别Wallet:
WALLET_LOCATION = (SOURCE = (METHOD = FILE)(METHOD_DATA = (DIRECTORY = ${ORACLE_HOME}/network/admin/wallet))) SQLNET.AUTHENTICATION_SERVICES = (TCPS, BEQ)
4. 修改后的完整配置示例
input { jdbc { jdbc_driver_library => "${ORACLE_HOME}/dmu/jlib/ojdbc10.jar,${ORACLE_HOME}/ucp/lib/ucp.jar,${ORACLE_HOME}/jlib/oraclepki.jar,${ORACLE_HOME}/jlib/osdt_cert.jar,${ORACLE_HOME}/jlib/osdt_core.jar" jdbc_driver_class => "Java::oracle.jdbc.OracleDriver" jdbc_connection_string => "jdbc:oracle:thin:/@name_high?TNS_ADMIN=${ORACLE_HOME}/network/admin/wallet" jdbc_user => "/" schedule => "* * * * * *" statement => "SELECT * from table" connection_retry_attempts => 2 connection_retry_attempts_wait_time => 5 jdbc_pool_timeout => 20 jdbc_validation_timeout => 600 } }
额外排查点
- 再次确认Logstash进程的运行用户对Wallet目录下的
ewallet.p12、cwallet.sso等文件有读权限; - 检查ojdbc10.jar版本与Oracle数据库版本的兼容性,避免版本不匹配导致的认证异常。
内容的提问来源于stack exchange,提问作者Bipboopbug
相关产品推荐
相关产品推荐

