簡體   English   中英

將.key和.pem文件導入jks文件並在Java / Spring中使用

[英]Import .key and .pem file to jks file and use in Java/Spring

我從服務團隊獲得了以下密鑰/證書,通過SSL調用他們的API,我通過curl命令驗證了它。

1. QA.test.key
2. QA.test.pem 

CURL命令:

curl --key QA.test.key --cert ./QA.test.pem -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d '{"pan":"1234567890123456", "client": " Application Name "}' https://test-qa.abc.com/tokenize

現在,要通過https在Java中調用API,我是否需要執行以下操作?

  1. 創建一個自簽名的jks文件
  2. 將.key和.pem導入新的test.jks文件?
  3. 請執行下列操作

     public class TestApp { final static String KEYSTORE_PASSWORD = "testing"; static { System.setProperty("javax.net.ssl.trustStore", "src/main/resources/test.jks"); System.setProperty("javax.net.ssl.trustStorePassword", KEYSTORE_PASSWORD); System.setProperty("javax.net.ssl.keyStore", "src/main/resources/test.jks"); System.setProperty("javax.net.ssl.keyStorePassword", KEYSTORE_PASSWORD); } public static void main(String[] args) { SpringApplication.run(TestApp.class, args); } 

    }

我在使用jks文件時收到無效證書錯誤,創建jks文件並導入.key和.pem文件以使其正常工作的最佳方法是什么?

使用OpenSSL實用程序創建PKCS#12文件。 然后,您可以使用系統屬性將其指定為密鑰庫。

openssl pkcs12 -export -in QA.test.pem -inkey QA.test.key -out test.pkcs12

此命令將提示輸入密碼以加密新的PKCS#12文件。 它還可能會提示用於加密QA.test.key的密碼(如果有)。

javax.net.ssl.keyStore=test.pkcs12
javax.net.ssl.keyStorePassword=<whatever you entered when creating PKCS #12>
javax.net.ssl.keyStoreType=PKCS12

trustStore屬性是分開的; 它們會影響如何驗證服務器。 如果服務器使用由“真實”CA頒發的證書,則必須在Java運行時中提供必要的證書。 否則,您將不得不創建一個額外的密鑰庫,可以使用Java的keytool命令完成。

請注意, Java 9將使用PKCS#12文件作為默認密鑰庫類型。

創建jks的最簡單方法是使用GUI工具portecle http://portecle.sourceforge.net

創建JKS>導入密鑰/對

您還可以使用keytool和OpenSSL。 選中此項導入Java密鑰庫中的現有x509證書和私鑰以在ssl中使用

考慮您需要一個用於客戶端證書的keyStore和一個用於服務器證書的trustStore。 通常,客戶端證書也包含它們。 如果沒有,還包括JKS中的證書(同一文件,其他)

要調用和發送json,您可以使用httpsURLconnection

  HttpsURLConnection conn =       (HttpsURLConnection)url.openConnection();
  conn.setSSLSocketFactory(sslFactory);
  conn.setMethod("POST");
  conn.setDoOutput(true);
  conn.setRequestProperty("Content-Type","application/json"); 
  conn.connect();
  OutputStream os = conn.getOutputStream();
  os.write(jsonString.getBytes());
  os.flush();
  os.close(); 

要創建一個可以使用的socketFactory

  SSLContext sc = SSLContext.getDefault();
  SSLSocketFactory sslFactory =  sc.getSocketFactory();

這里有一個完整的示例(使用java代碼創建信任庫和密鑰庫) 如何在特定連接上使用不同的證書?

如果您在SSL連接添加時遇到問題

 System.setProperty("javax.net.debug", "ssl");

暫無
暫無

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

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