美文网首页
iOS开发-应用内生成开发者证书签名的mobileconfig描

iOS开发-应用内生成开发者证书签名的mobileconfig描

作者: 妖怪丶哪里逃 | 来源:发表于2021-02-04 17:59 被阅读0次

第一步,编译iOS平台的openssl库,如何编译可自行搜索,网上一搜一大堆,git传送门:https://github.com/x2on/OpenSSL-for-iPhone,编译完之后导入项目,配置Header Search Paths就行


第二步,导出开发者证书为Sign.p12,终端运行以下命令

openssl pkcs12 -in Sign.p12 -out Sign.pem -nodes

此时得到Sign.pem

导出Apple WorldWide证书为Apple.pem,这个直接导成pem就行

然后把Sign.pem和Apple.pem放入项目


第三步,上代码搞定

//
//  YMOpenSSL.m
//  Yuumi
//
//  Created by 1 on 2021/2/4.
//

#import "YMOpenSSL.h"
#import <openssl/pkcs7.h>
#import <openssl/pem.h>

@implementation YMOpenSSL

+ (BOOL)signMobileConfigWithInPath:(NSString *)inPath outPath:(NSString *)outPath
{
    //X509证书对象,sign为签名者证书sign.pem,root为签名附加证书(一般是sign的颁发机构提供)
    X509 *sign = NULL, *root = NULL;
    //证书私钥
    EVP_PKEY *skey = NULL;
    //文件操作
    BIO *signBio = NULL, *rootBio = NULL;
    
    //读取包内证书路径
    NSString * signPem = [[NSBundle mainBundle] pathForResource:@"Sign" ofType:@"pem"];
    NSString * applePem = [[NSBundle mainBundle] pathForResource:@"Apple" ofType:@"pem"];
    if (!signPem || !applePem) {
        return NO;
    }
    
    //获取sign.pem文件
    signBio = BIO_new_file(signPem.UTF8String, "r");
    if (!signBio) {
        return NO;
    }
    //将sign.pem文件以X509格式读取
    sign = PEM_read_bio_X509(signBio, NULL, 0, NULL);
    //读取sign的私钥
    skey = PEM_read_bio_PrivateKey(signBio, NULL, 0, NULL);
    if (!skey) {
        return NO;
    }
    
    //获取root.pem文件
    rootBio = BIO_new_file(applePem.UTF8String, "r");
    if (!rootBio) {
        return NO;
    }
    //将root.pem文件以X509格式读取
    root = PEM_read_bio_X509(rootBio, NULL, 0, NULL);
    
    //创建PKCS7签名对象
    PKCS7* p7 = PKCS7_new();
    //设置类型为NID_pkcs7_signed
    PKCS7_set_type(p7, NID_pkcs7_signed);
    //内容设置为NID_pkcs7_data
    PKCS7_content_new(p7, NID_pkcs7_data);
    //设置为no-detached签名方式
    PKCS7_set_detached(p7, 0);
    //向签名信息中增加证书,秘钥,对应的加密算法
    PKCS7_add_signature(p7, sign, skey, EVP_sha1());
    //增加证书链,sign和root证书
    PKCS7_add_certificate(p7, sign);
    PKCS7_add_certificate(p7, root);
    
    //创建PKCS7签名操作
    BIO *p7bio = PKCS7_dataInit(p7, NULL);
    
    //读取需要签名的文件
    NSData * data = [NSData dataWithContentsOfFile:inPath];
    if (!data) {
        return NO;
    }
    const char *inData = [data bytes];
    
    //像签名操作中写入文件的内容
    BIO_write(p7bio, inData, (int)strlen(inData));
    //处理签名
    PKCS7_dataFinal(p7, p7bio);
    
    //转换为der编码输出
    int len;
    unsigned char *der, *p;
    len = i2d_PKCS7(p7, NULL);
    der = (unsigned char *)malloc(len);
    p = der;
    len = i2d_PKCS7(p7, &p);
    
    //写入文件
    FILE *fp;
    fp = fopen(outPath.UTF8String, "wb");
    fwrite(der, 1, len, fp);
    
    //释放操作
    fclose(fp);
    free(der);
    X509_free(sign);
    X509_free(root);
    EVP_PKEY_free(skey);
    BIO_free(signBio);
    BIO_free(rootBio);
    PKCS7_free(p7);
    BIO_free(p7bio);
    
    return YES;
}

@end

相关文章

  • iOS开发-应用内生成开发者证书签名的mobileconfig描

    第一步,编译iOS平台的openssl库,网上一搜一大堆,git传送门:https://github.com/x2...

  • iOS 签名 unsigned.mobileconfig 文件

    iOS 签名 unsigned.mobileconfig 文件 通过 Apple 开发者账号签名 查看可用于签名的...

  • IOS 逆向开发(四)App重签名

    1. 应用签名 应用签名原理回顾 上一篇博客“IOS 逆向开发(三)应用签名”中详细讲解了IOS 应用签名,证书的...

  • iOS 面试题杂记

    问答题 iOS的开发和发布签名证书有何异同?开发签名证书绑定App ID、开发者证书、以及测试设备,用于真机测试。...

  • Xcode打包和导出ipa

    众所周知,开发苹果app时需要使用签名(证书)来打包安装苹果IPA。作为ios开发的新生,你只学ios应用开发的内...

  • 2022-10-17

    众所周知,开发苹果app时需要使用签名(证书)来打包安装苹果IPA。作为ios开发的新生,你只学ios应用开发的内...

  • iOS 测试包

    若想测试iOS开发完成的应用需先给应用进行签名,进行签名则先要申请证书,不同的测试方式需要不同的证书。 测试iOS...

  • iOS 多个开发者 证书共享

    ios开发团队中如何多名ios开发人员共享“个人开发者证书”的问题 1.首先保证你的电脑上已经生成正常的开发者证书...

  • iOS关于发布的一些实用技巧

    应用程序发布: 发布应用程序 *developer.apple.com : 开发者主页, 配置证书\AppId\描...

  • (转)iOS 开发中的各种证书及App签名原理

    iOS 开发中的各种证书 iOS App 签名的原理 iOS 签名机制挺复杂,各种证书,Provisioning ...

网友评论

      本文标题:iOS开发-应用内生成开发者证书签名的mobileconfig描

      本文链接:https://www.haomeiwen.com/subject/knabtltx.html