获取从RPGLE调用的AS400 java应用程序以信任.PFX证书

获取从RPGLE调用的AS400 java应用程序以信任.PFX证书,java,ssl,ibm-midrange,Java,Ssl,Ibm Midrange,我整天都在做这件事,我只是在猜测该怎么办。似乎知道此功能如何工作的人都认为其他人都知道他们在谈论什么。他们会说使用实用工具ABC生成DEF,但假设您知道ABC是什么,如何使用它,以及完成后如何处理DEF。让我先说一下,我的内心是一个AS400 RPG编码器,但可以用Java做一些事情。我想足够危险了。我仍然不太明白什么是信任存储,或者说密钥存储在技术上是什么 基本上,我开发了一个简单的AS400 java应用程序,它基本上只调用一些HTTP方法来向外部方发送事务。此应用程序直接从RPGLE程序调

我整天都在做这件事,我只是在猜测该怎么办。似乎知道此功能如何工作的人都认为其他人都知道他们在谈论什么。他们会说使用实用工具ABC生成DEF,但假设您知道ABC是什么,如何使用它,以及完成后如何处理DEF。让我先说一下,我的内心是一个AS400 RPG编码器,但可以用Java做一些事情。我想足够危险了。我仍然不太明白什么是信任存储,或者说密钥存储在技术上是什么

基本上,我开发了一个简单的AS400 java应用程序,它基本上只调用一些HTTP方法来向外部方发送事务。此应用程序直接从RPGLE程序调用。这一直运行良好,但现在他们决定使用HTTPS。客户机向我发送了一个.PFX文件,其中包含了他们在AS400上使用名为digital certificate manager的实用程序创建密钥时的一些内容。我已经找到足够的信息来收集,我必须在IFS中的根应用程序目录中有一个SSL属性文件,而作业正在查看该属性文件,它似乎具有正确的参数。我现在很难理解的是,如何让证书信任应用程序。我不确定是否需要.PFX文件存在于应用程序的IFS根目录中,或者是否必须创建信任存储/密钥存储,或者是否需要SSL属性文件之外的任何内容?我发现所有问题的答案都是肯定的,这取决于你问谁。有些答案会引导你做一些详尽的事情,达到某一点,结果什么都没有发生。这更像是一种发泄。我几乎得出结论,这是不可能的

值得一提的是,下面是我用于仅使用HTTP连接到服务的代码。我一直在寻找一个简单的循序渐进的过程来解释在AS400上成功进行HTTPS握手需要什么。我没有足够的信息来知道我是否需要从客户那里获得更多信息,或者我是否有足够的信息来让它独立工作

HttpClient m_HttpClient = null; 
PostMethod m_PostMthd = null;
SimpleHttpConnectionManager m_simpleHttpConMnger = new 
SimpleHttpConnectionManager();
int timeoutInMilliseconds = 10000;
m_PostMthd = new PostMethod(urlEndpoint);
m_HttpClient = new HttpClient(m_simpleHttpConMnger);
HttpConnectionManagerParams lhttpConMnger = 
m_simpleHttpConMnger.getParams();
lhttpConMnger.setConnectionTimeout(timeoutInMilliseconds);
lhttpConMnger.setSoTimeout(timeoutInMilliseconds);

m_PostMthd.setRequestHeader("SOAPAction",SOAPAction);
m_PostMthd.setRequestHeader("Content-Type","text/xml; charset=UTF-8");  


m_PostMthd.setRequestEntity(new StringRequestEntity(inputMsg));

int l_status = m_HttpClient.executeMethod(m_PostMthd);
System.out.println("EXECUTION STATUS : " + l_status+"\n");

InputStream is = m_PostMthd.getResponseBodyAsStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuilder response = new StringBuilder();
while ((line = rd.readLine()) != null)
    {
    response.append(line);
    response.append('\r');
    }

    rd.close();
    return response.toString();

我认为这里有两个独立的问题:如何在Java中使用PFX文件,以及如何处理它。第一个问题相当直截了当,第二个问题可能需要一些额外的信息,但我会尽我所能回答

在Java中处理PFX PFX是一种容器文件格式,可以包含与SSL/TLS和加密相关的一系列不同类型的数据。Java有自己的容器格式,称为JKS密钥库。广义地说,这些是保存相同类型数据的等效方法,您只需要从一种导出到另一种。事先做这件事比在运行时试着做要容易得多。引用:

JDK附带了Keytool。一路上它会询问一些密码。您可以使用
keytool-list-keystore file.jks
命令来显示 JKS文件

我该怎么处理这些东西? 这取决于情况,这里你的问题有点模糊。在所有情况下,目的都是身份验证:客户端需要验证它是否与正确的服务器进行了对话,并且服务器还需要验证它是否与正确的客户端进行了对话。这涉及到三位信息和大量数学运算

  • 私钥公钥(以及一些数学运算,通常是RSA算法)用于创建锁和密钥系统。您将私钥留给自己,并与任何需要它的人共享公钥。在身份验证中使用这些方法的方式是,私钥用于数学上提出可以用公钥验证的声明。数学是这样的,几乎不可能伪造这种说法;因此,如果数学证明是正确的,那么您可以确定与您交谈的人持有私钥。简而言之,这就是数字签名
  • 证书嵌入公钥并向其添加一组信息(密钥基本上只是一个巨大的素数,因此它本身没有多大用处)。所添加的信息包括密钥持有人的身份,以及证明证书有效性的发行人的身份,所有这些都用数字签名密封
根据应用程序的不同,您收到的PFX文件可能只包含一个证书,也可能包含一个证书和相应的私钥(或两者都包含)

keytool-list
的输出将显示任意数量的
trustedCertEntry
记录,这些是没有私钥可用的证书,它可能包括一个
privateKeyEntry
,这是一个同时存在证书及其私钥的记录。注意任何私钥条目的
别名

客户端对服务器进行身份验证 创建HTTPS连接时,服务器会向客户端提供一个证书,并证明服务器持有与证书中嵌入的公钥相对应的私钥。客户端必须决定是信任服务器的身份,还是中止连接。它通过将服务器提供的证书与名为信任存储的预共享可信证书列表进行数学检查来实现这一点(
cacerts
是一个常见的文件系统名称)

你的操作系统和网络浏览器都附带了默认的信任存储;此机制位于浏览器中挂锁图标的后面

在您的情况下,您连接到的端点可能使用默认信任存储中不存在的证书,因此您必须提供自己的[trust store]

假设Java在AS/400W上
keytool -importkeystore \
        -srckeystore mypfxfile.pfx -srcstoretype pkcs12 \
        -destkeystore clientcert.jks -deststoretype JKS