2015-09-07 18 views
0

我正在開發一個java項目,我應該在服務器端實現SSL-protokol。那麼,這是我第一次在我的應用程序中使用SSL,所以我讀了很多關於ssl/tls的信息,現在我想用java實現一些東西。我將使用JSSE API實現這個過程:使用java中的現有SSL密鑰/證書對(JSSE API)配置SSLContext

1)客戶端將連接到我

2)我要認證我的公鑰證書。我意味着我將用我的公鑰和RSA算法向客戶端發送一個公共密鑰和相應的證書

3)客戶端加密的密鑰,並將其發送給我

我已經私密鑰和證書保存在我的計算機上的密鑰庫中。所以我很猶豫如何從訪問他們我的Java應用程序。我不知道,哪些步驟要做到接觸它們,因爲這是我第一次處理這種東西

我將使用SSLEngine。所以,我應該使用此代碼首先初始化的SSLContext

// First initialize the key and trust material. 
    KeyStore ksKeys = KeyStore.getInstance("JKS"); 
    ksKeys.load(new FileInputStream("/.../myKey"), passphrase); 
    KeyStore ksTrust = KeyStore.getInstance("JKS"); 
    ksTrust.load(new FileInputStream("/../myCertificate"), passphrase); 

    sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 
    // We're ready for the engine. 
    SSLEngine engine = sslContext.createSSLengine(hostname, port); 

    // Use as client 
    engine.setUseClientMode(true); 

我在crypthography真新,這是我第一次編程這個東西。任何想法?

+0

也有私鑰在哪裏?爲什麼所有這些東西都不在密鑰庫中? – EJP

+0

我知道。我在這個領域非常新。我知道至少通往他們的路。 Shoud我使用InputStream來讀取它們,然後將它們加載到我的密鑰庫? – amitakCs

+0

這是正確的方式嗎? – amitakCs

回答

0

混淆之後,我做了大量的研究,並找到了解決方案。首先,我將描述情況,然後我會提供解決問題的步驟。就像我在Post中所說的那樣,我有私鑰(.key文件)和證書(.cer文件),我需要在我的java應用程序(使用ssl協議的服務器)中使用它們。因此,第一步要做的是創建一個名爲.jks的密鑰庫文件,其中包含證書/密鑰,以便我可以將它們用於基於Java的服務器。要做到這一步,我用這個鏈接http://blog.jgc.org/2011/06/importing-existing-ssl-keycertificate.html

現在描述的步驟,我該如何使用my.jks文件在上面貼的代碼?

嗯,這是一段代碼如何初始化您的SSLEngine:

char [] keyphrase="xxx".toCharArray(); 
char [] passphrase= "yyy".toCharArray(); 

// First initialize the key and trust material. 
KeyStore ksKeys = KeyStore.getInstance("JKS"); 
InputStream readStream = new FileInputStream(new File("/.../file.jks")); 
ks.load(readStream, passphrase); 
// create an factory for key-managers 
KeyManagerFactory =KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
kmf.init(ks, keyphrase); 
SSLContext sslContext = SSLContext.getInstance("TLS"); 
//initialize the ssl-context 
sslContext.init(kmf.getKeyManagers(),null,null); 
// We're ready for the engine. 
SSLEngine engine = sslContext.createSSLEngine(host, port); 
// Use as client 
engine.setUseClientMode(true); 
+0

正如我在答覆中所述,您不需要編寫代碼這個。您可以使用系統屬性來完成所有操作。 – EJP

+0

好的。是的我知道。這對我來說是新的。我已經使用這個鏈接http://stackoverflow.com/questions/5871279/java-ssl-and-cert-keystore瞭解它。我的第一個問題(在我的文章中)是如何獲取.jks文件,因爲我無法使用沒有.jks格式的材料。感謝您的建議 – amitakCs

1

在服務器上,無論是公共密鑰和其證書進入密鑰庫,與原來的私有密鑰一起,都在相同的別名。

如果證書是自簽名的,你需要從那裏出口到客戶的信任。

您不需要爲此編寫代碼。只需設置系統屬性:

javax.net.ssl.keyStore 
javax.net.ssl.keyStorePassword 
javax.net.ssl.trustStore 

視情況而定。

+0

證書不是自簽名的。那麼我應該把公鑰和證書發給客戶,以便它能識別我嗎? – amitakCs

+1

如果您再次仔細閱讀我的答案,您會看到我沒有指定任何必需的操作,如果您的證書不是自簽名的, – EJP