簡體   English   中英

使從RPGLE調用的AS400 Java應用程序信任.PFX證書

[英]getting an AS400 java application called from RPGLE to trust a .PFX certificate

我整天都在努力,只是在猜測該怎么做。 似乎知道此功能如何工作的人都假設其他所有人都知道他們在說什么。 他們會說諸如使用實用程序ABC生成DEF之類的內容,但是假設您知道ABC是什么,如何使用它以及完成后如何使用DEF。 首先我要說的是我本質上是AS400 RPG編碼器,但是可以用Java做一些事情。 我猜足以危險。 從技術上講,我仍然不太了解什么是信任庫或密鑰庫。

基本上,我開發了一個簡單的AS400 Java應用程序,該應用程序基本上只是調用一些HTTP方法來將事務發送給外部方。 直接從RPGLE程序調用此應用程序。 這一直很好,但是現在他們決定使用HTTPS。 客戶端向我發送了一個.PFX文件,其中包含一些內容,這些文件是他們在AS400上使用稱為數字證書管理器的實用程序創建密鑰時產生的。 我發現需要收集足夠的信息,因此我必須在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 KeyStore。 廣義上講,這些是保存相同類型數據的等效方法,您只需要從一個導出到另一個即可。 預先執行此操作比在運行時嘗試執行此操作容易。 引用此答案

keytool -importkeystore \
        -srckeystore mypfxfile.pfx -srcstoretype pkcs12 \
        -destkeystore clientcert.jks -deststoretype JKS

JDK中包含Keytool。 一路上會要求輸入一些密碼。 您可以使用keytool -list -keystore file.jks命令顯示JKS文件的內容。

我應該怎么處理這些東西?

這取決於情況,在這里您的問題有點含糊。 在所有情況下,目的都是為了進行身份驗證 :客戶端需要驗證與正確的服務器通信,並且可選地,服務器需要驗證與正確的客戶端通信。 這涉及三點信息和大量數學運算。

  • 私鑰公鑰 (以及一些數學運算,通常為RSA算法)可用來創建鎖和鑰匙系統。 您將私鑰保留給自己,並與需要它的任何人共享公鑰。 這些在身份驗證中的使用方式是私鑰用於數學上可以通過公鑰驗證的聲明。 這樣算來,實際上就不可能偽造這一主張。 因此,如果數學計算出結果,您可以確保與您聊天的人持有私鑰。 簡而言之,這是數字簽名。
  • 證書會嵌入一​​個公共密鑰並向其中添加一堆信息(密鑰基本上只是一個巨大的質數,因此它本身並沒有太多用處)。 添加的信息包括密鑰持有者的身份以及保證證書有效性的發行人的身份,所有這些均用數字簽名密封。

根據應用程序的不同,您收到的PFX文件可能只包含一個證書,也可能包含一個證書和相應的私鑰(或兩者)。

keytool -list的輸出將顯示任意數量的trustedCertEntry記錄,這些是沒有專用私鑰的證書,並且可能包含privateKeyEntry ,這是一個同時包含證書及其私鑰的記錄。 注意任何私鑰條目的alias

客戶端驗證服務器

創建HTTPS連接時,服務器會向客戶端提供證書,並提供證明服務器擁有與證書中嵌入的公鑰相對應的私鑰。 客戶端將必須決定是信任服務器的身份還是中止連接。 它通過數學方式檢查服務器提供的證書與預共享的,受信任的證書(稱為信任存儲)列表的關系( cacerts是常見的文件系統名稱)。

您的操作系統和Web瀏覽器均附帶默認的信任庫。 此機制位於瀏覽器中的掛鎖圖標的后面。

在您的情況下,您要連接的端點很可能使用默認信任庫中不存在的證書,因此您必須提供自己的[信任庫]。

假設AS / 400上的Java與Windows和Linux上的Java的工作方式相同,您可以(引用此答案 )傳遞一個名為javax.net.ssl.trustStore的Java系統屬性,該屬性包含JKS密鑰庫的文件系統路徑,該文件系統路徑包含受信任的簽署人的證書。

一種替代方法是命名JKS文件jssecacerts並將其放在您的jre/lib/security目錄中,但是請記住,它現在會影響使用該JVM安裝運行的所有 Java進程,而不僅僅是您正在執行的Java進程。這項工作。

服務器驗證客戶端

它在網絡上使用不多,但是HTTPS可以選擇進行雙向證書驗證。 這意味着在客戶端以上述方式對服務器進行身份驗證之后,服務器現在將對客戶端進行身份驗證。 這是完全相同的過程,但方向相反。

在專有SOAP服務中它更為常見,因此在這里可能就是這種情況。 您的問題並沒有真正使我明白。

這意味着您的應用程序必須向服務器提供證書,並且它必須擁有與證書中嵌入的公鑰相對應的私鑰。 可悲的是,我自己從來不需要在Java中執行此操作,因此我不知道您必須傳遞的確切命令。 您需要尋找的是一種告訴您這些情況的方法:

  • 要使用的JKS密鑰庫文件(及其密碼)
  • 使用該JKS中的哪個密鑰別名(及其密碼)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM