在Objective-C中编程创建.pem文件?

3
我正在尝试使用Objective-C和OpenSSL库在iPhone应用程序中从证书签名请求创建PEM文件。我通过遵循Adria Navarro对在iOS中使用Keychain存储的密钥生成OpenSSL证书签名请求问题的回答生成了CSR(类型为X509_REQ *)。我已经确认通过将其打印到控制台来验证CSR的有效性。以下是我创建PEM文件(CertificateSigningRequest.pem)的代码。最终会创建一个空文件(0字节且没有文本)。我做错了什么,以至于无法通过PEM_write_X509_REQ写入文件?(请注意,我通过组织器下载应用程序文件夹来检查文件。)提前感谢您提供的任何帮助,并让我知道是否应提供其他信息。
- (void)createPemFileWithCertificateSigningRequest:(X509_REQ *)certSigningRequest
{
    //delete existing PEM file if there is one
    [self deletePemFile];

    //create empty PEM file
    NSString *pemFilePath = [self pemFilePath];
    if (![[NSFileManager defaultManager] createFileAtPath:pemFilePath contents:nil attributes:nil])
    {
        NSLog(@"Error creating file for PEM");
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error creating file for PEM" message:[NSString stringWithFormat:@"Could not create file at the following location:\n\n%@", pemFilePath] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
        return;
    }

    //get a FILE struct for the PEM file
    NSFileHandle *outputFileHandle = [NSFileHandle fileHandleForWritingAtPath:pemFilePath];
    FILE *pemFile = fdopen([outputFileHandle fileDescriptor], "w");

    //write the CSR to the PEM file
    PEM_write_X509_REQ(pemFile, certSigningRequest);
}

- (NSString *)pemFilePath
{
    NSString *documentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    return [documentsFolder stringByAppendingPathComponent:@"CertificateSigningRequest.pem"];
}
1个回答

4

事实证明,我的问题是在写完文件后没有关闭它。在这个方法中添加最后一行就可以解决问题。

- (void)createPemFileWithCertificateSigningRequest:(X509_REQ *)certSigningRequest
{
    //...

    //write the CSR to the PEM file
    PEM_write_X509_REQ(pemFile, certSigningRequest);

    //close the file
    fclose(pemFile); //THIS MAKES EVERYTHING WORK =)
}

我已经找到了使用RSA的每种CSR的解决方案,那么关于EC,您能否帮助我使用OpenSSL找到CSR与EC的解决方案? - Aleem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接