2012-09-11 48 views
0

我爲我的應用程序的admin實例和judge實例生成了自簽名證書。這些實例在不同的機器上運行,它們都有其他證書和自己的副本。我想這兩者之間進行溝通,我想知道我目前的做法是正確的方式做到這一點:我將能夠安全地與兩個實例溝通,正確SSL通信Java

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
Certificate certificate = cf.generateCertificate(new FileInputStream(...)); 

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
keyStore.load(null, "test".toCharArray()); 
keyStore.setCertificateEntry("admin", certificate); 

// Code omitted which repeats the above to set the judge certificate 

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init(keyStore); 
SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(null, tmf.getTrustManagers(), null); 

factory = ctx.getSocketFactory(); // Or #getServerSocketFactory() if admin and not judge 

有了這個?

回答

3

不需要。KeyManager需要一個帶密鑰條目的密鑰庫,而不是證書條目。只需使用JSSE設計人員預期的密鑰庫文件即可。

+0

好的,我做到了,但似乎有問題。我正在運行兩個有一個ServerSocket和一個Socket的線程。我在ServerSocket上使用了正確的密鑰庫文件,在Socket上使用了空白文件,但仍然能夠連接。連接不應該被拒絕? – LanguagesNamedAfterCofee

+0

@LanguagesNamedAfterCofee如果'SSLServerSocket'設置爲需要客戶端身份驗證,'SSLSocket'只需要一個密鑰庫。它始終需要一個信任庫。我認爲您需要仔細閱讀[JSSE參考指南](http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html)。 – EJP

+0

謝謝,我會給它一個很好的閱讀。 – LanguagesNamedAfterCofee