我所工作的公司创建了用于搜索和索引各种源以供搜索使用的软件,在这种情况下,我们完全停留在尝试通过SSL连接到Lotus Notes上。这是“它在开发中工作但在产品中失败”的典型案例。
我们是开发人员和技术人员,而不是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机器上的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)
答案 0 :(得分:1)
好吧,答案显而易见,但不是我正在积极寻找的东西。
这不起作用的原因是第三方证书不是SHA-1证书,Lotus Notes 8.5.x仅支持SHA-1(as per this documentation)。
基本上,他们的证书永远不能以编程方式或其他方式用于SSL身份验证。
答案 1 :(得分:0)
您提到了DIIOP日志记录,但是如果SSL握手中的连接失败,那么diiop任务的内容可能不知道什么是错误的,因为它发生在堆栈中的较低级别。但是,可以在服务器上设置其他调试变量。
DEBUG_SSL_HANDSHAKE=1
DEBUG_SSL_CIPHERS=1
DEBUG_SSL_ALL=1
最后一项设置最多可以推送到2或3,以获取更多详细信息。
可能需要重新启动服务器(或可能是服务器的diiop任务)才能使设置生效。