首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用TCPS连接Oracle数据库

用TCPS连接Oracle数据库
EN

Stack Overflow用户
提问于 2021-02-07 23:17:24
回答 1查看 2.5K关注 0票数 0

尝试连接来自python的TCPS连接的Oracle数据库,但它在Ora-28759中失败:未能打开文件。

当从本地/其他服务器连接到不同服务器上的数据库时,我不确定需要在钱包中配置什么。

代码语言:javascript
复制
    import os
    import os.path
    import sys
    import cx_Oracle

    ORACLE_VERSION=19.3
    os.environ['ORACLE_BASE']=/Users/machild/Documents/oracle
    os.environ['ORACLE_HOME']='$ORACLE_BASE/product/instantclient/$ORACLE_VERSION'
    os.environ['DYLD_LIBRARY_PATH']='$ORACLE_HOME/lib'
    os.environ['OCI_DIR']='$DYLD_LIBRARY_PATH'
    os.environ['TNS_ADMIN']='$ORACLE_BASE/network/admin'


    Connection_String ='username/password@(DESCRIPTION =(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCPS)(HOST=orclconsapp.vci.map.com)(PORT=1587)))(CONNECT_DATA = (SERVICE_NAME=cons_app)))'

    connection = cx_Oracle.connect(Connection_String)


    cursor = connection.cursor()
    cursor.execute("""select to_char(sysdate,'mm/dd/yyyy') from dual""")
    for result in cursor:
        print(result)
代码语言:javascript
复制
**Its failing with below error**

Traceback (most recent call last):
File "/Users/machild/Documents/oracle_conn.py", line 16, in <module>
connection = cx_Oracle.connect(Connection_String)
cx_Oracle.DatabaseError: ORA-28759: failure to open file


I think it would need a wallet but not sure what exactly goes in wallet if we want to connect from external server( not where database is running). Any ideas?        
EN

回答 1

Stack Overflow用户

发布于 2021-04-16 01:39:25

我也经历过ORA-28759。我使用Python/SQLAlchemy与一个需要TCPS的Oracle数据库进行通信。我的DBA给了我一个可信的证书,我不得不把它存储在钱包里。

tl;dr:我使用okapi创建了一个钱包文件,将我的证书导入到那个钱包中,然后编辑sqlnet.ora以包含钱包的位置。我使用TNS_ADMIN环境变量指向sqlnet.ora。(基本上是克里斯托弗·琼斯( Christopher )的建议。)由于您已经有了一个现有的TNS_ADMIN,所以您可能需要在创建钱包之后编辑其中的sqlnet.ora以指向钱包。

下面是我的详细情况,包括我如何创造一个钱包。我所做的工作结合了这些来源的信息:

  1. https://docs.oracle.com/cd/E11882_01/network.112/e40393/asoappf.htm#ASOAG9831

  1. https://docs.oracle.com/en/database/oracle/oracle-database/18/dbseg/configuring-authentication.html#GUID-3EA07020-A9F3-4FF9-9518-E1AEA3BDDBBE

  1. https://cx-oracle.readthedocs.io/en/latest/user_guide/initialization.html#optnetfiles

注意:下面的细节是基于Windows的!

我要做的第一件事就是创造一个新钱包。来自docs.oracle.com的第一个URL描述了为我工作的命令:orapki。这个工具来自我在本地安装的Oracle XE18c (Windows)。

为了创造一个钱包,我输入了:

代码语言:javascript
复制
orapki wallet -nologo create -wallet C:\Users\rick\wallet -auto_login

这创建了一个文件夹C:\Users\rick\wallet,其中包含四个文件: cwallet.sso、cwallet.sso.lck、ewallet.p12、ewallet.p12.lck。cwallet.sso是‘自动登录钱包’,ewallet.p12是PKCS#12钱包。(更多细节见文档。)注意:-auto_login创建了一个不需要密码打开的钱包,尽管我被提示输入一个密码。我编了一个丢弃密码,不用再用了.

我试图连接的Oracle数据库要求我的钱包包含一个受信任的证书。orapki-trusted_cert开关,我可以把它导入到钱包里。

代码语言:javascript
复制
orapki wallet -nologo add -wallet \Users\rick\wallet -cert \Users\rick\oracle-ca.pem -trusted_cert

我能够确认钱包中包含证书,使用:

代码语言:javascript
复制
orapki wallet -nologo display -wallet \Users\rick\wallet -complete

我的产出:

代码语言:javascript
复制
C:\Users\rick>orapki wallet -nologo display -wallet \Users\rick\wallet -complete
Requested Certificates:
User Certificates:
Trusted Certificates:
Subject:        CN=Redacted,OU=Oracle,O=Amazon Web Services\, Inc.,ST=Washington,L=Seattle,C=US
Issuer:         CN=Redacted,OU=Oracle,O=Amazon Web Services\, Inc.,ST=Washington,L=Seattle,C=US
Serial Number:  AA:C7:REDACTED:AE:75
Key Length      1024
MD5 digest:     66:EC:REDACTED:9F:0D
SHA digest:     D4:0D:REDACTED:3C:50:91

要使用这个钱包,你必须指着它。对我来说,这包括两个步骤。第一步是创建指向钱包的sqlnet.ora文件。第二步是将TNS_ADMIN环境变量设置为包含sqlnet.ora文件的目录。在我的例子中,sqlnet.ora和钱包文件都在同一个目录中。

来自docs.oracle.com的第二个URL显示了如何在sqlnet.ora文件中指定钱包位置(目录)。我的sqlnet.ora文件包含:

代码语言:javascript
复制
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=C:\Users\rick\wallet)))
SSL_CLIENT_AUTHENTICATION=FALSE

我从Oracle服务器的网络/管理目录中获得了我的sqlnet.ora。我把这个文件复制到和我的钱包相同的目录中,然后编辑它。为了更好的衡量,我还将tnsnames.ora文件从网络/管理复制到钱包目录中,尽管我不需要编辑这个文件。

最后,cx_Oracle文档(第三个URL)提供了最后一个细节:如何将cx_Oracle指向这个钱包。据我理解,您将cx_Oracle指向包含sqlnet.ora的目录,sqlnet.ora指向钱包目录。

文档说要使用config_dir命名的参数到cx_Oracle.init_oracle_client()来指定sqlnet.ora文件的位置,但是由于我使用的是SQLAlchemy,所以我没有直接调用它。但是,文档指出,在默认情况下,驱动程序将在一些标准位置查找sqlnet.ora文件,包括由TNS_ADMIN环境变量指定的目录。

我使用以下方法设置TNS_ADMIN

代码语言:javascript
复制
set TNS_ADMIN=C:\Users\rick\wallet

然后,当我运行我的Python程序时,它成功了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66094119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档