【发布时间】:2021-02-16 22:38:08
【问题描述】:
我正在使用带有数据 JPA 的 oracle 数据库 12c 和 spring boot 2.3。我的目标是用钱包将 TCPS 连接到数据库。当我搜索时,网上没有关于此的示例或指南。任何人都可以解释并展示一些例子吗?
【问题讨论】:
标签: java spring spring-boot
我正在使用带有数据 JPA 的 oracle 数据库 12c 和 spring boot 2.3。我的目标是用钱包将 TCPS 连接到数据库。当我搜索时,网上没有关于此的示例或指南。任何人都可以解释并展示一些例子吗?
【问题讨论】:
标签: java spring spring-boot
通常,在java世界中,最常用的驱动是THIN,它是由oracle提供的纯java驱动实现,它使用sockets 连接。还有其他选择:
来源:https://stackoverflow.com/a/21711330/3957754
没有其他选项可以从 java 连接到 oracle。
简而言之,只是当某些客户端(java、c#、oracle sql developer、代理等)想要建立与数据库的连接时,oracle 提供的一个选项,用于隐藏用户和密码实例。
这里是一个需要用户名和密码的传统连接示例:
spring:
datasource:
url: jdbc:oracle:thin:@host:port:sid
username: user
password: pwd
更多详情请查看以下链接:
如果不需要用户名和密码,那有什么魔力?当然没有魔法。与任何其他服务一样,替代方案是文件。因此,如果您查看以下链接,您会发现创建一些 特殊文件 客户端(java、c#、oracle sql 开发人员、代理程序等)应该使用的步骤很多和密码:
经过大量的讲座,我找到了这些链接:
与其他讲座一样,一种选择是使用名为 tnsnames.ora 的经典文件,指定钱包文件的绝对路径 MY_WALLET_DIRECTORY:
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 模板,我们可以看到只是 MY_WALLET_DIRECTORY 在安全做的工作:
MYSID=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = mydnshostname)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = MYSID)
)
)
其他链接:
根据this,我们可以直接在THIN连接上使用tnsnames.ora,将包含钱包文件的文件夹传递给TNS_ADMIN参数:
jdbc:oracle:thin:@wallet_dbname?TNS_ADMIN=/foo/bar/
或者更优雅
jdbc:oracle:thin:@wallet_dbname?TNS_ADMIN=$ORACLE_HOME/network/admin
此配置需要额外的库18.3 JDBC drivers。
如您所见,实现这种身份验证需要很多疯狂的步骤。也不兼容 devops,因为需要手动或人工任务。你可以使用 docker 来自动化。无论如何,这个实现是复杂而乏味的。
如果攻击者能够通过以下方式获取您的用户名和密码,为什么他无法访问预言机钱包文件?:
我建议使用经典方式:THIN with user & password,但要具备以下安全性:
【讨论】: