1. 第一步先去認(rèn)真看下下邊這兩個(gè)連接,了解一下這個(gè)x509證書解析到底是個(gè)什么玩意
http://www.360doc.com/content/16/0407/16/3242454_548621325.shtml
了解之后大約需要做三步:第一步導(dǎo)入openssl庫(kù),如何導(dǎo)入自行百度,注意路徑問(wèn)題,
第二部:將證書導(dǎo)入結(jié)構(gòu)體
第三部就是證書解析:我這只解析了證書版本,證書序列號(hào)(sn),證書頒發(fā)者名字(issuer_name),證書頒發(fā)者序列號(hào)(issuer_sn)
```
/** 獲取SN */
-(NSString*)get_SN:(X509* )m_px{
? ? NSString* str_SN=@"";
? ? ASN1_INTEGER*serial =X509_get_serialNumber(m_px);
? ? //打印證書序列號(hào)
? ? //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]]];
? ? }
? ? //小寫轉(zhuǎn)大寫
? ? // str_SN=str.uppercaseString;
? ? //奇數(shù)補(bǔ)0操作
? ? if(str_SN.length%2==1) {
? ? ? ? str_SN=[NSStringstringWithFormat:@"0%@",str_SN];
? ? }
? ? returnstr_SN;
}
/** 獲取版本號(hào) */
-(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;
? ? //獲取證書頒發(fā)者信息农渊,X509_NAME結(jié)構(gòu)體保存了多項(xiàng)信息,包括國(guó)家、組織榨惠、部門债查、通用名验庙、mail等质况。
? ? X509_NAME* issuer =X509_get_issuer_name(m_px);
? ? entriesNum =sk_X509_NAME_ENTRY_num(issuer->entries);? ? ? ? ? ? //獲取X509_NAME條目個(gè)數(shù)
? ? //循環(huán)讀取各條目信息
? ? for(i=0;i
? ? ? ? {
? ? ? ? ? ? //獲取第I個(gè)條目值
? ? ? ? ? ? name_entry =sk_X509_NAME_ENTRY_value(issuer->entries,i);
? ? ? ? ? ? //獲取對(duì)象ID
? ? ? ? ? ? Nid =OBJ_obj2nid(name_entry->object);
? ? ? ? ? ? msginfoLen=name_entry->value->length;
? ? ? ? ? ? memcpy(msginfo,name_entry->value->data,msginfoLen);
? ? ? ? ? ? msginfo[msginfoLen]='\0';
? ? ? ? ? ? //根據(jù)NID打印出信息
? ? ? ? ? ? //? ? ? ? ? NSLog(@"issuer type is %d",name_entry->value->type);
? ? ? ? ? ? switch(Nid)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? caseNID_countryName://國(guó)家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://地區(qū)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;
? ? ? ? }
```
/**************************************************************************************/
/**************************************************************************************/
/**************************************************************************************/
/**************************************************************************************/
改:下邊為解析源碼,需要的自行復(fù)制:
/**************************************************************************************/
//
//? 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會(huì)調(diào)用allocWithZone:
+(instancetype)allocWithZone:(struct_NSZone*)zone{
? ? //只進(jìn)行一次
? ? staticdispatch_once_tonceToken;
? ? dispatch_once(&onceToken, ^{
? ? ? ? _instance= [superallocWithZone:zone];
? ? });
? ? return _instance;
}
//初始化方法
- (instancetype)init{
? ? //只進(jìn)行一次
? ? 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);
?? //獲取版本號(hào)
? ? //NSString * string_version = [self get_version:m_px];
? ? //獲取SN
? ? NSString* string_SN =[selfget_SN:m_px];
? ? //獲取頒發(fā)者名字和頒發(fā)者序列號(hào)
? ? NSDictionary* dict_issuer = [selfget_issuer_nameAnd_issuer_sn:m_px];
? ? //NSLog(@"%@",dict_issuer);
? ? //頒發(fā)者名字
? ? NSString* string_issuer_name=dict_issuer[@"issuer_name"];
? ? //頒發(fā)者序列號(hào)
? ? 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);
? ? //打印證書序列號(hào)
? ? //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]]];
? ? }
? ? //小寫轉(zhuǎn)大寫
? ? //str_SN=str.uppercaseString;
? ? //奇數(shù)補(bǔ)0操作
? ? if(str_SN.length%2==1) {
? ? ? ? str_SN=[NSStringstringWithFormat:@"0%@",str_SN];
? ? }
? ? returnstr_SN;
}
/** 獲取版本號(hào) */
-(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;
? ? //獲取證書頒發(fā)者信息横堡,X509_NAME結(jié)構(gòu)體保存了多項(xiàng)信息,包括國(guó)家谴返、組織煞肾、部門、通用名亏镰、mail等扯旷。
? ? X509_NAME* issuer =X509_get_issuer_name(m_px);
? ? entriesNum =sk_X509_NAME_ENTRY_num(issuer->entries);? ? ? ? ? ? //獲取X509_NAME條目個(gè)數(shù)
? ? //循環(huán)讀取各條目信息
? ? for(i=0;i
? ? {
? ? ? ? //獲取第I個(gè)條目值
? ? ? ? name_entry =sk_X509_NAME_ENTRY_value(issuer->entries,i);
? ? ? ? //獲取對(duì)象ID
? ? ? ? Nid =OBJ_obj2nid(name_entry->object);
? ? ? ? msginfoLen=name_entry->value->length;
? ? ? ? memcpy(msginfo,name_entry->value->data,msginfoLen);
? ? ? ? msginfo[msginfoLen]='\0';
? ? ? ? //根據(jù)NID打印出信息
? ? ? ? //? ? ? ? ? NSLog(@"issuer type is %d",name_entry->value->type);
? ? ? ? switch(Nid)
? ? ? ? {
? ? ? ? ? ? case NID_countryName://國(guó)家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://地區(qū)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
```