그래서 저는 sslServer와 sslClient를 가지고 있습니다. 인증서를 생성하여 keyStore에 저장하고 keyStore를 서버의 기본 디렉토리에 배치합니다. 그런 다음이 keyStore를 clients 디렉토리에 복사합니다. 안전 한가? 누군가 내 클라이언트의 복사본을 다운로드하고 인증서/keyStore를 가져 와서 중간 공격에서 사람을 수행 할 수 없었습니까? 이 인증서 공유 문제를 어떻게 해결할 수 있습니까? 그것은 여기에 도움이 몇 가지 코드 인 경우 :Java SSLSockets : 클라이언트와 서버에서 동일한 keyStore가 안전한가요?
서버 :
/*This is a hidden class*/
class Server implements Runnable{
public Server(){
}
@Override
public void run() {
DataInputStream stringGetter = null;
try{
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
char[] password = "iamakeystore".toCharArray();
ks.load(null, password);
System.setProperty("javax.net.ssl.keyStore", "keyStore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "iamakeystore");
// Store away the keystore.
//FileOutputStream fos = new FileOutputStream("keyStore.jks");
//ks.store(fos, password);
//fos.close();
}catch(Exception e){
}
SSLSocket sslsocket = null;
try {
SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =
(SSLServerSocket) sslserversocketfactory.createServerSocket(31030);
sslserversocket.setEnabledCipherSuites(sslserversocket.getSupportedCipherSuites());
sslsocket = (SSLSocket) sslserversocket.accept();
stringGetter= new DataInputStream(sslsocket.getInputStream());
boolean done=false;
byte input=-1;
while(!done){
input=stringGetter.readByte();
switch(input){
case 1:{
}
}
}
sslsocket.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(stringGetter!=null){
try {
stringGetter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(sslsocket!=null){
try {
sslsocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
클라이언트 :
private void login(){
System.setProperty("javax.net.ssl.keyStore", "keyStore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "iamakeystore");
SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket s = null;
DataOutputStream stringSender = null;
try {
s=(SSLSocket) ssf.createSocket("127.0.0.1", 31030);
s.setEnabledCipherSuites(s.getSupportedCipherSuites());
s.startHandshake();
stringSender= new DataOutputStream(s.getOutputStream());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stringSender.writeByte(1);
stringSender.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(s!=null){
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
's.setEnabledCipherSuites (s.getSupportedCipherSuites())': 그렇게하지 마십시오. 안전하지 않기 때문에 기본적으로 사용하도록 설정되지 않은 것을 포함하여 지원되는 모든 암호화 제품군을 사용할 수 있습니다. – Bruno
@ 브루노 어떤 대안이 있습니까? 대신 무엇을 사용할 수 있습니까? 협조 해 주셔서 감사합니다. 자습서 나 다른 것을 가르쳐 주시겠습니까? –
기본적으로 사용하도록 설정된 암호를 사용합니다 (즉, 사용 가능한 암호화 제품군을 변경하지 않음). 사용 가능 또는 사용 불가능으로 설정하려는 암호 스위트를 알고있는 경우에만 사용 가능한 암호 세트를 변경해야합니다. – Bruno