当前位置: 首页 > 知识库问答 >
问题:

Python 使用 TCPS 连接到 Oracle 数据库

子车鸿运
2023-03-14

尝试通过python的TCPS连接来连接Oracle数据库,但失败,出现ORA-28759:无法打开文件。

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

    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)

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

共有1个答案

冯宏放
2023-03-14

我也经历过ORA-28759。我使用Python/SQLAlchemy与一个需要TCPS的Oracle数据库进行对话。我的DBA给了我一个可信的证书,我必须将它存储在一个钱包中。

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

以下是我的情况的详细信息,包括我如何创建钱包。我所做的结合了这些来源的信息:

>

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

    https://docs . Oracle . com/en/database/Oracle/Oracle-database/18/db seg/configuring-authentic ation . html # GUID-3ea 07020-a9f 3-4ff 9-9518-E1 AEA 3 BD dbbe

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

    注意:以下详细信息基于Windows!

    我要做的第一件事就是创建一个新钱包。docs.oracle.com 的第一个URL描述了对我有用的命令:orapki。这个工具来自我本地安装的Oracle XE 18c(Windows)。

    要创建钱包,我键入:

    orapki wallet -nologo create -wallet C:\Users\rick\wallet -auto_login
    

    这创建了一个文件夹< code > C:\ Users \ Rick \ wallet ,其中包含四个文件:cwallet.sso、cwallet.sso.lck、ewallet.p12、ewallet.p12 . lck。cwallet . SSO是“自动登录钱包”,e wallet . p12是PKCS#12钱包。(进一步的细节在文档中。)注意:< code>-auto_login创建一个无需密码即可打开的钱包,但系统会提示我输入密码。我设置了一个一次性密码,并且不需要再次使用它。

    我试图连接的Oracle数据库要求我的钱包包含一个可信证书。< code>orapki具有< code>-trusted_cert开关,允许我将其导入到我的钱包中。

    orapki wallet -nologo add -wallet \Users\rick\wallet -cert \Users\rick\oracle-ca.pem -trusted_cert
    

    我能够通过以下方式确认钱包中包含证书:

    orapki wallet -nologo display -wallet \Users\rick\wallet -complete
    

    我的输出:

    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
    

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

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

    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指向这个wallet。根据我的理解,您将cx_Oracle指向包含< code>sqlnet.ora的目录,而< code>sqlnet.ora指向wallet目录。

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

    我使用以下方法设置TNS_ADMIN

    set TNS_ADMIN=C:\Users\rick\wallet
    

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

  •  类似资料:
    • 我正在尝试使用带有TCPS协议的内核与oracle数据库建立连接 asp.net。当我打开连接时,它给了我可执行文件 网络传输:解析钱包位置的SSL失败 TCPS:无效的SSL钱包(魔术版) 注意:当我尝试使用与TOD预言机相同的钱包位置连接databes时,它已成功连接。但不连接 with.net 核心。

    • 我无法连接到我的。这是代码: 我得到了这个信息: 在学校,这个例子是有效的。问题出在哪里??

    • 问题内容: 我正在尝试从Windows 7中的Node.js连接到Oracle数据库。这可能吗?我尚未找到适用于Windows的Node.js插件。有建议的解决方法吗?我猜至少还有一个人想要在Windows上使用Node.js,并且需要连接到Oracle。如果需要的话,我愿意接受简单的解决方法。谢谢您的帮助。 问题答案: 您需要直接从Node.js连接到oracle吗?您可以用另一种语言编写数据库

    • 主要内容:使用SQL * Plus连接到Oracle数据库服务器,使用SQL Developer连接到Oracle数据库服务器在本教程中,您将学习如何使用和SQL Developer 工具连接到Oracle数据库服务器。 使用SQL * Plus连接到Oracle数据库服务器 是安装Oracle数据库服务器或客户端时自动安装的交互式查询工具。 有一个命令行界面,允许您连接到Oracle数据库服务器并交互执行语句。 注意:如果有使用过MySQL或PostgreSQL,与MySQL中的mysql程序

    • 我无法使用R Studio连接到Oracle数据库。 下面是我为设置连接而执行的代码。 以上代码已成功执行。 我在下面的代码中得到一个错误。 错误. jcall(drv@jdrv,"Ljava/sql/Connection;","Connec",as.character(url)[1],:java.sql.SQLExctive:指定无效的Oracle URL 我的R版本是3.4.0

    • 我正在使用sqldeveloper查询数据库并将结果导出到csv文件。我每天都需要这个文件,所以考虑创建可以在windows任务调度器上调度的bat文件。我在研究它,发现我可以使用SQLcl运行脚本来导出查询数据。但不知何故,我无法连接它,它给了我一个错误“ORA-01017:无效的用户名/密码;登录被拒绝。以下是我的sql developer连接属性 这是我的命令行: 我安装了java开发工具包