Bonjour

Je dois communiquer avec un organisme pour récupérer les informations du client. Pour cela l'organisme m'a donné un lien URL, deux certificats et la trame d'une chaîne à passer (en format xml)

sous Android j'ai réaliser un Keystore de type BKS ou j'ai importé les deux certificats puis j'importe le fichier dans l'application avec la génération de l'apk. et lors de ma requête http je vais lire le keystore (le code est réalisé en java).

Sous iOS, j'ai regardé sur le net et je dois réaliser quelques chose comme cela :
J'ai réaliser un fichier XXX.p12 avec les deux certificats. J'ai importer le fichier dans exécutable.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
NSURL *serverURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@", [options objectForKey:@"host"]]];
NSMutableURLRequest *connectionRequest = [NSMutableURLRequest requestWithURL:serverURL
 
[connectionRequest setHTTPMethod:@"POST"];
[connectionRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
[connectionRequest setHTTPBody:[[options objectForKey:@"data"] dataUsingEncoding:NSUTF8StringEncoding]];
 
NSURLConnection * aConnection = [[NSURLConnection alloc] initWithRequest:connectionRequest delegate:self];
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    // gets a certificate from local resources
    NSString *thePath = [[NSBundle mainBundle] pathForResource:@"XXX" ofType:@"p12"];
    NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];
    CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data;
    SecIdentityRef identity;
 
    // extract the ideneity from the certificate
    [self extractIdentity :inPKCS12Data :&identity];
 
    SecCertificateRef certificate = NULL;
    SecIdentityCopyCertificate (identity, &certificate);
 
    const void *certs[] = {certificate};
    CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);
 
    // create a credential from the certificate and ideneity, then reply to the challenge with the credential
    NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identity certificates:(NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];
    [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
- (OSStatus)extractIdentity:(CFDataRef)inP12Data :(SecIdentityRef*)identity {
    OSStatus securityError = errSecSuccess;
 
    CFStringRef password = CFSTR("MyCertificatePassword");
    const void *keys[] = { kSecImportExportPassphrase };
    const void *values[] = { password };
 
    CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
 
    CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
    securityError = SecPKCS12Import(inP12Data, options, &items);
 
    if (securityError == 0) {
        CFDictionaryRef ident = CFArrayGetValueAtIndex(items,0);
        const void *tempIdentity = NULL;
        tempIdentity = CFDictionaryGetValue(ident, kSecImportItemIdentity);
        *identity = (SecIdentityRef)tempIdentity;
    }
 
    if (options) {
        CFRelease(options);
    }
 
    return securityError;
}
Mais lorsque je réalise le code en objective c, j'ai deux erreurs de compilation sur la procédure 2 et 3
Je ne sais pas comment adapter le code.

erreur : Erreur :Le prototype de la fonction native Objective-C n'a pas pu être analysé. Il contient des types non gérés ou une erreur de syntaxe.
ObjectiveC.Nouvelle_Procédure1, Procédure locale, ligne 1, colonne 1


cordialement Law56100