Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NSURLSession的SSL实现_Java_Android_Ios_Security_Ssl - Fatal编程技术网

Java NSURLSession的SSL实现

Java NSURLSession的SSL实现,java,android,ios,security,ssl,Java,Android,Ios,Security,Ssl,我的应用程序中存在一个大问题。 我有java实现,但我需要通过使用Security.framework和NSURLSession对iOS应用程序执行相同的操作,我不知道如何实现。如果你能帮助我,那就太好了 爪哇: 通过以下代码解决此问题—这可能对某人有所帮助: -(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandl

我的应用程序中存在一个大问题。 我有java实现,但我需要通过使用Security.framework和NSURLSession对iOS应用程序执行相同的操作,我不知道如何实现。如果你能帮助我,那就太好了

爪哇:

通过以下代码解决此问题—这可能对某人有所帮助:

-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler{
if ([self shouldTrustProtectionSpace:challenge.protectionSpace]) {
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
} else {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"mobile_client (1)" ofType:@"pfx"];
    NSData *p12data = [NSData dataWithContentsOfFile:path];
    CFDataRef inP12data = (__bridge CFDataRef)p12data;

    SecIdentityRef myIdentity;
    SecTrustRef myTrust;
    extractIdentityAndTrust(inP12data, &myIdentity, &myTrust);

    SecCertificateRef myCertificate;
    SecIdentityCopyCertificate(myIdentity, &myCertificate);
    const void *certs[] = { myCertificate };
    CFArrayRef certsArray = CFArrayCreate(NULL, certs, 1, NULL);

    NSURLCredential *credential = [NSURLCredential credentialWithIdentity:myIdentity certificates:(__bridge NSArray*)certsArray persistence:NSURLCredentialPersistenceForSession];

    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
    completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}

}
OSStatus extractIdentityAndTrust(CFDataRef inP12data, SecIdentityRef *identity, SecTrustRef *trust)
{
OSStatus securityError = errSecSuccess;

CFStringRef password = CFSTR("123");
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 myIdentityAndTrust = CFArrayGetValueAtIndex(items, 0);
    const void *tempIdentity = NULL;
    tempIdentity = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemIdentity);
    *identity = (SecIdentityRef)tempIdentity;
    const void *tempTrust = NULL;
    tempTrust = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemTrust);
    *trust = (SecTrustRef)tempTrust;
}

if (options) {
    CFRelease(options);
}

return securityError;
}

- (BOOL)shouldTrustProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
  // Load up the bundled certificate.
  NSString *certPath = [[NSBundle mainBundle] pathForResource:@"mobile_ca" ofType:@"der"];
  NSData *certData = [[NSData alloc] initWithContentsOfFile:certPath];
  SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData));

  SecTrustRef serverTrust = protectionSpace.serverTrust;

  CFArrayRef certArrayRef = CFArrayCreate(NULL, (void *)&cert, 1, NULL);
  SecTrustSetAnchorCertificates(serverTrust, certArrayRef);

  SecTrustResultType trustResult;
  SecTrustEvaluate(serverTrust, &trustResult);

  return  trustResult == kSecTrustResultUnspecified;}
-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler{
if ([self shouldTrustProtectionSpace:challenge.protectionSpace]) {
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
} else {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"mobile_client (1)" ofType:@"pfx"];
    NSData *p12data = [NSData dataWithContentsOfFile:path];
    CFDataRef inP12data = (__bridge CFDataRef)p12data;

    SecIdentityRef myIdentity;
    SecTrustRef myTrust;
    extractIdentityAndTrust(inP12data, &myIdentity, &myTrust);

    SecCertificateRef myCertificate;
    SecIdentityCopyCertificate(myIdentity, &myCertificate);
    const void *certs[] = { myCertificate };
    CFArrayRef certsArray = CFArrayCreate(NULL, certs, 1, NULL);

    NSURLCredential *credential = [NSURLCredential credentialWithIdentity:myIdentity certificates:(__bridge NSArray*)certsArray persistence:NSURLCredentialPersistenceForSession];

    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
    completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}

}
OSStatus extractIdentityAndTrust(CFDataRef inP12data, SecIdentityRef *identity, SecTrustRef *trust)
{
OSStatus securityError = errSecSuccess;

CFStringRef password = CFSTR("123");
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 myIdentityAndTrust = CFArrayGetValueAtIndex(items, 0);
    const void *tempIdentity = NULL;
    tempIdentity = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemIdentity);
    *identity = (SecIdentityRef)tempIdentity;
    const void *tempTrust = NULL;
    tempTrust = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemTrust);
    *trust = (SecTrustRef)tempTrust;
}

if (options) {
    CFRelease(options);
}

return securityError;
}

- (BOOL)shouldTrustProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
  // Load up the bundled certificate.
  NSString *certPath = [[NSBundle mainBundle] pathForResource:@"mobile_ca" ofType:@"der"];
  NSData *certData = [[NSData alloc] initWithContentsOfFile:certPath];
  SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certData));

  SecTrustRef serverTrust = protectionSpace.serverTrust;

  CFArrayRef certArrayRef = CFArrayCreate(NULL, (void *)&cert, 1, NULL);
  SecTrustSetAnchorCertificates(serverTrust, certArrayRef);

  SecTrustResultType trustResult;
  SecTrustEvaluate(serverTrust, &trustResult);

  return  trustResult == kSecTrustResultUnspecified;}