SSL-соединение с AFNetworking
В моем приложении я использую https и самоподписанный SSL-сертификат для защиты соединения между моим клиентом и сервером.
Я пытался установить библиотеку AFNetworking SSL Pinning на копию моего сертификата, прилагаемого в приложении.
В заголовке 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 даже на стороне сервера?
Ответы
Ответ 1
Я начал работать.
Я был в ситуации, когда я создал самозаверяющий сертификат для того, чтобы ударить свой собственный серверный 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 будет принимать только исходный (не base64).
UPDATE:
У любого, у кого проблемы с base64, это то, что работает для меня на OS X с использованием OpenSSL:
$ openssl base64 -d -in ./server.crt -out ./server.cer
Ответ 2
Если вы используете AFNetworking 2.x, и используете правильный код, но все еще получаете код ошибки -1012 в своих вызовах, вы должны отключить validatesCertificateChain
:
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.validatesCertificateChain = NO;
или вы можете передать все это во всей цепочке сертификатов в pinnedCertificates
.
Ответ 3
Ваш сертификат должен иметь расширение, а не crt, и должно быть в формате .der. Добавьте выходной файл в проект Xcode.
Вы можете использовать следующую команду:
openssl x509 -in your.crt -out certificate_cer.cer -outform der