【发布时间】: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