2

私はiPhone開発に非常に慣れていません。

以下のリンクから iPhoneHTTPServer アプリケーションをダウンロードしました。 https://github.com/robbiehanson/CocoaHTTPServer/tree/master/Samples/iPhoneHTTPServer

HTTP リクエストでは問題なく動作します。

今、私はそれを安全なサーバーとして作りたいと思っています。(HTTPSを使用)そのために、MyHTTPConnection.mで次の2つのメソッドをオーバーライドしました

このメソッドの変更については確信があります。

 /**
 * Overrides HTTPConnection's method
 **/
 - (BOOL)isSecureServer
 {
    // Create an HTTPS server (all connections will be secured via SSL/TLS)
    return YES; 
 }

次の方法で変更を適用する必要があります: (ここでガイドしてください。) 問題: DDKeychain と Cocoa.h は iOS では使用できません。

 /**
  * Overrides HTTPConnection's method
  * 
  * This method is expected to returns an array appropriate for use in  
  * kCFStreamSSLCertificates SSL Settings.
  * It should be an array of SecCertificateRefs except for the first element in
  * the array, which is a SecIdentityRef.
  **/
  - (NSArray *)sslIdentityAndCertificates
  {
      NSArray *result = [DDKeychain SSLIdentityAndCertificates];
      if([result count] == 0)
      {
        [DDKeychain createNewIdentity];
        return [DDKeychain SSLIdentityAndCertificates];
      }
      return result;
  }
4

1 に答える 1

3

次の手順で問題を解決しました。

  1. キーチェーン アクセスから証明書をエクスポートする(Mac OS X)
    • キーチェーンアクセスを開く
    • [証明書] を選択し、右クリックして [エクスポート...] を選択します。
    • ファイル形式のエクスポート証明書: Personal Information Exchange (.p12)
    • ファイルをエクスポートするための名前とパスワードを入力します。
      ファイル名: TestCertificate.p12
      パスワード: test123 (* 機能しない場合は、管理者ログイン パスを試してください)

  2. XCode プロジェクトにTestCertificate.p12をインポートします。

  3. プロジェクトにSecurity.frameworkを追加します。

  4. コードにSecurity.hファイルを インポートします。

    #import <Security/Security.h>

  5. sslIdentityAndCertificatesメソッドを 次のようにオーバーライドして変更します。

    /**
     * Overrides HTTPConnection's method
     * 
     * This method is expected to returns an array appropriate for use in kCFStreamSSLCertificates SSL Settings.
     * It should be an array of SecCertificateRefs except for the first element in the array, which is a SecIdentityRef.
     **/
    - (NSArray *)sslIdentityAndCertificates
    {    
        SecIdentityRef identityRef = NULL;
        SecCertificateRef certificateRef = NULL;
        SecTrustRef trustRef = NULL;

        NSString *thePath = [[NSBundle mainBundle] pathForResource:@"TestCertificate" ofType:@"p12"];
        NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath]; 
        CFDataRef inPKCS12Data = (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:(id)identityRef, (id)certificateRef, nil];

        return result;    
    }

于 2012-06-30T11:53:50.077 に答える