Tomcat 8 JNDI и Oracle с использованием Oracle Wallet - PullRequest
0 голосов
/ 09 ноября 2018

На работе я пытаюсь подключить приложение Tomcat 8.5.34 к базе данных Oracle 12.2.0.1 через TCPS с помощью Oracle Wallet.

Я следовал нескольким инструкциям и сделал следующее:

Добавлены oraclepki.jar, ojdbc8.jar, osdt_core.jar и osdt_core.jar в каталоге lib / catalina.

Изменен поставщик java.security для включения oracle.security.pki.OraclePKIProvider ввнизу списка провайдеров.

Я настроил коннекторы JNDI для подключения к базе данных через псевдоним.

В файле setenvs.sh Tomcat я добавил следующее:

-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 **

Я запустил strace на Tomcat.И я могу подтвердить, что 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

1 Ответ

0 голосов
/ 19 ноября 2018

Наконец-то удалось решить проблему, не используя файлы Oracle Wallet, а вместо этого использовать тот же файл JKS, который использовался для создания Oracle Wallets.

База данных Oracle использует сами кошельки Oracle, но на стороне Tomcat вы можете использовать метод JKS.

  1. Добавьте следующие файлы jar в lib / of Tomcat: ojdbcx.jar (x = релевантный мажор версии Ван Ява, vbl: 8)
  2. В ./jre/lib/security/java.security добавьте следующее: security.provider.10 = oracle.security.pki.OraclePKIProvider
  3. В context.xml:
    • url = "jdbc: oracle: thin: @ (ОПИСАНИЕ = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCPS) (HOST =) (PORT = 2484))) (CONNECT_DATA = (SERVICE_NAME = )) ) "
    • connectionProperties = "javax.net.ssl.trustStore = / Хранилища ключей / oracle_keystore / mykeystore.jks;. Javax.net.ssl.trustStorePassword = ChangeMe; javax.net.ssl.trustStoreType = JKS; javax.net.ssl. . KeyStore = / Хранилища ключей / oracle_keystore / mykeystore.jks; javax.net.ssl.keyStorePassword = ChangeMe; javax.net.ssl.keyStoreType = JKS; "
...