IBM Support

IBM Java Toolbox for i 实现安全访问IBM i

Technical Blog Post


Abstract

IBM Java Toolbox for i 实现安全访问IBM i

Body

作为一组面向IBM i平台的Java应用程序编程接口,IBM Java Toolbox for i主要用于访问IBM i的数据与资源。而数据与应用的安全性是从事IBM i应用开发者需要考虑的重要因素之一。通过依赖IBM Java Toolbox for i与IBM i之间的SSL通信,上层客户端应用程序可有效解决与IBM i服务器交互过程中的出现数据安全问题。本文的目标是结合SSL加密技术,IBM i相关的SSL证书管理组件——IBM i 数字证书管理器(或DCM),指导读者如何利用IBM Java Toolbox for i实现安全访问IBM i数据与资源的目标。

从结构划分上,文章分为5部分。本文先简单介绍SSL技术的基本概念与工作原理。在熟悉SSL的基础知识之后,第二部分将介绍针对IBM i平台SSL证书的数字证书管理器DCM。第三部分的目标是使用DCM创建一个SSL证书,并且与IBM Java Toolbox for i的ProgramCall主机服务器关联,这样,就保证了客户端应用程序可以安全地使用IBM Java Toolbox for i远程调用IBM i的涉及银行账户等敏感信息的RPG应用。在第四部分中,我们将结合示例说明如何使用IBM Java Toolbox for i以编程的方式实现与IBM i的SSL连接。最后一部分是总结。

为方便读者更好理解,我们针对样例应用程序的简单说明如下:

1. 基于普通方式调用RPG程序QUERYCUSTINFO.PGM根据客户身份证ID,查询数据库获取客户基本信息。
2. 基于SSL的方式调用RPG程序QUERYCUSTACCOUNT.PGM根据客户提供的身份证ID,查询数据库获取客户的银行账户信息。

之所以选择以SSL与NON-SSL两种对比方式举例,是希望读者根据自身需要选择是否SSL加密通信,毕竟安全性通常是以牺牲性能为代价的。


SSL工作原理


Secure Sockets Layer(或SSL),是为网络通信提供安全及数据完整性的一种安全协议。SSL协议提供的服务主要有:

(1) 认证用户和服务器,确保数据发送到正确的客户机和服务器;

(2) 加密数据以防止数据中途被窃取; 

(3)维护数据的完整性,确保数据在传输过程中不被改变。

SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。SSL证书使得客户端浏览器和Web服务器之间建立了一条SSL安全通道。

一份 SSL 证书包括一个公共密钥和一个私用密钥。公钥用于加密信息,私钥用于解密信息。

有关SSL的工作原理,参见图1:

图 1. SSL的工作原理 
 图像使用DCM创建SSL证书
DCM相关基础知识

作为IBM i平台安全性相关的组件,IBM i数字证书管理器——DCM用于SSL证书的创建,配置,管理等工作。待DCM创建的SSL证书之后,我们可以将SSL证书与相应的主机服务器关联,这样主机服务器就获取了SSL证书。之后,IBM Java Toolbox for i就可以通过与主机服务器的SSL端口通信,保证数据传输的安全性。有关DCM的更多知识,请参见IBM i信息中心的DCM。
除了本身提供相关的API之外,DCM还提供一个基于Web的控制台,方便用户使用。DCM的Web控制台,作为IBM i系统管理的一部分,被集成在IBM System Director Navigator for i,如图2所示。
图 2. IBM i 数字证书管理器的Web访问入口
 
 图像 
DCM创建SSL证书并关联ProgramCall主机服务器
接下来,我们利用DCM提供的Web控制台,创建数字证书,并且将其关联至ProgramCall主机服务器。这样,ProgramCall主机服务器就获取了一份SSL证书。
通过点击图2 IBM i Tasks对应的链接,我们就可以访问IBM i 数字证书管理器Web控制台。之后,我们点击“Create Certificate”向导创建SSL证书,如图3所示。这里我们创建一个名为IBMCer的证书。填充对应的字段,点击“Continue”按钮。
图 3. IBM i 数字证书管理器“Create Certificate”向导
 图像 
需要说明的是,这里我们选择的证书颁发机构(CA)是IBM内部,用户也可根据“Create Certificate”向导的提示,选择权威第三方颁发机构,例如VeriSign等。
下一步,我们选择将创建的SSL证书IBMCer关联至ProgramCall主机服务器(其名称为Remote Command Server),如图4所示:
图 4. SSL证书关联ProgramCall主机服务器 
 
图像  
点击“Continue”按钮,如图5所示。这样,ProgramCall主机服务器成功地获取的SSL证书IBMCer。
图 5. ProgramCall主机服务器成功获取SSL证书。
 
图像  
 至此,我们成功地使用DCM创建一个SSL证书,并且与IBM Java Toolbox for i的ProgramCall主机服务器关联。这样就保证了客户端应用程序可以安全地使用IBM Java Toolbox for i远程调用IBM i的涉及银行账户等敏感信息的RPG应用。
 
IBM Java Toolbox for i安全访问IBM i
IBM Java Toolbox for i支持SSL加密的工作原理
在成功完成IBM i服务器端的SSL配置工作后,接下来,我们来介绍作为SSL通信另一方的IBM Java Toolbox for i的SSL工作原理与程序演示。有关IBM Java Toolbox for i的基础知识,请参见另一篇技术文档“Toolbox for Java 和 JTOpen”。
从编程的角度,IBM Java Toolbox for i依赖底层Java API提供的Java Secure Socket Extension (JSSE)编程接口实现与IBM i 服务器的SSL连接与数据加密服务。
作为提供SSL服务的入口类,SecureAS400一方面扩展了作为服务访问点角色的AS400类,另一方面封装了JSSE编程框架提供基于SSL连接的数据加密服务。
因此,在IBM i相应的主机服务器端配置完SSL服务之后,如果客户端使用AS400类,则连接的是非SSL端口。而如果使用SecureAS400类,则连接的是SSL端口,通信双方提供的是基于SSL的连接与数据加密服务。
有关IBM i各主机服务器与端口映射关系,如表1所示: 

1. IBM i各主机服务器与端口映射关系

IBM i各主机服务器

NON-SSL端口

SSL端口

Central server

8470

9470

Database server

8471

9471

Data queue server

8472

9472

File server

8473

9473

Network print server

8474

9474

Remote command and program call server

8475

9475

Signon server

8476

9476

 

分别以SSL与NON-SSL两种方式调用样例RPG程序
 
在熟悉IBM Java Toolbox for i关于SSL支持相关的工作原理之后,我们结合样例RPG
QUERYCUSTINFO.PGM与QUERYCUSTACCOUNT.PGM,分别演示IBM Java Toolbox for i如何以SSL与NON-SSL的方式调用样例RPG程序。
首先,我们演示如何如何以NON-SSL方式(即普通方式)远程调用RPG程序QUERYCUSTINFO.PGM,如清单1所示。
 
清单 1. ProgramCall以NON-SSL方式远程调用IBM i RPG的程序片段。
// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400("mySystem.myCompany.com", "myUser", "myPassword");
// 构造ProgramCall,准备远程调用IBM i服务器端RPG程序QUERYCUSTINFO,获取客户信息。
ProgramCall pgm = new ProgramCall(sys);
pgm.setProgram("/QSYS.LIB/RPGEXAMPLE.LIB/QUERYCUSTINFO.PGM");
// 构造ProgramParameter,设置远程调用RPG程序所需的参数。Input参数类型接受输入参数。
ProgramParameter[] parmList = new ProgramParameter[2];
// 第一个参数类型为Input,输入客户的ID
parmList[0] = new ProgramParameter(customerID);
// 第二个参数类型为Output,返回客户的姓名
parmList[1] = new ProgramParameter(10);
// 将ProgramCall与ProgramParameter关联。
pgm.setParameterList(parmList);
// 调用相应的run方法,从而远程调用IBM i服务器端RPG程序。
if (pgm.run()){
   // 程序结果返回给ProgramParameter的Output参数输出。
   byte[] data = parmList[1].getOutputData();
   // 调用IBM Java Toolbox for i支持转码的相关帮助类,获取用户的姓名。
   String javaText = (String) textConverter.toObject(data);
} else {
   // 如果调用失败,则将错误消息封装成相关Java类AS400Message。
   AS400Message[] messageList = pgm.getMessageList();
   // ... 处理消息列表
}
// 作为好的编程习惯,释放连接
sys.disconnectService(AS400.COMMAND); 
 
这里,IBM Java Toolbox for i与ProgramCall主机服务器对应的NON-SSL接口8475通信。要获取SSL连接,IBM Java Toolbox for i需要与ProgramCall主机服务器对应的SSL接口9475通信。为此,我们使用SecureAS400类。
接下来,我们演示如何如何以SSL方式远程调用RPG程序QUERYCUSTACCOUNT.PGM,如清单2所示: 
 
清单 2. ProgramCall以SSL方式远程调用IBM i RPG的程序片段
// 构造SecureAS400对象,建立Java应用程序与IBM i服务器的SSL连接。
SecureAS400 sslSys = new SecureAS400("mySystem.myCompany.com", "myUser", "myPassword");
// 构造ProgramCall,准备远程调用IBM i服务器端RPG程序QUERYCUSTACCOUNT,获取客户银行卡信息。
ProgramCall pgm = new ProgramCall(sslSys);
pgm.setProgram("/QSYS.LIB/RPGEXAMPLE.LIB/QUERYCUSTACCOUNT.PGM");
// 构造ProgramParameter,设置远程调用RPG程序所需的参数。Input参数类型接受输入参数。
ProgramParameter[] parmList = new ProgramParameter[3];
// 第一个参数类型为Input,输入客户的ID
parmList[0] = new ProgramParameter(customerID);
// 第二个参数类型为Input,输入客户的密码
parmList[1] = new ProgramParameter(customerPWD);
// 第三个参数类型为Output,返回客户的银行帐号
parmList[2] = new ProgramParameter(20);
// 将ProgramCall与ProgramParameter关联。
pgm.setParameterList(parmList);
// 调用相应的run方法,从而远程调用IBM i服务器端RPG程序。
if (pgm.run()){
   // 程序结果返回给ProgramParameter的Output参数输出。
   byte[] data = parmList[1].getOutputData();
   // 调用IBM Java Toolbox for i支持转码的相关帮助类,获取用户银行卡号。
   String javaText = (String) textConverter.toObject(data);
} else {
   // 如果调用失败,则将错误消息封装成相关Java类AS400Message。
   AS400Message[] messageList = pgm.getMessageList();
   // ... 处理消息列表
}
// 作为好的编程习惯,释放连接
sslSys.disconnectService(AS400.COMMAND);
至此,我们分别从IBM i服务器与客户端的角度,阐述了如何使用DCM配置基于IBM i的SSL证书,以及利用IBM Java Toolbox for i与IBM i建立SSL连接,安全访问IBM i平台的敏感程序与应用。

总结
本文主要从IBM i 安全性的角度,重点阐述了IBM Java Toolbox for i提供的SSL数据加密服务,目标是针对那些具有安全需求的应用程序。
 
作者  pi guang ming 
 
 
 

[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":"","Line of Business":{"code":"LOB57","label":"Power"}}]

UID

ibm11145104