【问题标题】:Cannot connect to Lotus Notes DIIOP on SSL port 63149无法在 SSL 端口 63149 上连接到 Lotus Notes DIIOP
【发布时间】:2016-09-05 12:03:43
【问题描述】:

我工作的公司创建了一种软件,该软件可以抓取和索引各种来源以供搜索使用,在这种情况下,我们完全坚持尝试通过 SSL 连接到 Lotus Notes。这是一个典型的“它在 dev 中工作,但在 prod 中失败”的典型案例。

我们是开发人员和技术人员,而不是 Lotus Notes 专家,这一事实使问题更加复杂。

基本上,我们有一个 Java 软件连接到 Lotus 以使用以下命令获取 DIIOP IOR 文本文件:

String ior = NotesFactory.getIOR(host, userIOR, pwdIOR);

现在,这是一个非 SSL 连接,需要用户名和密码才能连接。每次都能完美运行。

然后我们尝试使用这个来创建会话:

session = NotesFactory.createSessionWithIOR(ior, args, this.user, this.pwd);

在哪里:

args[0] = "-ORBEnableSSLSecurity";

连接时,我们始终收到此堆栈跟踪:

NotesException: Session closed due to communications failure
    at lotus.domino.cso.ORBCallback.make_error(Unknown Source)
    at lotus.priv.CORBA.iiop.Generic.make_error(Unknown Source)
    at lotus.priv.CORBA.portable.ObjectImpl._invoke(Unknown Source)
    at lotus.domino.corba._IObjectServerStub.createSession(Unknown Source)
    at lotus.domino.cso.Session.initSession(Unknown Source)
    at lotus.domino.cso.Session.<init>(Unknown Source)
    at lotus.domino.cso.Session.createSession(Unknown Source)
    at lotus.domino.NotesFactory.createSessionUP(Unknown Source)
    at lotus.domino.NotesFactory.createSessionWithIOR(Unknown Source)
[ ... ] 
Caused by: org.omg.CORBA.COMM_FAILURE: java.net.SocketException: Connection reset: Connection closed: Host: <redacted> Port: 63149  vmcid: 0x0  minor code: 1 completed: Maybe
    at lotus.priv.CORBA.iiop.IIOPConnection.purge_calls(Unknown Source)
    at lotus.priv.CORBA.iiop.ReaderThread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:154)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at lotus.priv.CORBA.iiop.Message.readFully(Unknown Source)
    at lotus.priv.CORBA.iiop.Message.createFromStream(Unknown Source)
    at lotus.priv.CORBA.iiop.IIOPInputStream.prefill(Unknown Source)
    at lotus.priv.CORBA.iiop.IIOPConnection.createInputStream(Unknown Source)
    ... 1 more

我知道最常见的原因是因为我们没有正确导入 TrustedCerts.class 文件,但是经过双重和三重检查后,它在类路径中就好了(事实上它在开发环境中工作)我们'确信它正在被加载。

我们知道如果我们禁用 SSL(也就是删除上述 arg),我们的代码将连接到非 SSL DIIOP 端口 63148 并且工作正常,但是项目要求所有数据都必须通过 SSL。

这最终让我想到了我的实际问题:我们如何让 Lotus 报告此连接失败的原因?

我尝试将 DIIOP 日志级别提高到 4,这显然应该显示所有传输,但是当我尝试连接时日志什么也没有显示。另外值得注意的是,DIIOP 服务肯定在正确的端口上运行。

我还检查了我们正在通过防火墙到达远程机器,并且我们的 RedHat 机器上的 TCPPDUMP 清楚地显示我们在远程 Lotus Notes 主机响应关闭连接之前建立了连接。

[Pertinent Information]
Application: Java
Library: NCSO.jar
Lotus Version: Domino 8.5.3 FP6 
Lotus Server: Windows Server 2008 Standard 
Ports: 63148 (non-SSL), and 63149 (SSL)

【问题讨论】:

  • 好吧,我更近了一步:我的客户端用于 TrustedCerts.class 文件的第三方 CA 证书似乎没有为我们提供有用的 TrustedCerts.class 文件。我们将尝试设置一个自签名证书,看看是否有任何变化

标签: java lotus-notes corba


【解决方案1】:

好的,答案很明确,但不是我积极寻找的。​​p>

这不起作用的原因是第三方证书不是 SHA-1 证书,而 Lotus Notes 8.5.x 仅支持 SHA-1 (as per this documentation)。

所以基本上他们的证书永远不能以编程方式或其他方式用于 SSL 身份验证。

【讨论】:

    【解决方案2】:

    您提到了 DIIOP 日志记录,但如果连接在 SSL 握手中失败,那么 diiop 任务的核心可能不知道出了什么问题,因为这发生在堆栈的较低级别。但是,可以在服务器上设置其他调试变量。

    DEBUG_SSL_HANDSHAKE=1 
    DEBUG_SSL_CIPHERS=1 
    DEBUG_SSL_ALL=1
    

    最后一个设置可以推到 2 或 3 以获得更多详细信息。

    可能需要重新启动服务器(或可能需要重新启动服务器的 diiop 任务)才能使设置生效。

    【讨论】:

    • 谢谢,我已经设置好了,但需要等待它们恢复到第三方证书并重新颁发 TrustedCerts.class 文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多