使用安全框架在Objective-C中以编程方式创建x509证书



我正在努力寻找一种使用安全框架在Objective-C中以编程方式(自签名)创建x509证书的方法。我的项目没有使用OpenSSL。所以我不能考虑使用OpenSSL。以下是我已经创建的一些东西:

  • 已创建RSA密钥对。根据苹果文档使用- (void)generateKeyPairPlease功能

  • 使用的ios csr(https://github.com/ateska/ios-csr)创建CSR。参见以下代码

    SCCSR *sccsr = [[SCCSR alloc]init];
    sccsr.commonName = @"some name";
    sccsr.organizationName = @"some organisation";
    NSData *certificateRequest = [sccsr build:pPublicKey privateKey:privateKey];
    NSString *str = [certificateRequest base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSString *strCertificateRequest = @"-----BEGIN CERTIFICATE REQUEST-----n";
    strCertificateRequest = [strCertificateRequest stringByAppendingString:str];
    strCertificateRequest = [strCertificateRequest stringByAppendingString:@"n-----END CERTIFICATE REQUEST-----n"];
    
  • 现在我需要创建X509证书(自签名)。我使用了以下代码。

    // Convert to Base64 data
    NSData *base64Data = [certificateRequest base64EncodedDataWithOptions:0];
    SecCertificateRef cer = SecCertificateCreateWithData ( NULL, (__bridge CFDataRef) base64Data);
    NSLog(@"%@", cer);
    
  • cer似乎为NULL。根据文档,SecCertificateCreateWithData需要"X.509证书的DER(可分辨编码规则)表示"。

我的方法正确吗?重申一下:我有一个RSA密钥对(公钥和私钥),成功生成了CSR(证书签名请求)。现在我需要用程序生成X509证书。

我使用的是6.2版(6C131e)和iOS SDK 8.2。

我认为使用安全框架实际上是不可能的。AFAICT,在iOS/OSX上执行此操作的唯一方法是使用(不推荐使用)CDSA库或(不推荐)OpenSSL库。

有一个图书馆在https://github.com/snej/MYCrypto它可以做到这一点,但它使用了一些(不推荐使用的)CDSA/CSA调用,并且依赖于同一作者的许多实用程序/库函数,我发现这些函数毫无帮助。

我建议您在bugreporter.apple.com上提交一个bug,以表达您希望能够生成x.509证书的愿望。我有!

编辑:MYCrypto作者(snej)还有一个简化版本,MYAnonymousIdentity,它采用预先创建的x.509自签名证书,并使用最少的SDK调用将新的RSA密钥/签名注入现有证书。它还使用了他的一些实用程序/库内容,但我已经为自己的项目删除了所有这些内容,您可以在以下位置找到修改后的代码、我用于生成预录制证书的脚本(以及包含所有修改偏移量的头文件):https://github.com/Hammerspoon/hammerspoon/tree/master/extensions/httpserver

最新更新