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:
作为IBM i平台安全性相关的组件,IBM i数字证书管理器——DCM用于SSL证书的创建,配置,管理等工作。待DCM创建的SSL证书之后,我们可以将SSL证书与相应的主机服务器关联,这样主机服务器就获取了SSL证书。之后,IBM Java Toolbox for i就可以通过与主机服务器的SSL端口通信,保证数据传输的安全性。有关DCM的更多知识,请参见IBM i信息中心的DCM。
图 2. IBM i 数字证书管理器的Web访问入口
图 3. IBM i 数字证书管理器“Create Certificate”向导
图 4. SSL证书关联ProgramCall主机服务器
表 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 |
QUERYCUSTINFO.PGM与QUERYCUSTACCOUNT.PGM,分别演示IBM Java Toolbox for i如何以SSL与NON-SSL的方式调用样例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);
// 构造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 安全性的角度,重点阐述了IBM Java Toolbox for i提供的SSL数据加密服务,目标是针对那些具有安全需求的应用程序。
UID
ibm11145104