2

私は、HTTPServer を使用するために iPhoneHTTPServer サンプルをプロジェクトに使用しており、アドホック展開をシミュレートするために .ipa を含む .plist ファイルをホストしています。

ご承知のとおり、iOS7以降、ファイルをホストするサーバーを保護する必要があるため、SSL認証を使用しようとしましたが、失敗しました。

まず、サーバーは正しく起動しているように見えますが、次のようにサーバーにアクセスしようとすると失敗しました。

NSURL *plistUrl = [NSURL URLWithString:@"itms-services://?action=download-manifest&url=https://localhost:8080/TestMAJ2.plist"];
[[UIApplication sharedApplication] openURL:plistUrl];

私はこのエラーがあります:

NSAssert(NO, @"Security option unavailable - kCFStreamSSLLevel" @" - You must use GCDAsyncSocketSSLProtocolVersionMin & GCDAsyncSocketSSLProtocolVersionMax");

このエラーを回避するにはどうすればよいですか? TLS 設定の kCFStreamSSLLevel を削除しようとしましたが (なぜでしょうか? ^^)、それでも接続が機能しません。「ローカルホストに接続できません」などのポップアップが表示されます ...

SSL 認証については、サンプルの DDKeychain クラスは Mac の API であるため、適切ではありませんでした。そのため、次のコードを使用します: How to make iPhoneHTTPServer secure server。証明書は Keychain Access から取得され、署名に使用した証明書です。アプリ。多分それは正しい証明書ではありませんか?または正しいコードですか?iOS で SecureHTTPServer を使用する非常に簡単な例を知っていますか?

4

1 に答える 1

0

.html ファイルで完全に機能する SSL 証明書があります。.manifest および .ipa ファイルに問題があります。

私が SSL のために行ったことはMyHTTPConnection、以下を実装するクラスを作成することです。

- (NSArray *)sslIdentityAndCertificates
{
   SecIdentityRef identityRef = NULL;
   SecCertificateRef certificateRef = NULL;
   SecTrustRef trustRef = NULL;
   NSString *thePath = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"pfx"];
   NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];
   CFDataRef inPKCS12Data = (__bridge CFDataRef)PKCS12Data;
   CFStringRef password = CFSTR("test123");
   const void *keys[] = { kSecImportExportPassphrase };
   const void *values[] = { password };
   CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

   OSStatus securityError = errSecSuccess;
   securityError =  SecPKCS12Import(inPKCS12Data, optionsDictionary, &items);
   if (securityError == 0) {
       CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex (items, 0);
       const void *tempIdentity = NULL;
       tempIdentity = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemIdentity);
       identityRef = (SecIdentityRef)tempIdentity;
       const void *tempTrust = NULL;
       tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust);
       trustRef = (SecTrustRef)tempTrust;
   } else {
       NSLog(@"Failed with error code %d",(int)securityError);
       return nil;
  }

   SecIdentityCopyCertificate(identityRef, &certificateRef);
   NSArray *result = [[NSArray alloc] initWithObjects:(__bridge id)identityRef, (__bridge id)certificateRef, nil];

   return result;
}

次に、App Delegate で、このカスタム接続クラスをhttpServer次のように設定しました。

 [httpServer setConnectionClass:[MyHTTPConnection class]];

server.pfx最後に、証明書をバンドルに追加する必要があります。このチュートリアルに従って証明書を作成しました。あなたがserver.crtファイルを手に入れるまでやっただけです。次に、このウェブサイトに変換しpfx12まし。p12証明書が機能していなかったため、これを行いました。この問題が発生していました。

クリス、あなたのエントリを編集して、マニフェストをどのように行ったかを少し説明していただけますか. 私はあなたとまったく同じことをしたいのですが、あなたが開く必要のある URL に問題があります。

于 2015-01-17T18:48:40.603 に答える