【问题标题】:Tomcat 8 JNDI and Oracle using Oracle WalletTomcat 8 JNDI 和 Oracle 使用 Oracle Wallet
【发布时间】:2018-11-09 17:52:29
【问题描述】:

在工作中,我试图让 Tomcat 8.5.34 应用程序使用 Oracle Wallet 通过 TCPS 连接到 Oracle DB 12.2.0.1。

我遵循了许多不同的指导并做了以下事情:

在 catalina lib/ 文件夹中添加了 oraclepki.jar、ojdbc8.jar、osdt_core.jar 和 osdt_core.jar。

修改了 java.security 提供程序以在列出的提供程序的底部包含 oracle.security.pki.OraclePKIProvider。

我将 JNDI 连接器配置为通过别名连接到数据库。

在Tomcat的setenvs.sh中,我添加了以下内容:

-Doracle.net.tns_admin=< wallet files location with tnsora>
-Doracle.net.wallet_location="(SOURCE=(METHOD=FILE) (METHOD_DATA = (DIRECTORY=< wallet files location with tnsora>)))"

然而,日志说:

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:547)
        ... 41 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)
        ... 42 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)
        ... 43 more

奇怪的是,我用 Java 编写了一个快速测试应用程序,它确实成功连接了!

java -Doracle.net.tns_admin="< wallet files location with tnsora>" -Doracle.net.wallet_location="(SOURCE=(METHOD=FILE) (METHOD_DATA = (DIRECTORY=< wallet files location with tnsora>)))" -cp ./lib/ojdbc8.jar:/root:./lib/oraclepki.jar:./lib/osdt_core.jar:./lib/osdt_cert.jar  DataSourceSample
AArray = [B@6328d34a
AArray = [B@145eaa29
AArray = [B@15bb6bea
AArray = [B@52aa2946
AArray = [B@4de5031f
AArray = [B@67e2d983
Driver Name: Oracle JDBC driver
Driver Version: 12.2.0.1.0
Default Row Prefetch Value is: 20
Database Username is: <Name of the Database>
....
....
Results

我用完了所有可能的选择。

** 更新 1 **

我在 Tomcat 上运行了一个 strace。我可以确认 Tomcat 确实看到了钱包文件:

[pid 21880] lstat("/cwallet.sso", {st_mode=S_IFREG|0700, st_size=4741, ...}) = 0 [pid 21880] stat("/cwallet.sso.lck", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 [pid 21880] stat("/oracle_wallets/cwallet.sso.lck", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 [pid 21880] stat("/cwallet.sso.lck", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 [pid 21880] chmod("/cwallet.sso.lck", 0100200) = 0

【问题讨论】:

  • 使用的路径是什么,运行tomcat进程的用户是否有权访问该文件?
  • 我尝试以 tomcat 用户身份运行我的 Java 应用程序,所以文件系统权限应该没问题

标签: java tomcat jdbc oracle12c ojdbc


【解决方案1】:

最终解决了这个问题,不使用 Oracle Wallet 文件,而是使用最初用于创建 Oracle Wallet 的相同 JKS 文件。

Oracle 数据库使用 Oracle 钱包本身,但在 Tomcat 端,您可以使用 JKS 方法。

  1. 在Tomcat的lib/中添加如下jar文件: ojdbcx.jar (x =relatede major versie van Java, vbl: 8)
  2. 在 ./jre/lib/security/java.security 添加以下内容:security.provider.10=oracle.security.pki.OraclePKIProvider
  3. 在 context.xml 中:
    • url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCPS)(HOST=)(PORT=2484)))(CONNECT_DATA=(SERVICE_NAME=)) )"
    • connectionProperties="javax.net.ssl.trustStore=./keystores/oracle_keystore/mykeystore.jks;javax.net.ssl.trustStorePassword=changeme;javax.net.ssl.trustStoreType=JKS;javax.net.ssl. keyStore=./keystores/oracle_keystore/mykeystore.jks;javax.net.ssl.keyStorePassword=changeme;javax.net.ssl.keyStoreType=JKS;"

【讨论】:

    【解决方案2】:

    我想你可能没有告诉它你的钱包文件的类型 (SSO/JKS):

    -Djavax.net.ssl.trustStoreType="SSO"
    

    【讨论】:

    • 啊可能是!很久以前我无法验证这一点,但希望可以帮助其他人:)
    猜你喜欢
    • 2012-05-28
    • 2013-05-07
    • 2017-09-04
    • 2012-02-15
    • 2017-11-20
    • 2017-02-27
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    相关资源
    最近更新 更多