2

CFSocket接続を介してNSStreamでSSLを使用しようとしました。だから私はこのコードを書きます:

[self.input setProperty:NSStreamSocketSecurityLevelTLSv1 forKey:NSStreamSocketSecurityLevelKey];
[self.output setProperty:NSStreamSocketSecurityLevelTLSv1 forKey:NSStreamSocketSecurityLevelKey];

[self.input scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.output scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[self.input open];
[self.output open];

しかし、curl またはブラウザからサーバーにリクエストを送信すると、次のエラーが発生します。

error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

使用済みソケットでこのソリューションNSStream SSL を使用すると、まだ同じエラーが発生します。

SSL を使用するようにストリームを構成するには?

4

1 に答える 1

2

SSL/TLS にはさまざまなバージョンが付属しています。接続しているサーバーが TLS バージョン 1 を使用して通信できない可能性があります。 の値NSStreamSocketSecurityLevelNegotiatedSSLを試してforKey:NSStreamSocketSecurityLevelKey、接続の可能な限り高いバージョンを取得してください。

さらに、この方法で SSL/TLS 接続のプロパティを設定してみてください

// Setting properties. Atm every certificate is accepted and no hostname will be checked
        NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
                                  [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
                                  [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                                  [NSNumber numberWithBool:NO],  kCFStreamSSLValidatesCertificateChain,
                                  kCFNull,kCFStreamSSLPeerName,
                                  nil];
        CFReadStreamSetProperty((CFReadStreamRef)_inputStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
        CFWriteStreamSetProperty((CFWriteStreamRef)_outputStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);

ただし、この方法で使用している場合、中間者に対する認証と保護はあまりないことに注意してください。追加の問題に対処するために、設定をいじってみてください。

さらにコードを投稿して、https を使用している別のサーバーに接続してみてください。

于 2014-03-26T10:41:27.703 に答える