[英]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文件,以及該如何處理。 第一個很簡單,第二個可能需要一些額外的信息,但是我會盡力回答。
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文件的內容。
這取決於情況,在這里您的問題有點含糊。 在所有情況下,目的都是為了進行身份驗證 :客戶端需要驗證與正確的服務器通信,並且可選地,服務器需要驗證與正確的客戶端通信。 這涉及三點信息和大量數學運算。
根據應用程序的不同,您收到的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中執行此操作,因此我不知道您必須傳遞的確切命令。 您需要尋找的是一種告訴您這些情況的方法:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.