2014-09-01 96 views
0

我試圖在IPhone應用程序與Java SSLServerSocket之間建立SSL連接。 我的Java服務器看起來就像是:IPhone應用程序與Java ServerSocket之間的SSL連接

SSLServerSocketFactory ssf = null; 
    try { 
     // set up key manager to do server authentication 
     SSLContext ctx; 
     KeyManagerFactory kmf; 
     KeyStore ks; 
     char[] passphrase = "passphrase".toCharArray(); 

     ctx = SSLContext.getInstance("TLS"); 
     kmf = KeyManagerFactory.getInstance("SunX509"); 
     ks = KeyStore.getInstance("JKS"); 

     ks.load(new FileInputStream("fsKeystore"), passphrase); 
     kmf.init(ks, passphrase); 
     ctx.init(kmf.getKeyManagers(), null, null); 

     ssf = ctx.getServerSocketFactory(); 

     System.out.println("Waiting for Connection"); 
     SSLServerSocket sslsocketServer = (SSLServerSocket) ssf.createServerSocket(9999); 
     SSLSocket sslsocket = (SSLSocket) sslsocketServer.accept(); 
     sslsocket.addHandshakeCompletedListener(new HandshakeCompletedListener() { 

      @Override 
      public void handshakeCompleted(HandshakeCompletedEvent arg0) { 
       System.out.println("Handshake finished"); 
      } 
     }); 
     InputStream inputstream = sslsocket.getInputStream(); 
     InputStreamReader inputstreamreader = new InputStreamReader(inputstream); 
     BufferedReader bufferedreader; 
     bufferedreader = new BufferedReader(inputstreamreader); 

     String string = ""; 
     while ((string = bufferedreader.readLine()) != null) { 
      string = bufferedreader.readLine(); 
      System.out.println(System.currentTimeMillis()); 
      System.out.println(string); 
      System.out.flush(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

在Objective-C我已經實現這個解決方案:

-(id) initWithUrl: (NSString*) host onPort: (NSInteger) port withDelegate:(id<TCPDelegate>) delegate{ 
self = [super init]; 
if(self){ 

    //initTimer 
    sendBuffer=[[NSMutableArray alloc]init]; 
    NSTimer *timer =[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES]; 
    NSRunLoop *runloop = [NSRunLoop currentRunLoop]; 
    [runloop addTimer:timer forMode:NSDefaultRunLoopMode]; 

    del=delegate; 
    CFReadStreamRef readStream; 
    CFWriteStreamRef writeStream; 

    CFStreamCreatePairWithSocketToHost(NULL,(__bridge CFStringRef)host, port,&readStream,&writeStream); 

    iStream = (__bridge_transfer NSInputStream *)readStream; 
    oStream = (__bridge_transfer NSOutputStream *)writeStream; 

    [iStream setDelegate:self]; 
    [oStream setDelegate:self]; 

    [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 


    [iStream open]; 
    [oStream open]; 

    [iStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL 
        forKey:NSStreamSocketSecurityLevelKey]; 
    [oStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL 
        forKey:NSStreamSocketSecurityLevelKey]; 
    line = @""; 
} 
return self; 
} 

在iPhone App我得到

CFNetwork的SSLHandshake失敗(-9807 )

任何想法問題可能是什麼?

+0

加密是你永遠不應該做的事情之一;兩端使用標準庫。 – chrylis 2014-09-01 07:59:17

+0

你能否更清楚地描述一下?我使用哪些不屬於標準庫的部分? – user2071938 2014-09-01 08:00:22

+0

你在這個SSL套接字上運行什麼?現在,它幾乎總是HTTP,並且我認爲iOS HTTP客戶端庫可以像Java中的「HttpURLConnection」一樣處理SSL。 – chrylis 2014-09-01 08:18:53

回答

相關問題