나는 자바에서 SSLServerSocket에 클래스 다음의 목표 C의 스트림 클래스 (CF와 NS 모두)를 사용하여 보안 소켓 연결을 설정하고 연결 (-9824) 실패했습니다.SSL 소켓 연결 : CFNetwork에서 SSLHandshake 자바 SSLServerSocket에
자바 SSLServerSocket에 코드 (각 연결 SecureClientWorker
거래) :
public void listenSocket(int port){
try {
System.setProperty("javax.net.ssl.keyStore", "path/to/certificate(signed_by_own_root_certificate).jks");
//I try to make this root certificate trusted by iOS (see obj-c code below)
System.setProperty("javax.net.ssl.keyStorePassword", "PASSWORD...");
} catch (IOException e1) {
e1.printStackTrace();
}
try{
SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
server = (SSLServerSocket) ssf.createServerSocket(port);
logger.info("Started to listen on port: "+port);
}catch(Exception e){
logger.warning("Could not listen on port: "+port);
e.printStackTrace();
}
while(running){
SecureClientWorker w;
try{
w = new SecureClientWorker(server.accept(), this);
Thread t = new Thread(w);
t.start();
}catch(IOException e){
if(running)
e.printStackTrace();
}
}
}
목표 C 클라이언트 코드 :
[self addRootCert]; //This is where I attempt to make the root certificate trusted, If needed I can post it
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)self.ip.text, self.portNumber.text.intValue, &readStream, &writeStream);
// Set options then bridge to ARC:
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
(id)kCFStreamSocketSecurityLevelNegotiatedSSL, kCFStreamPropertySocketSecurityLevel,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
nil];
if (readStream) {
CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)settings);
inStream = (__bridge_transfer NSInputStream*) readStream;
[inStream setDelegate:self];
[inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inStream open];
}
if (writeStream) {
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)settings);
outStream = (__bridge_transfer NSOutputStream*) writeStream;
[outStream setDelegate:self];
[outStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outStream open];
}
그러나이 결과 나는 다음 코드를 사용하여 이렇게 설정해야 오류 코드 CFNetwork SSLHandshake failed (-9824)
와 하천 객체는 NSStreamDelegate
방법에 오류 NSStreamEventErrorOccurred
를 반환합니다. 자바 측면에서
IOException
은 다음과 던져 나타납니다 :
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //ClientSocket is just the connection to the client
[...]
in.readLine();
의 printStackTrace는 말한다 : javax.net.ssl.SSLHandshakeException: no cipher suites in common
내가 만들 필요가 수행합니다 KeyManager
(나는 다른 곳에서 읽을 때)? SSLServerSocket을 열어 놓은 것에서부터 아무 것도하지 말고 어떻게해야합니까?
도움이 될 것입니다. 이 시스템 속성을 설정하지 못할 수 있기 때문에
편집
I는 서버 코드를 변경했습니다.
나의 새로운 코드는 다음과 같습니다 나는 TrustManager
내 자신을 만들려고 몇 가지 조사 후 java.security.KeyManagementException: Default SSLContext is initialized automatically
하지만 여전히
를 작동시킬 수 없습니다 : 지금이 오류 메시지가 그러나KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream ksIs = new FileInputStream(new File("path/to/certificate(signed_by_own_root_certificate).jks"));
try {
ks.load(ksIs, "PASSWORD...".toCharArray());
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (ksIs != null) {
ksIs.close();
}
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, "PASWD".toCharArray());
KeyManager keyManagers[] = kmf.getKeyManagers();
SSLContext sc = SSLContext.getDefault();
sc.init(keyManagers, null, new SecureRandom());
SSLServerSocketFactory socketFactory = sc.getServerSocketFactory();
server = (SSLServerSocket) socketFactory.createServerSocket(port);
나는 무엇을 놓치고?
을하지만 키 저장소를 열 수 없습니다라고 오류 메시지를 얻을하지 않습니다 ... 나는 또한 그냥 "업데이트 된 코드 –
과 편집을 추가했습니다 *하지만 난 몰라 키 스토어를 열 수 없다는 오류 메시지가 표시됩니다. * ": 그렇지 않습니다. 속성을 설정하기 전에 기본값 인'SSLContext'가 키 스토어 (기본값)없이 초기화 되었다면 너무 늦었습니다. (새 편집은 다른 문제입니다.) – Bruno
고맙습니다. 편집이 수정되었습니다! (당신이 말했던 것부터 먼 길을 따라야 만했기 때문에 코드에서 시스템 속성을 설정할 수 없었습니다!) 그리고 .getInstance() 메서드를 사용해 주셔서 감사합니다! 'TLS'는 사용하기에 가장 좋은 것입니까? –