如何从 Java 连接到 Oracle?
通常,在java世界中,最常用的驱动程序是THIN这是一个纯javaoracle提供的驱动实现,使用sockets到连接。还有其他选择:
- JDBC-ODBC 桥(不再随新 Java 一起分发)
- 本机 API 驱动程序(OCI 驱动程序适合此处),
- 网络协议驱动程序
- 数据库协议驱动程序(瘦驱动程序)
Source: https://stackoverflow.com/a/21711330/3957754 https://stackoverflow.com/a/21711330/3957754
没有其他选项可以从 java 连接到 oracle。
什么是甲骨文钱包?
简而言之,只是oracle提供的一个选项hide当某些客户端(java、c#、oracle sql Developer、代理等)想要建立与数据库实例的连接时的用户和密码。
下面是 Spring Boot 的传统连接示例,其中需要用户名和密码:
spring:
datasource:
url: jdbc:oracle:thin:@host:port:sid
username: user
password: pwd
有关更多详细信息,请查看以下链接:
- https://docs.oracle.com/cd/E92519_02/pt856pbr3/eng/pt/tsvt/concept_UnderstandingOracleWallet.html?pli=ul_d96e224_tsvt https://docs.oracle.com/cd/E92519_02/pt856pbr3/eng/pt/tsvt/concept_UnderstandingOracleWallet.html?pli=ul_d96e224_tsvt
- https://www.appservgrid.com/documentation111/docs/rdbms12cr1/DBIMI/to_dbimi10236_d209.htm#DBIMI10236 https://www.appservgrid.com/documentation111/docs/rdbms12cr1/DBIMI/to_dbimi10236_d209.htm#DBIMI10236
- https://www.microfocus.com/documentation/dataexpress/WS24/Help/GUID-CB6FAEE3-6570-4A14-8A61-885F3F578C4B.html https://www.microfocus.com/documentation/dataexpress/WS24/Help/GUID-CB6FAEE3-6570-4A14-8A61-885F3F578C4B.html
- https://o7planning.org/10495/oracle-wallet https://o7planning.org/10495/oracle-wallet
如何使用甲骨文钱包?
如果不需要用户名和密码,那有什么魔力呢?当然,没有魔法。与任何其他服务一样,替代方案是文件。因此,如果您查看以下链接,您会发现有很多步骤来创建一些特殊文件客户端(java、c#、oracle sql Developer、代理等)应该使用用户名和密码:
- https://www.jetbrains.com/help/datagrip/connect-to-oracle-cloud-by-using-wallets.html https://www.jetbrains.com/help/datagrip/connect-to-oracle-cloud-by-using-wallets.html
- https://sumanruet.wordpress.com/2015/11/22/how-to-use-oracle-wallet/ https://sumanruet.wordpress.com/2015/11/22/how-to-use-oracle-wallet/
- https://helpcenter.netwrix.com/NA/Configure_IT_Infrastruct/Oracle/Configure_Oracle_Create_Wallet.html https://helpcenter.netwrix.com/NA/Configure_IT_Infrastructure/Oracle/Configure_Oracle_Create_Wallet.html
- http://www.dba-oracle.com/t_wallet_manager.htm http://www.dba-oracle.com/t_wallet_manager.htm
- https://community.appdynamics.com/t5/Knowledge-Base/How-do-I-configure-Oracle-Wallet-authentication-for-database/ta-p/37633 https://community.appdynamics.com/t5/Knowledge-Base/How-do-I-configure-Oracle-Wallet-authentication-for-database/ta-p/37633
如何使用oracle钱包文件?
经过大量讲座后,我找到了这些链接:
- http://oracle.ninja/using-one-client-with-multiple-oracle-wallets/ http://oracle.ninja/using-one-client-with-multiple-oracle-wallets/
- https://babumani.blogspot.com/2020/07/configure-oracle-client-with-multiple.html https://babumani.blogspot.com/2020/07/configure-oracle-client-with-multiple.html
- https://oraclesean.com/blog/managing-wallets-for-multiple-oracle-autonomous-databases https://oraclesean.com/blog/managing-wallets-for-multiple-oracle-autonomous-databases
与其他讲座一样,一种选择是使用名为的经典文件tnsnames.ora指定绝对路径我的钱包目录钱包文件:
MY_AWESOME_ID= (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)
(host=adb.eu-frankfurt-1.oraclecloud.com))(connect_data=(service_name=oracon_frankfurtdb.atp.oraclecloud.com))
(security=(ssl_server_cert_dn="CN=adwc.eucom...")
(MY_WALLET_DIRECTORY=D:\_Downloads_\Oracle_DB_Client_19.3\network\admin\FRANKFURT)(SSL_VERSION=1.2)(SSL_SERVER_DN_MATCH=yes)))
之前和官方的一些对比tnsnames.ora模板,我们可以看到我的钱包目录处于安全状态做这份工作 :
MYSID=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = mydnshostname)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = MYSID)
)
)
- http://www.dba-oracle.com/t_sample_tnsnames.ora.htm http://www.dba-oracle.com/t_sample_tnsnames.ora.htm
- https://docs.oracle.com/cd/B19306_01/gateways.102/b16217/a_smpfil.htm https://docs.oracle.com/cd/B19306_01/gateways.102/b16217/a_smpfil.htm
另一个链接:
- 设置 Oracle SSL 监听器 https://stackoverflow.com/questions/66588523/setup-oracle-ssl-listener
如何从java使用tnsnames.ora?
根据this https://stackoverflow.com/questions/54888853/how-to-configure-tnsnames-ora-file-with-spring-boot-application,我们可以直接使用tnsnames.oraTHIN连接将包含钱包文件的文件夹传递给TNS_管理员范围:
jdbc:oracle:thin:@wallet_dbname?TNS_ADMIN=/foo/bar/
或者更优雅地
jdbc:oracle:thin:@wallet_dbname?TNS_ADMIN=$ORACLE_HOME/network/admin
此配置需要额外的库18.3 JDBC驱动程序 https://www.oracle.com/database/technologies/appdev/jdbc-ucp-183-downloads.html.
Advice
正如您所看到的,实现这种身份验证需要很多疯狂的步骤。也不兼容 DevOps,因为需要手动或人工任务。你可以使用 docker 来自动化它。无论如何,这个实现是复杂而乏味的。
如果攻击者能够通过以下方式获取您的用户名和密码,为什么他无法访问预言机钱包文件?:
- 非法直接访问生产基础设施允许他读取服务器上的任何文件:application.yml、钱包文件等
- 非法访问您拥有凭据的源代码(非常糟糕的主意)
- 通过 java 应用程序中的错误访问服务器。
我建议使用经典方式:使用用户名和密码进行精简但有了这些安全配置:
- use 环境变量 https://stackoverflow.com/a/35535138/3957754在源代码中隐藏凭据
- 使用一些变量管理器 https://stackoverflow.com/a/70106410/3957754
- 只是数据库管理员应该知道或访问生产环境的数据库凭据。
- 生产数据库不应该暴露在世人面前。它必须位于专用网络内,并且特定客户端(Spring Boot 应用程序)应该能够访问它。
- 为特定应用程序创建特定用户。该用户能够看到最少的对象集(方案、表、视图等)
- 不断扫描您的源代码和基础设施以发现安全问题。