Détermination de la confiance avec NSURLConnection et NSURLProtectionSpace
Je voudrais poser une question de suivi à précédemment posées question. J'ai le code pour créer un NSURLRequest/Connexion, l'exécuter et ont les méthodes de rappel pour l'authentification appelée. Voici le code:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust] || [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodDefault];
}
-(void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge previousFailureCount] > 0) {
[[challenge sender] cancelAuthenticationChallenge:challenge];
NSLog(@"Bad Username Or Password");
badUsernameAndPassword = YES;
finished = YES;
return;
}
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
if (appDelegate._allowInvalidCert)
{
//Go ahead...trust me!
[challenge.sender useCredential:
[NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust]
forAuthenticationChallenge: challenge];
}
else
{
TrustGenerator *tg = [[TrustGenerator alloc] init];
if ([tg getTrust:challenge.protectionSpace])
{
//Go ahead...trust me!
[challenge.sender useCredential:
[NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust]
forAuthenticationChallenge: challenge];
}
else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
}
else if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodDefault) {
NSURLCredential *newCredential = [NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
}
Ce que je suis en cours d'exécution en est que "didReceiveAuthenticationChallenge" avec "[défi.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]" est TOUJOURS appelle, même lorsque le certificat sur le serveur, je suis d'essayer de vous connecter est digne de confiance (faire des tests avec une Verisign cert). Donc, ce que je constate c'est que ma demande est toujours le demander à l'utilisateur final de faire confiance même lorsque le site est digne de confiance. Mauvais karma considérant que ce qui est supposé se produire avec un man in the middle attack, etc. Ce que je suis vraiment à la recherche de code comme ceci:
if (appDelegate._allowInvalidCert)
{
//Go ahead...trust me!
[challenge.sender useCredential:
[NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust]
forAuthenticationChallenge: challenge];
}
else if(The OS trusts the cert on the server)
{
[challenge.sender useCredential:
[NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust]
forAuthenticationChallenge: challenge];
}
else{...
source d'informationauteur Staros
Vous devez vous connecter pour publier un commentaire.
J'ai donc passé quelques jours à la recherche de cette. Il ressemble à tout le NSURLConnection API ne peut pas déterminer si un certificat est approuvé, il y a une méthode dans le Cadre de la Sécurité que handels. Voici donc le code que je suis venu avec:
Si le résultat est
kSecTrustResultConfirm
en fait, vous devez demander à l'utilisateur si c'est un serveur de confiance.La réponse ci-dessus fonctionne, tout simplement si vous avez un CA de Certificat de confiance, parce que dans ce cas, vous êtes à l'aide de l'apple permis de certificats d'autorité de certification pour la validation.
Si vous avez des certificats auto-signés, vous devez utiliser votre propre autorité de certification du certificat du serveur pour vérifier si il est valide...
J'ai trouvé une bonne (peu confus) ici. Il couvre aussi une double poignée de main....
Espère que ça aidera certains !