首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用SSO钱包将Oracle与Apache连接起来

无法使用SSO钱包将Oracle与Apache连接起来
EN

Stack Overflow用户
提问于 2018-12-04 15:39:18
回答 2查看 2.6K关注 0票数 3

我们正在尝试使用配置在我们端的SSO钱包和Apache连接到一个以AmazonRDS形式运行的远程Oracle数据库。我们能够使用spark-shell实用程序加载数据,如下所述

使用添加到类路径中的jdbc和oraclepki启动星火外壳。

代码语言:javascript
复制
 spark-shell --driver-class-path /path/to/ojdbc8.jar:/path/to/oraclepki.jar

这是使用的JDBC url:

代码语言:javascript
复制
 val JDBCURL="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=www.example.aws.server.com)(PORT=1527))(CONNECT_DATA=(SID=XXX))(SECURITY = (SSL_SERVER_CERT_DN =\"C=US,ST=xxx,L=ZZZ,O=Amazon.com,OU=RDS,CN=www.xxx.aws.zzz.com\")))"

下面是用于加载数据的Spark调用

代码语言:javascript
复制
 spark.read.format("jdbc").option("url",JDBCURL)
.option("user","USER")
.option("oracle.net.tns_admin","/path/to/tnsnames.ora")
.option("oracle.net.wallet_location","(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=/path/to/ssl_wallet/)))")
.option("password", "password")
.option("javax.net.ssl.trustStore","/path/to/cwallet.sso")
.option("javax.net.ssl.trustStoreType","SSO")
.option("dbtable",QUERY)
.option("driver", "oracle.jdbc.driver.OracleDriver").load    

但是,当我们试图使用spark-submit命令运行它时,我们将得到以下错误:

代码语言:javascript
复制
    Exception in thread "main" java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:774)
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:688)
    ...
    ...
    ...

    Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:523)
    at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:521)
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:660)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:286)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1438)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:518)
    ... 28 more
    Caused by: oracle.net.ns.NetException: Unable to initialize ssl context.
    at oracle.net.nt.CustomSSLSocketFactory.getSSLSocketEngine(CustomSSLSocketFactory.java:597)
    at oracle.net.nt.TcpsNTAdapter.connect(TcpsNTAdapter.java:143)
    at oracle.net.nt.ConnOption.connect(ConnOption.java:161)
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:470)
    ... 33 more
    Caused by: oracle.net.ns.NetException: Unable to initialize the key store.
    at oracle.net.nt.CustomSSLSocketFactory.getKeyManagerArray(CustomSSLSocketFactory.java:642)
    at oracle.net.nt.CustomSSLSocketFactory.getSSLSocketEngine(CustomSSLSocketFactory.java:580)
    ... 36 more
    Caused by: java.security.KeyStoreException: SSO not found
    at java.security.KeyStore.getInstance(KeyStore.java:851)
    at oracle.net.nt.CustomSSLSocketFactory.getKeyManagerArray(CustomSSLSocketFactory.java:628)
    ... 37 more
    Caused by: java.security.NoSuchAlgorithmException: SSO KeyStore not available
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
    at java.security.Security.getImpl(Security.java:695)
    at java.security.KeyStore.getInstance(KeyStore.java:848)

我是很新的火花,可能在这里做错了什么。这就是我试图配置Config的方式。

代码语言:javascript
复制
    val conf = new SparkConf().setAppName(JOB_NAME)
    conf.set("javax.net.ssl.trustStore", "/path/to/cwallet.sso");
    conf.set("javax.net.ssl.trustStoreType", "SSO")
    conf.set("oracle.net.tns_admin", "/path/to/tnsnames.ora")
    conf.set("oracle.net.wallet_location", "(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=/path/to/ssl_wallet/dir/)))")
    conf.set("user", "user")
    conf.set("password", "pass")

下面是使用的spark-submit命令

代码语言:javascript
复制
    spark-submit --class fully.qualified.path.to.main \
    --jars /path/to/ojdbc8.jar,/path/to/oraclepki.jar,/path/to/osdt_cert.jar,/path/to/osdt_core.jar \
    --deploy-mode client --files /path/to/hive-site.xml --master yarn  \
    --driver-memory 12G \
    --conf "spark.executor.extraJavaOptions=-Djavax.net.ssl.trustStore=/path/to/cwallet.sso -Djavax.net.ssl.trustStoreType=SSO" \
    --executor-cores 4 --executor-memory 12G \
    --num-executors 20 /path/to/application.jar /path/to/application_custom_config.conf

还试图添加

--conf 'spark.executor.extraJavaOptions=-Djavax.net.ssl.trustStore=/path/to/cwallet.sso -Djavax.net.ssl.trustStoreType=SSO'

--files /path/to/cwallet.sso,/path/to/tnsnames.ora

spark-submit命令,但没有任何运气。我到底在做什么错事?也尝试了这个职位中提到的解决方案,但是得到了相同的error.Do,我需要确保trustStore should be accessible on each executor node?如果是这样的话,那么为什么spark-shell命令正常工作呢?这是否意味着火花-cli不包括执行命令的任何辅助节点?

请指点

更新:

看起来您使用的是12.1.0.2中的JDBC驱动程序。请升级到18.3,您可以从oracle.com/technetwork/database/application-development/jdbc/…下载为了方便钱包的使用,已经做了一些修改。- @Jean de Lavarene

在遵循@Jean de Lavarene建议的更改之后,消除了最初的错误,但下面是我现在得到的

代码语言:javascript
复制
    org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3, example.server.net, executor 2): java.sql.SQLException: PKI classes not found. To use 'connect /' functionality, oraclepki.jar must be in the classpath: java.lang.NoClassDefFoundError: oracle/security/pki/OracleWallet
    at oracle.jdbc.driver.PhysicalConnection.getSecretStoreCredentials(PhysicalConnection.java:3058)
    at oracle.jdbc.driver.PhysicalConnection.parseUrl(PhysicalConnection.java:2823) 

当我在星火本地模式下运行时:--master local[*],它可以正常工作,但是yarn模式失败。

我已经使用了带有逗号分隔的jars列表的--jars命令。我发现的是:

1) --jars期望路径是本地路径,然后将它们复制到HDFS路径

2)一开始使用file:///是不起作用的

3)如果没有指定--jars参数,程序将请求缺少JDBC驱动程序类。一旦我使用--jars指定了ojdbc8.jar,那么这些错误就会消失,并开始给出oraclepki.jar not。我不知道为什么会发生这种事。

4)还尝试使用:作为分隔符,同时指定多个jars,但没有任何结果。

更新2

我能够通过使用

代码语言:javascript
复制
    --driver-class-path /path/to/oraclepki.jar:/path/to/osdt_cert.jar:/path/to/others.jar 

但是,一旦我们进入--master yarn模式,下面的异常就会显示出来

代码语言:javascript
复制
    Caused by: oracle.net.ns.NetException: Unable to initialize the key store.
    at oracle.net.nt.CustomSSLSocketFactory.getKeyManagerArray(CustomSSLSocketFactory.java:617)
    at oracle.net.nt.CustomSSLSocketFactory.createSSLContext(CustomSSLSocketFactory.java:322)
    ... 32 more
    Caused by: java.io.FileNotFoundException: /path/to/cwallet.sso (No such file or directory)

根据我的理解,当它从worker节点启动作业时,这些节点上没有可用的cwallet.sso文件路径。我们试图为钱包指定一个HDFS路径,但是该实用工具希望在创建钱包时提供一个本地路径。

那么,我们是否需要手动将钱包文件复制到所有员工节点?或者,是否有更好的选择来实现这一点?

请指点

EN

回答 2

Stack Overflow用户

发布于 2019-06-03 10:50:34

巴利,这就是我们能够解决它的方法。这里需要记住的一件重要的事情是,SSO文件必须存在于星火将运行的所有节点上(火花的执行器节点)。

代码语言:javascript
复制
    val SOURCE_DF = spark.read.format("jdbc")
        .option("url", "jdbc:oracle:thin:@...full string here")
        .option("oracle.net.wallet_location", "(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=/path/to/sso/dir)))")
        ...
        ...

如果需要传递其他详细信息,可以添加更多的.options参数

代码语言:javascript
复制
   .option("oracle.net.tns_admin", "oracle/tns/file/path"))
   .option("javax.net.ssl.trustStoreType", "sso")
票数 1
EN

Stack Overflow用户

发布于 2022-03-09 05:25:30

代码语言:javascript
复制
Caused by: oracle.net.ns.NetException: Unable to initialize the key store.
Caused by: java.security.KeyStoreException: SSO not found
Caused by: java.security.NoSuchAlgorithmException: SSO KeyStore not available

观察和注释:

  1. 此错误表示为KeyStore,而不是TrustStore。但这可能只是误导术语,然而,java和oracle类的错误消息都使用相同的术语。
  2. 根CA证书位于TrustStore中,但如果使用的是客户端密钥,则需要以下KeyStore属性: .option("javax.net.ssl.keyStore","/path/to/cwallet.sso") .option("javax.net.ssl.keyStoreType","SSO") .option("oracle.net.authentication_services","(TCPS)") Oracle JDBC SSL手册本身助长了术语的混乱,因为它甚至从未解决过TrustStore问题: 如果oraclepki.jar文件位于CLASSPATH上,则驱动程序可以以下列方式自动加载Oracle提供程序: java javax.net.ssl.keyStore=/path/to/wallet/cwallet.sso -cp oracleki.jar:ojdbc8.jar-D MyApp 类似地,对于oracle.net.wallet_location连接属性的指定值,驱动程序可以以下列方式自动加载Oracle提供程序: oracle.net.wallet_location=file:/path/to/wallet/cwallet.sso -cp .:oraclepki.jar:ojdbc8.jar -D MyApp
  3. 基于上述选择,如果您只指定了皮夹属性,显然可以省略所有的javax.net.ssl行? "(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=/path/to/ssl_wallet)))") .option("oracle.net.wallet_location“)
  4. 正如您所发现的,使用Oracle12.1客户端连接到Oracle数据库是有问题的。驱动程序不兼容问题显示为模糊错误(即使这个旧驱动程序被认为是"前向兼容“)。
  5. Oracle12c驱动程序不支持连接字符串(简易连接+)中的所有增强功能,但是在19c JDBC驱动程序中添加了一些连接属性(如wallet_location )。因此,像这样使用完全指定的自包含ezconnect连接URL可以使事情变得更简单。
  6. 另一种选择是使用Java TrustStore而不是Oracle。
  7. 如果仍然看到问题,请使用javax.net.debug=all捕获跟踪详细信息。
  8. 始终测试您与tnspingsqlplus的连接,然后才能在火花放电中进行测试。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53616496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档