Java実行SSLServerSocketへの安全な接続をセットアップしようとしています。SSLソケット接続iOS
自分のルートCAを作成し、この証明書を使用してJava SSLServerSocketの証明書に署名しました。
このルート証明書をアプリケーションに追加して、ルート証明書で署名された証明書が動作するようにしたいとします。
これまでのところ私は、読み取りを設定することで、細かい作業の安全な接続を持っており、これにストリームのプロパティを記述します。
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
(id)kCFStreamSocketSecurityLevelNegotiatedSSL, kCFStreamPropertySocketSecurityLevel,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,nil];
私はこのようなキーチェーンに証明書を追加します。
-(void)addRootCert{
NSString* rootCertPath = [[NSBundle mainBundle] pathForResource:@"rootCA" ofType:@"der"];
NSData* rootCertData = [NSData dataWithContentsOfFile:rootCertPath];
OSStatus err = noErr;
SecCertificateRef rootCert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)rootCertData);
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge_transfer id)kSecClassCertificate, kSecClass, rootCert, kSecValueRef, nil];
err = SecItemAdd((__bridge CFDictionaryRef) dict, NULL);
if (err == noErr) {
NSLog(@"Sucessfully added root certificate");
}else if (err == errSecDuplicateItem){
NSLog(@"Root certificate already exists");
}else{
NSLog(@"Root certificate add failed");
}
}
これは、私のアプリケーションが自分のCA(またはデフォルトの信頼できる証明書)によって署名された証明書のみを受け入れるように証明書チェーンを検証したいのですが。
どうすればいいですか?
私はyesにkCFStreamSSLValidatesCertificateChain
を設定した場合、私はエラーを取得する:CFNetwork SSLHandshake failed (-9807)
が、それは何だ場合、それはサーバ証明書に署名した人は関係ありません、それは(私はそうですと仮定?)にかかわらず、
感謝を接続しないでしょう!
'SecTrustSetAnchorCertificates'の使用につきましては、私は自分のルートCAを追加したいと思っていますが、' SecTrustRef'はありません。どのようにすればいいですか?私が見たすべての例では、NSURLConnectionデリゲートメソッドを使用していますが、ソケットを使用しています。 –
これはおそらくあなたが探しているものです:https://developer.apple.com/library/mac/documentation/NetworkingInternet /Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html – quellish
ありがとうございました、その最後のリンクは完璧でした! –