【问题标题】:SSL Connection between IPhone App and Java ServerSocketIPhone App 与 Java ServerSocket 之间的 SSL 连接
【发布时间】:2014-09-01 07:53:04
【问题描述】:

我正在尝试在 iPhone 应用程序和 Java SSLServerSocket 之间建立 SSL 连接。 我的 Java 服务器看起来像这样:

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 应用程序中

CFNetwork SSLHandshake 失败 (-9807)

知道问题可能是什么吗?

【问题讨论】:

  • 加密是你永远不应该手工做的事情之一;在两端使用标准库。
  • 您能否描述得更清楚些?我应该使用哪些不属于标准库的内容?
  • 你在这个 SSL 套接字上运行什么?这些天来,它几乎总是 HTTP,我认为 iOS HTTP 客户端库可以像 Java 中的 HttpURLConnection 一样处理 SSL。
  • 我只是通过这个套接字发送 JSON 命令
  • 您能否从另一个客户端建立 SSL 连接,例如使用openssl s_client

标签: java cocoa ssl ios7 serversocket


【解决方案1】:

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多