无法连接到 SSL 端口 63149 上的 Lotus Notes DIIOP

Cannot connect to Lotus Notes DIIOP on SSL port 63149

我工作的公司创建的软件可以对各种来源进行爬网和索引以供搜索使用,在这种情况下,我们完全无法尝试通过 SSL 连接到 Lotus Notes。这是 classic 案例 "it worked in dev, but failed in 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 文件,但是经过双重和三次检查后它在 class 路径中就好了(事实上它在开发环境中工作)我们确信它正在加载。

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

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

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

我还检查了我们是否正在通过防火墙到达远程机器,RedHat 机器上的 TCPDUMP 清楚地显示我们在远程 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)

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

DEBUG_SSL_HANDSHAKE=1 
DEBUG_SSL_CIPHERS=1 
DEBUG_SSL_ALL=1

可以将最后的设置推送到 2 或 3 以获得更详细的信息。

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

好吧,答案很明确 crystal 但不是我一直在积极寻找的东西。

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

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