安全连接上出现AS400FileRecordDescription.retrieveRecordFormat错误

时间:2018-10-16 21:08:41

标签: ibm-midrange jtopen

下面的Java程序的主要目的是使用jtopen(版本9.6)中的AS400FileRecordDescription类检索iseries上物理文件的记录格式。通过调用此类中的retrieveRecordFormat()方法来实现。

如果连接是不安全的连接(连接URL不包含secure = true参数),则该程序可以正常运行。但是在安全连接下(连接URL包含secure = true参数),它失败,并显示以下错误:“ javax.net.ssl.SSLHandshakeException:握手期间远程主机关闭了连接”。知道我在做什么错吗?

import java.sql.Connection;
import java.sql.DriverManager;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400FileRecordDescription;
import com.ibm.as400.access.AS400JDBCConnection;
import com.ibm.as400.access.RecordFormat;

public class TestIseriesSecureConnection {

    public static void main(String[] args) {

        Connection conn = null;
        AS400 system = null;
        try {
            // get standard jdbc connection
            Class.forName("com.ibm.as400.access.AS400JDBCDriver");
            // notice the secure=true parameter, if that is removed, the program works fine.
            conn = DriverManager.getConnection("jdbc:as400://myiseries;secure=true;naming=system;errors=full;prompt=false;libraries=*LIBL;timeFormat=iso;dateFormat=iso;dateSeparator=-", "myuser", "mypassword");

            // cast connection into AS400 jdbc connection class to get the AS400 object
            AS400JDBCConnection as400Conn = (AS400JDBCConnection) conn;
            system = as400Conn.getSystem();

            // get the record format of a file on iseries
            RecordFormat recordFormats[] = null;
            AS400FileRecordDescription fileRecordDescription = new AS400FileRecordDescription(system, "/QSYS.LIB/%LIBL%.LIB/MYFILE.FILE");

            // This is where it error out if the connection is a secure connection 
            recordFormats = fileRecordDescription.retrieveRecordFormat();

            for (int myIx = 0; myIx < recordFormats.length; myIx++) {
                System.out.println(recordFormats[myIx].toString());
            }
            conn.close();
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
        finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        System.exit(0);
    }

}

2 个答案:

答案 0 :(得分:0)

什么版本的IBM i OS?

什么版本的Java?

在IBM i 7.1上常见的情况是,它不支持最新版本的TLS和密码。

答案 1 :(得分:0)

在IBM的支持下,我们经过反复交流,终于发现问题是由于使用了DDM / DRDA服务来处理请求的restoreRecordFormat方法引起的。我们已经在多台diff主机服务器上安装了ssl cert,但没有在DDM / DRDA上安装。这就解释了为什么其他类型的请求在ssl下仍然可以正常工作。因此,一旦将证书安装在DDM / DRDA主机服务器上,即使使用普通的旧AS400对象,该程序也可以正常工作。