Objective-C/Cocoa: Как я принимаю плохой сертификат сервера?

Похоже, вы хотите, чтобы оба объекта делили счетчик ссылок. Вы можете сделать это, разрешив третьему объекту (TPair) обрабатывать подсчет ссылок. Хорошим способом добиться этого является использование ключевого слова implements. Вы можете сохранить этот третий объект скрытым или взаимодействовать с ним.

С помощью приведенного ниже кода вы можете создать TPairChildA, TPairChildB или их «родительский» TPair , Любой из них будет создавать остальные, когда это необходимо, и все созданные объекты будут сохранены до тех пор, пока не будут указаны ссылки. Вы можете, конечно, добавить к объектам такие интерфейсы, как ваш IObject1, но я сохранил их для простоты.

unit ObjectPair;

interface

type
  TPairChildA = class;
  TPairChildB = class;

  TPair = class( TInterfacedObject )
  protected
    FChildA : TPairChildA;
    FChildB : TPairChildB;

    function GetChildA : TPairChildA;
    function GetChildB : TPairChildB;
  public
    destructor Destroy; override;

    property ChildA : TPairChildA read GetChildA;
    property ChildB : TPairChildB read GetChildB;
  end;

  TPairChild = class( TObject , IInterface )
  protected
    FPair : TPair;

    property Pair : TPair read FPair implements IInterface;
  public
    constructor Create( APair : TPair = nil ); virtual;
  end;

  TPairChildA = class( TPairChild )
  protected
    function GetSibling : TPairChildB;
  public
    constructor Create( APair : TPair = nil ); override;

    property Sibling : TPairChildB read GetSibling;
  end;

  TPairChildB = class( TPairChild )
  protected
    function GetSibling : TPairChildA;
  public
    constructor Create( APair : TPair = nil ); override;

    property Sibling : TPairChildA read GetSibling;
  end;

implementation

//==============================================================================
// TPair

destructor TPair.Destroy;
begin
  FChildA.Free;
  FChildB.Free;
  inherited;
end;

function TPair.GetChildA : TPairChildA;
begin
  if FChildA = nil then
    FChildA := TPairChildA.Create( Self );
  Result := FChildA;
end;

function TPair.GetChildB : TPairChildB;
begin
  if FChildB = nil then
    FChildB := TPairChildB.Create( Self );
  Result := FChildB;
end;

// END TPair
//==============================================================================
// TPairChild

constructor TPairChild.Create( APair : TPair = nil );
begin
  if APair = nil then
    FPair := TPair.Create
  else
    FPair := APair;
end;

// END TPairChild
//==============================================================================
// TPairChildA

constructor TPairChildA.Create( APair : TPair = nil );
begin
  inherited;
  FPair.FChildA := Self;
end;

function TPairChildA.GetSibling : TPairChildB;
begin
  Result := FPair.ChildB;
end;

// END TPairChildA
//==============================================================================
// TPairChildB

constructor TPairChildB.Create( APair : TPair = nil );
begin
  inherited;
  FPair.FChildB := Self;
end;

function TPairChildB.GetSibling : TPairChildA;
begin
  Result := FPair.ChildA;
end;

// END TPairChildB
//==============================================================================

end.

Пример использования:

procedure TForm1.Button1Click( Sender : TObject );
var
  objA : TPairChildA;
  ifA , ifB : IInterface;
begin
  objA := TPairChildA.Create;
  ifA := objA;
  ifB := objA.Sibling;
  ifA := nil;
  ifB := nil; // This frees all three objects.
end;
9
задан Community 23 May 2017 в 10:33
поделиться

6 ответов

В iPhone OS 3.0 появился поддерживаемый способ сделать это, не требующий низкоуровневых API CFNetwork. Подробнее здесь:

Как использовать NSURLConnection для подключения по SSL для получения ненадежного сертификата?

2
ответ дан 4 December 2019 в 13:51
поделиться

Если это для внутреннего сервера для тестирования, почему не только импортируют сертификат тестового сервера в KeyChain и устанавливают пользовательские доверительные настройки?

3
ответ дан 4 December 2019 в 13:51
поделиться

Можно ли создать сам подписанный сертификат и добавить ли пользовательский центр сертификации к доверяемой АВАРИИ? Я не совсем уверен, как это работало бы над iPhone, но я приму на Mac OS X, Вы добавили бы их к Связке ключей.

Можно также интересоваться этим Ре сообщения: Как обработать плохую ошибку сертификата в NSURLDownload

1
ответ дан 4 December 2019 в 13:51
поделиться

Я поразил ту же проблему - я разрабатывал клиент SOAP, и dev сервер имеет сертификат "собственной разработки". Я не смог решить проблему даже с помощью того метода, так как я не использовал NSURL, но (плохо зарегистрированный и по-видимому заброшенный) методы WS, и решенный в настоящее время к (внутренне) просто использованию соединение не-SSL.

Однако однако, вопрос, который приходит на ум, если Вы не готовы использовать частный API в производственном приложении, необходимо ли предоставлять доступ к сайту с изворотливым сертификатом?

Я заключу Jens Alfke в кавычки:

Это не просто теоретическая проблема безопасности. Что-то
как 25% общедоступного DNS серверы были поставлены под угрозу, согласно
недавние отчеты, и могут направить пользователей к сайтам фишинга/вредоносного программного обеспечения/рекламы даже
если они вводят доменное имя правильно. Единственная вещь, защищающая Вас
от этого проверка сертификата SSL.

1
ответ дан 4 December 2019 в 13:51
поделиться

Другая опция состояла бы в том, чтобы пользоваться альтернативной библиотекой соединения.

Я - огромный поклонник AsyncSocket, и он имеет поддержку сам подписанные сертификаты

http://code.google.com/p/cocoaasyncsocket/

Смотрите, я думаю, что это - путь, более устойчивый затем стандартный NSURLRequests.

0
ответ дан 4 December 2019 в 13:51
поделиться

Поддерживаемый способ сделать это требует использования CFNetwork. Необходимо сделать, присоединить kCFStreamPropertySSLSettings к потоку, который указывает kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse. Ниже некоторый быстрый код, который делает это, минус проверка допустимые результаты добавляют чистку. После того как Вы сделали это, можно использовать CFReadStreamRead () для получения данных.

CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://www.apple.com"), NULL);
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), myURL, kCFHTTPVersion1_1);
CFReadStreamRef myStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
CFMutableDictionaryRef myDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(myDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, myDict);    
CFReadStreamOpen(myStream);
8
ответ дан 4 December 2019 в 13:51
поделиться