iOS中的证书固定

时间:2013-09-05 14:18:00

标签: ios objective-c ssl

如何通过硬编码在iOS中固定SSL证书(DER格式)?

例如,目前您可以使用以下内容:

NSData *mydata = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] 
                     URLForResource:@"mycert" withExtension:@"cer"]];

然后使用bytes提供的方法获取证书lengthNSData

是否可以将其存储为char数组?

我问这个问题,因为如果你将证书文件存储在捆绑包中,那么任何人都可以将它换成另一个证书。

1 个答案:

答案 0 :(得分:3)

这是可能的。一种方法是暂时导入证书:

NSData *mydata = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"mycert" withExtension:@"cer"]];

然后只需将其记录下来:

NSLog(@"%@",myData);

这将输出一些由<包围的长字符串。和>符号。

NSData对象的示例输出:

<6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8>

复制此输出并将其硬编码到.m文件的顶部。这样它就会被编译成非人类可读的代码。

以下是实现此目的的方法:

#define CERT_DATA @"<6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8>"

下一部分是使这种方法有效的关键。您必须 将NSData的字符串表示形式转换回NSData

这是一个完全符合这个意义的方法:

-(void)yourMethodThatNeedsCertData
{
     NSData *certData = [self dataFromHexString:[[[CERT_DATA stringByReplacingOccurrencesOfString:@"<" withString:@""]stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""]];
}

- (NSData *)dataFromHexString:(NSString *)string
{
    // Converts the NSData string representation back into NSData object
    const char *chars = [string UTF8String];
    int i = 0, len = string.length;

    NSMutableData *data = [NSMutableData dataWithCapacity:len / 2];
    char byteChars[3] = {'\0','\0','\0'};
    unsigned long wholeByte;

    while (i < len)
    {
        byteChars[0] = chars[i++];
        byteChars[1] = chars[i++];
        wholeByte = strtoul(byteChars, NULL, 16);
        [data appendBytes:&wholeByte length:1];
    }
    return data;
}

请注意,您必须通过删除所有空格和'&lt;'来“清理”NSData字符串CERT_DATA。 '&GT;'字符。祝你好运,我希望这有帮助!