Eu tenho o seguinte código simples para conectar-me a uma página SSL
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
Exceto se houver um erro se o certificado for autoassinado. Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".
Existe uma maneira de configurá-lo para aceitar conexões de qualquer maneira (como em um navegador que você pode pressionar em aceitar) ou uma maneira de ignorá-lo?
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
método deve ser usado em seu lugar.Se você não estiver disposto (ou não puder) a usar APIs privadas, há uma biblioteca de código aberto (licença BSD) chamada ASIHTTPRequest que fornece um wrapper em torno do nível inferior
CFNetwork APIs
. Eles recentemente introduziram a capacidade de permitir oHTTPS connections
uso de certificados autoassinados ou não confiáveis com a-setValidatesSecureCertificate:
API. Se você não deseja extrair a biblioteca inteira, pode usar a fonte como referência para implementar a mesma funcionalidade.fonte
Idealmente, deve haver apenas dois cenários em que um aplicativo iOS precisaria aceitar um certificado não confiável.
Cenário A: Você está conectado a um ambiente de teste que está usando um certificado autoassinado.
Cenário B: você está proxy de
HTTPS
tráfego usando um proxyMITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
que retornará um certificado assinado por uma CA autoassinada para que o proxy possa capturarHTTPS
tráfego.Os hosts de produção nunca devem usar certificados não confiáveis por razões óbvias .
Se você precisar que o simulador do iOS aceite um certificado não confiável para fins de teste, é altamente recomendável que você não altere a lógica do aplicativo para desativar a validação de certificado interna fornecida pelas
NSURLConnection
APIs. Se o aplicativo for lançado ao público sem remover essa lógica, ele estará suscetível a ataques do tipo man-in-the-middle.A maneira recomendada de aceitar certificados não confiáveis para fins de teste é importar o certificado da Autoridade de Certificação (CA) que assinou o certificado no seu Simulador iOS ou dispositivo iOS. Eu escrevi um post rápido no blog que demonstra como fazer isso no iOS Simulator:
aceitando certificados não confiáveis usando o simulador ios
fonte
NSURLRequest
tem um método particular chamadosetAllowsAnyHTTPSCertificate:forHost:
, que fará exatamente o que você deseja. Você pode definir oallowsAnyHTTPSCertificateForHost:
método porNSURLRequest
meio de uma categoria e configurá-lo para retornarYES
para o host que você deseja substituir.fonte
Para complementar a resposta aceita, para uma segurança muito melhor, você pode adicionar seu certificado de servidor ou seu próprio certificado CA raiz às chaves ( https://stackoverflow.com/a/9941559/1432048 ), mas fazer isso sozinho não fará com que NSURLConnection autentique seu servidor autoassinado automaticamente. Você ainda precisa adicionar o código abaixo ao seu representante do NSURLConnection, ele é copiado do código de exemplo da Apple AdvancedURLConnections e você precisa adicionar dois arquivos (Credentials.h, Credentials.m) do código de exemplo da Apple aos seus projetos.
fonte
Não posso aceitar nenhum crédito por isso, mas este que achei funcionou muito bem para minhas necessidades.
shouldAllowSelfSignedCert
é minhaBOOL
variável Basta adicionar ao seuNSURLConnection
delegado e você deve estar agitado para um desvio rápido por conexão.fonte
No iOS 9, as conexões SSL falharão para todos os certificados inválidos ou autoassinados. Esse é o comportamento padrão do novo recurso App Transport Security no iOS 9.0 ou posterior e no OS X 10.11 e posterior.
Você pode substituir esse comportamento no
Info.plist
, definindoNSAllowsArbitraryLoads
paraYES
noNSAppTransportSecurity
dicionário. No entanto, recomendo substituir essa configuração apenas para fins de teste.Para obter informações, consulte App Transport Technote aqui .
fonte
A solução alternativa da categoria publicada por Nathan de Vries passará nas verificações de API privadas da AppStore e é útil nos casos em que você não tem controle do
NSUrlConnection
objeto. Um exemplo é oNSXMLParser
que abrirá o URL que você fornece, mas não expõe oNSURLRequest
ouNSURLConnection
.No iOS 4, a solução alternativa ainda parece funcionar, mas apenas no dispositivo, o Simulador não invoca mais o
allowsAnyHTTPSCertificateForHost:
método.fonte
Você precisa usar
NSURLConnectionDelegate
para permitir conexões HTTPS e há novos retornos de chamada no iOS8.Descontinuada:
Em vez disso, você precisa declarar:
Com
willSendRequestForAuthenticationChallenge
você pode usarchallenge
como você fez com os métodos preteridos, por exemplo:fonte
Publiquei um código essencial (com base no trabalho de outra pessoa que observo) que permite que você se autentique adequadamente em um certificado auto-gerado (e como obter um certificado gratuito - veja os comentários na parte inferior do Cocoanetics )
Meu código está aqui github
fonte
Se você quiser continuar usando o sendSynchronousRequest, eu trabalho nesta solução:
Você pode vê-lo aqui: Conexão síncrona SSL do Objective-C
fonte
Com o AFNetworking , consumi com sucesso o https webservice com o código abaixo,
fonte
Você pode usar este código
Use em
-connection:willSendRequestForAuthenticationChallenge:
vez desses métodos preteridosDescontinuada:
fonte