iOS openssl库 x509证书解析

1. 第一步先去认真看下下边这两个连接,了解一下这个x509证书解析到底是个什么玩意

http://www.360doc.com/content/16/0407/16/3242454_548621325.shtml

了解之后大约需要做三步:第一步导入openssl库,如何导入自行百度,注意路径问题,

路径如图,根据自己实际项目修改

第二部:将证书导入结构体


第三部就是证书解析:我这只解析了证书版本,证书序列号(sn),证书颁发者名字(issuer_name),证书颁发者序列号(issuer_sn)


```

/** 获取SN */

-(NSString*)get_SN:(X509* )m_px{

    NSString* str_SN=@"";

    ASN1_INTEGER*serial =X509_get_serialNumber(m_px);

    //打印证书序列号

    //printf("serialNumber is: \n");

    NSMutableString *str = [[NSMutableString alloc] init];

    for(inti =0; i < serial->length; i++) {

        //printf("%02x", serial->data[i]);

        [strappendString:[NSStringstringWithFormat:@"%02x",serial->data[i]]];

    }

    //小写转大写

    // str_SN=str.uppercaseString;

    //奇数补0操作

    if(str_SN.length%2==1) {

        str_SN=[NSStringstringWithFormat:@"0%@",str_SN];

    }

    returnstr_SN;

}

/** 获取版本号 */

-(NSString*)get_version:(X509* )m_px{

    NSString* str_version=@"";

    NSIntegerver =X509_get_version(m_px);

    //    NSLog(@"ver=%zi",ver);

    switch(ver){

        case0:    //V1

            //...

            str_version=@"V1";

            break;

        case1:    //V2

            //...

            str_version=@"V2";

            break;

        case2:    //V3

            //...

            str_version=@"V3";

            break;

        default:

            //Error!

            break;

    }

    returnstr_version;

}

/** 获取issuer 以及 issuer_sn */

-(NSDictionary*)get_issuer_nameAnd_issuer_sn:(X509* )m_px{

    NSMutableDictionary * dict_issuer =[[NSMutableDictionary alloc]init];

    [dict_issuersetObject:@""forKey:@"issuer_name"];

    [dict_issuersetObject:@""forKey:@"issuer_sn"];

    //解析

    //    NSMutableString *certInfo = [[NSMutableString alloc]init];

    //    NSMutableString *certCN = [[NSMutableString alloc]init];

    //    NSMutableString * _serialNumber = [[NSMutableString alloc]init];

    //    NSMutableString * _allCertsList = [[NSMutableString alloc]init];

    inti;

    intentriesNum;

    X509_NAME_ENTRY*name_entry;

    longNid;

    unsignedcharmsginfo[1024];

    intmsginfoLen;

    //获取证书颁发者信息,X509_NAME结构体保存了多项信息,包括国家、组织、部门、通用名、mail等。

    X509_NAME* issuer =X509_get_issuer_name(m_px);

    entriesNum =sk_X509_NAME_ENTRY_num(issuer->entries);            //获取X509_NAME条目个数

    //循环读取各条目信息

    for(i=0;i

        {

            //获取第I个条目值

            name_entry =sk_X509_NAME_ENTRY_value(issuer->entries,i);

            //获取对象ID

            Nid =OBJ_obj2nid(name_entry->object);

            msginfoLen=name_entry->value->length;

            memcpy(msginfo,name_entry->value->data,msginfoLen);

            msginfo[msginfoLen]='\0';

            //根据NID打印出信息

            //          NSLog(@"issuer type is %d",name_entry->value->type);

            switch(Nid)

            {

                caseNID_countryName://国家C

                    //printf("issuer 's C:%s\n",msginfo);

                    //[certInfo appendString:[NSString stringWithFormat:@"C=%s,",msginfo]];

                    //[certCN appendString:[NSString stringWithFormat:@"C=%s",msginfo]];

                    break;

                caseNID_stateOrProvinceName://ST

                    //printf("issuer 's ST:%s\n",msginfo);

                    //[certInfo appendString:[NSString stringWithFormat:@"ST=%s,",msginfo]];

                    break;

                caseNID_localityName://地区L

                    //printf("issuer 's L:%s\n",msginfo);

                    //[certInfo appendString:[NSString stringWithFormat:@"L=%s,",msginfo]];

                    break;

                caseNID_organizationName://组织O

                    //printf("issuer 's O:%s\n",msginfo);

                    //[certInfo appendString:[NSString stringWithFormat:@"O=%s,",msginfo]];

                    break;

                caseNID_organizationalUnitName://单位OU

                    //printf("issuer 's OU:%s\n",msginfo);

                    //[certInfo appendString:[NSString stringWithFormat:@"OU=%s,",msginfo]];

                    break;

                caseNID_commonName://通用名CN

                    //printf("issuer 's CN:%s\n",msginfo);

                    //[certInfo appendString:[NSString stringWithFormat:@"CN=%s",msginfo]];

                    [dict_issuersetObject:[NSStringstringWithFormat:@"%s",msginfo]forKey:@"issuer_name"];

                    break;

                caseNID_pkcs9_emailAddress://Mail

                    //printf("issuer 's emailAddress:%s\n",msginfo);

                    break;

                caseNID_serialNumber://issuerSN

                    //NSLog(@"issuer 's SN:%zi\n",Nid);

                    //[certInfo appendString:[NSString stringWithFormat:@"sn=%s",msginfo]];

                    [dict_issuersetObject:[NSStringstringWithFormat:@"%s",msginfo]forKey:@"issuer_sn"];

                    break;

                default:

                    break;

            }

        }

        //[_allCertsList appendString:certInfo];

        //[_allCertsList appendString:@"|"];

        returndict_issuer;

        }

```

/**************************************************************************************/

/**************************************************************************************/

/**************************************************************************************/

/**************************************************************************************/

改:下边为解析源码,需要的自行复制:

/**************************************************************************************/

//

//  JJDEAnalyticalCert.m

//  EIDprepareForSDK

//

//  Created by yyb on 2018/5/2.

//  Copyright © 2018年 yyb. All rights reserved.

//

#import "JJDEAnalyticalCert.h"

#import"x509.h"

#import "x509v3.h"

#import "x509_vfy.h"

#import "JJDEGetCertInfo.h"

@interface JJDEAnalyticalCert()

@property (nonatomic,copy) Id_Block sendBlock;

@end

@implementationJJDEAnalyticalCert

//全局变量

static JJDEAnalyticalCert * _instance = nil;

//单例方法

+(instancetype)shareBlueTooth{

    return[[selfalloc]init];

}

////alloc会调用allocWithZone:

+(instancetype)allocWithZone:(struct_NSZone*)zone{

    //只进行一次

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

        _instance= [superallocWithZone:zone];

    });

    return _instance;

}

//初始化方法

- (instancetype)init{

    //只进行一次

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

        _instance= [superinit];

        ;

    });

    return _instance;

}

-(void)deCardSendInstructions_AnalyticalCertWithString:(NSString*)strName andObj:(NSDictionary*)objc andCompletion:(Id_Block)comBlock{

    JJDEGetCertInfo * degetCertInfo = [JJDEGetCertInfo shareBlueTooth];

    if(degetCertInfo.data_certInfo.length<=0) {

        return;

    }

    NSString * str_data=[JJBluetoothTools convertDataToHexStr:degetCertInfo.data_certInfo];//@"30820316308202BBA00302010202081000000000235751300C06082A811CCF550183750500303E310B3009060355040A0C0247413111300F06035504030C08654944204D494332310F300D06035504050C06303232303132310B300906035504061302434E301E170D3136303931323037333831305A170D3139303931323037333831305A306D314D304B06035504030C44414145397739444A62574C6D6248637744796278623039335446364549436D4A624F41546B5A50794A51414A6B78325644706154655A6351544E7942514F57657645303D310B300906035504060C02434E310F300D060355040A0C063331303030303059301306072A8648CE3D020106082A811CCF5501822D0342000413B29FD275B4A70FE70855280F6CE63CE9BAEC93097A7A71160B9AB5EF357585E71FAFDACD61593912877BA609A9A218ECE1279CA98451787EEA75C8DF9BF1CEA38201703082016C302B0603551D0E0424042204209FA4361184D90E43424EDB2A563EB2739CBAD0319F4367469DD64D21632A39E7302F0603551D23042830268024302280202F4E21716079671BFF36A480BA670C66D1F8D9396F1EAA67F4EC77E8F9D1FCB3300C0603551D1304053003010100300B0603551D0F0404030206C0301D0603551D250416301406082B0601050507030206082B0601050507030430360603551D20042F302D302B06082A811C86EF580202301F301D06082B060105050702011611687474703A2F2F6569642E636E2F637073301106096086480186F8420101040403020780303E06082B0601050507010104323030302E06082B060105050730028622687474703A2F2F63657274732E6569642E636E2F6549444D4943526F6F742E63657230470603551D1F0440303E303CA03AA0388636687474703A2F2F63726C2E6569642E636E2F646F776E6C6F61642F534D325F6549442532304D4943325F67726F7570305F622E63726C300C06082A811CCF550183750500034700304402201F6EFA9BAC64B381DEE7F49112CB6BB04BA9114708D4EFA63F45EC8FF945947C02204C3F481BCB8C6A0ADFF53440B83D35E23EB4BF041782D027F52B3DDF69CE5FE9";

    NSData* lpCertData =[JJBluetoothToolshexToBytes:str_data];

    Byte* bytes_lpCertData =(Byte*)[lpCertDatabytes];//031A

    X509* m_px=d2i_X509(NULL, (unsignedcharconst**)&bytes_lpCertData,794);

   //获取版本号

    //NSString * string_version = [self get_version:m_px];

    //获取SN

    NSString* string_SN =[selfget_SN:m_px];

    //获取颁发者名字和颁发者序列号

    NSDictionary* dict_issuer = [selfget_issuer_nameAnd_issuer_sn:m_px];

    //NSLog(@"%@",dict_issuer);

    //颁发者名字

    NSString* string_issuer_name=dict_issuer[@"issuer_name"];

    //颁发者序列号

    NSString* string_issuer_sn=dict_issuer[@"issuer_sn"];

    if(string_SN.length>0&& string_issuer_name.length>0&& string_issuer_sn.length>0) {

        self.string_SN=string_SN;

        self.string_issuer_name=string_issuer_name;

        self.string_issuer_sn=string_issuer_sn;

        if(comBlock) {

            comBlock(@{@"status":@"1",@"msg":@"证书解析成功"});

        }

    }else{

        self.string_SN=nil;

        self.string_issuer_name=nil;

        self.string_issuer_sn=nil;

        if(comBlock) {

            comBlock(@{@"status":@"0",@"msg":@"证书解析失败"});

        }

    }

}

/** 获取SN */

-(NSString*)get_SN:(X509* )m_px{

 NSString* str_SN=@"";

    ASN1_INTEGER*serial =X509_get_serialNumber(m_px);

    //打印证书序列号

    //printf("serialNumber is: \n");

    NSMutableString *str = [[NSMutableString alloc] init];

    for(inti =0; i < serial->length; i++)

    {

        //printf("%02x", serial->data[i]);

        [strappendString:[NSStringstringWithFormat:@"%02x",serial->data[i]]];

    }

    //小写转大写

    //str_SN=str.uppercaseString;

    //奇数补0操作

    if(str_SN.length%2==1) {

        str_SN=[NSStringstringWithFormat:@"0%@",str_SN];

    }

    returnstr_SN;

}

/** 获取版本号 */

-(NSString*)get_version:(X509* )m_px{

    NSString* str_version=@"";

    NSIntegerver =X509_get_version(m_px);

//    NSLog(@"ver=%zi",ver);

    switch(ver)

    {

        case0:    //V1

            //...

            str_version=@"V1";

            break;

        case1:    //V2

            //...

            str_version=@"V2";

            break;

        case2:    //V3

            //...

            str_version=@"V3";

            break;

        default:

            //Error!

            break;

    }

    returnstr_version;

}

/** 获取issuer 以及 issuer_sn */

-(NSDictionary*)get_issuer_nameAnd_issuer_sn:(X509* )m_px{

    NSMutableDictionary * dict_issuer =[[NSMutableDictionary alloc]init];

    [dict_issuersetObject:@""forKey:@"issuer_name"];

    [dict_issuersetObject:@""forKey:@"issuer_sn"];

    //解析

//    NSMutableString *certInfo = [[NSMutableString alloc]init];

//    NSMutableString *certCN = [[NSMutableString alloc]init];

//    NSMutableString * _serialNumber = [[NSMutableString alloc]init];

//    NSMutableString * _allCertsList = [[NSMutableString alloc]init];

    inti;

    intentriesNum;

    X509_NAME_ENTRY*name_entry;

    longNid;

    unsignedcharmsginfo[1024];

    intmsginfoLen;

    //获取证书颁发者信息,X509_NAME结构体保存了多项信息,包括国家、组织、部门、通用名、mail等。

    X509_NAME* issuer =X509_get_issuer_name(m_px);

    entriesNum =sk_X509_NAME_ENTRY_num(issuer->entries);            //获取X509_NAME条目个数

    //循环读取各条目信息

    for(i=0;i

    {

        //获取第I个条目值

        name_entry =sk_X509_NAME_ENTRY_value(issuer->entries,i);

        //获取对象ID

        Nid =OBJ_obj2nid(name_entry->object);

        msginfoLen=name_entry->value->length;

        memcpy(msginfo,name_entry->value->data,msginfoLen);

        msginfo[msginfoLen]='\0';

        //根据NID打印出信息

        //          NSLog(@"issuer type is %d",name_entry->value->type);

        switch(Nid)

        {

            case NID_countryName://国家C

                //printf("issuer 's C:%s\n",msginfo);

                //[certInfo appendString:[NSString stringWithFormat:@"C=%s,",msginfo]];

                //[certCN appendString:[NSString stringWithFormat:@"C=%s",msginfo]];

                break;

            case NID_stateOrProvinceName://省ST

                //printf("issuer 's ST:%s\n",msginfo);

                //[certInfo appendString:[NSString stringWithFormat:@"ST=%s,",msginfo]];

                break;

            case NID_localityName://地区L

                //printf("issuer 's L:%s\n",msginfo);

                //[certInfo appendString:[NSString stringWithFormat:@"L=%s,",msginfo]];

                break;

            case NID_organizationName://组织O

                //printf("issuer 's O:%s\n",msginfo);

                //[certInfo appendString:[NSString stringWithFormat:@"O=%s,",msginfo]];

                break;

            case NID_organizationalUnitName://单位OU

                //printf("issuer 's OU:%s\n",msginfo);

                //[certInfo appendString:[NSString stringWithFormat:@"OU=%s,",msginfo]];

                break;

            case NID_commonName://通用名CN

                //printf("issuer 's CN:%s\n",msginfo);

                //[certInfo appendString:[NSString stringWithFormat:@"CN=%s",msginfo]];

                [dict_issuersetObject:[NSStringstringWithFormat:@"%s",msginfo]forKey:@"issuer_name"];

                break;

            case NID_pkcs9_emailAddress://Mail

                //printf("issuer 's emailAddress:%s\n",msginfo);

                break;

            case NID_serialNumber://issuerSN

                //NSLog(@"issuer 's SN:%zi\n",Nid);

                //[certInfo appendString:[NSString stringWithFormat:@"sn=%s",msginfo]];

                [dict_issuersetObject:[NSStringstringWithFormat:@"%s",msginfo]forKey:@"issuer_sn"];

                break;

            default:

                break;

        }

    }

    //[_allCertsList appendString:certInfo];

    //[_allCertsList appendString:@"|"];

    returndict_issuer;

}

@end

```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容