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
有了這個?
好的,我做到了,但似乎有問題。我正在運行兩個有一個ServerSocket和一個Socket的線程。我在ServerSocket上使用了正確的密鑰庫文件,在Socket上使用了空白文件,但仍然能夠連接。連接不應該被拒絕? – LanguagesNamedAfterCofee
@LanguagesNamedAfterCofee如果'SSLServerSocket'設置爲需要客戶端身份驗證,'SSLSocket'只需要一個密鑰庫。它始終需要一個信任庫。我認爲您需要仔細閱讀[JSSE參考指南](http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html)。 – EJP
謝謝,我會給它一個很好的閱讀。 – LanguagesNamedAfterCofee