iOS: How to create PKCS12 (P12) keystore from private key and x509certificate in application programmatically?

后端 未结 4 1613
我在风中等你
我在风中等你 2020-12-05 12:39

This question was apparently similar but had no answers of any kind: Programmatically create a x509 certificate for iPhone without using OpenSSL

In our application (

4条回答
  •  执笔经年
    2020-12-05 12:51

    Problem solved! Thank you, guys.

    The p12 file now is created correctly.

    The code now is:

    NSString *certPem = [certificate pemCertificate];
    [certPem writeToFile:[self certFilePath] atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    const char *cert_chars = [certPem cStringUsingEncoding:NSUTF8StringEncoding];
    
    BIO *buffer = BIO_new(BIO_s_mem());
    BIO_puts(buffer, cert_chars);
    
    X509 *cert;
    cert = PEM_read_bio_X509(buffer, NULL, 0, NULL);
    if (cert == NULL) {
        NSLog(@"error");
    }
    X509_print_fp(stdout, cert);
    
    if (!X509_check_private_key(cert, [certificate privateKey])) {
        NSLog(@"PK error");
    }
    
    PKCS12 *p12;
    
    SSLeay_add_all_algorithms();
    ERR_load_crypto_strings();
    
    
    p12 = PKCS12_create("passPhrase", "iOSMobileCertificate", [certificate privateKey], cert, NULL, 0,0,0,0,0);
    if(!p12) {
        fprintf(stderr, "Error creating PKCS#12 structure\n");
        ERR_print_errors_fp(stderr);
        exit(1);
    }
    
    [self saveP12File:p12];
    

    saveP12File is:

    //create empty file
    NSString *p12FilePath = [self p12FilePath];
    if (![[NSFileManager defaultManager] createFileAtPath:p12FilePath contents:nil attributes:nil])
    {
        NSLog(@"Error creating file for P12");
        @throw [[NSException alloc] initWithName:@"Fail getP12File" reason:@"Fail Error creating file for P12" userInfo:nil];
    }
    
    //get a FILE struct for the P12 file
    NSFileHandle *outputFileHandle = [NSFileHandle fileHandleForWritingAtPath:p12FilePath];
    FILE *p12File = fdopen([outputFileHandle fileDescriptor], "w");
    
    i2d_PKCS12_fp(p12File, p12);
    PKCS12_free(p12);
    fclose(p12File);
    

    And p12FilePath is:

    NSString *documentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    return [documentsFolder stringByAppendingPathComponent:@"CERT.p12"];
    

    Thank you!

提交回复
热议问题