2013-05-17 4 views
15

В моем приложении я использую https и самоподписанный SSL-сертификат для защиты соединения между моим клиентом и сервером.SSL-соединение с AFNetworking

Я пытался, чтобы библиотека AFNetworking выполняла SSL-шифрование на копии моего сертификата, прилагаемого в приложении.

В заголовке AFURLConnectionOperation я определил как:

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ =1 
#define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1 

И перед вызовом start на моем AFJSONRequestOperation я установил SSLPinningMode свойство AFSSLPinningModeCertificate.

Но при попытке выполнить запрос JSON я получаю следующее сообщение об ошибке:

Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. 
(NSURLErrorDomain error -1012.)" UserInfo=0x758f120 
{NSErrorFailingURLKey=https://mydomain.com, 
NSErrorFailingURLStringKey=https://mydomain.com} 

AFURLConnectionOperation В заголовке я прочитал, что SSL Закрепление работает с .CER сертификатов, но в моем самопринятый OS X веб-сервер У меня есть сертификат .crt.

В этом проблема? Есть ли способ заставить AFNetworking работать с .crt?

В окне окна я преобразовал свой .crt в .cer и попытался связать это с моим приложением, но я все равно получаю ту же ошибку. Должен ли я попытаться переключить файл .crt с вновь созданным .cer даже на стороне сервера?

+0

ли вы найти ответ? Хотите поделиться им? – jAckOdE

+0

Я просто отказался от использования 'AFNetworking' и написал класс, который использует стандартную' NSURLConnection' (и выступает в роли делегата для самого соединения), чтобы сделать запрос, и я вручную обработал данные сравнения в '- (void) соединение: NSURLConnection *) соединение будет sendRequestForAuthenticationChallenge: (NSURLAuthenticationChallenge *) вызов' метод, который является частью протокола NSURLConnectionDelegate, если вы хотите взглянуть на код, пожалуйста, не стесняйтесь спрашивать. – BigLex

+0

Я не пробовал это сам. но в проекте выборки AFNetworking. в режиме закрепления SSL устанавливается значение AFSSLPinningModePublicKey, а не AFSSLPinningModeCertificate. Ты это пробовал? – jAckOdE

ответ

20

У меня это работает.

Я был в ситуации, когда я создал самозаверяющий сертификат для доступа к своему API-интерфейсу сервера из моего приложения iOS. Я создал свой сертификат с OpenSSL. Когда я это сделал, у меня было несколько файлов, один из которых был «server.crt». Первоначально я попробовал просто переименовать его в «server.cer» и использовать «AFSSLPinningModeCertificate» для моих объектов AFURLConnectionOperation. Это не сработало, и я заметил, что пример использует «AFSSLPinningModePublicKey», поэтому я попробовал это, все еще не повезло.

Итак, я сравнил свой файл (это был переименованный файл .crt).
я заметил, что «server.crt» был в кодировке base64, и как это:

-----BEGIN CERTIFICATE----- 
394230AFDFD... 
-----END CERTIFICATE----- 

я заметил из примера Mattt в AFNetworking, что файл «adn.cer» он использует не в кодировке base64. Это просто сырые байты. Итак, я сделал это:

$ base64 -D -i ./server.crt -o ./server.cer 

Я установил мой AFURLConnectionOperation к AFSSLPinningModePublicKey.
Я положил это обратно в проект и сделал чистую и сборку моего проекта iOS, и все сработало нормально.

Надеюсь, что это поможет!

Btw, вы можете заметить, что Xcode отобразит информацию для вашего ключа «.crt» или «.cer», будь то base64 или raw, поэтому не позволяйте этому путать вас. Вы должны иметь возможность видеть данные сертификата в любом случае, просто AF будет принимать только исходный (не базовый).

UPDATE:
Любой человек, имеющих проблемы с base64, это то, что работает для меня на OS X с помощью OpenSSL:

$ openssl base64 -d -in ./server.crt -out ./server.cer 
+1

Ваша работа правильная, но, как сделать он работает без каких-либо файлов .cer? Это вопрос! –

+8

FYI, у меня возникла проблема с использованием base64 для преобразования. Вместо этого я использовал 'openssl x509 -in test.crt -outform der -out test.cer'. – CharlesA

+0

Кто-то путается относительно .cer | .crt и т. д., есть [хороший пост] (http://www.gtopia.org/blog/2010/02/der-vs-crt-vs-cer-vs-pem-certificates/), который будет конечно, ясны ваши сомнения. Он также показывает, как конвертировать сертификаты в разные форматы. – nefarianblack

3

Если вы используете AFNetworking 2.x, и вы с помощью правильно .cer, но по-прежнему получать код ошибки -1012 о вызовах, вы должны отключить validatesCertificateChain:

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; 
securityPolicy.validatesCertificateChain = NO; 

или вы можете передать все это во всей цепочке сертификатов в pinnedCertificates.

0

Ваш сертификат должен иметь удлинитель, а не crt, и должен быть в формате .der. Добавьте выходной файл в проект Xcode.

Вы можете использовать следующую команду:

openssl x509 -in your.crt -out certificate_cer.cer -outform der