iOS使用的https证书都是.cer格式的,以往服务端给我的证书都是.pem或.crt格式,我通过终端转换为.cer后直接就能用了,很顺利。但是最近换证书服务端给我的格式刚好就是.cer格式,我看格式一样就没在转换了,结果换上证书后,AFN直接闪退了,闪退位置:
[pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)];
后面查了才知道,原来iOS用的.cer证书内容还必须是data格式的
服务端给我的.cer证书:

正确的.cer证书:

解决方案:
- 直接让后端给正确的data格式.cer证书。
- 钥匙串访问证书,右键导出为新的.cer证书。
- 让后端给.pem文件用自己转换(转换命令见后文)。
- 代码转换为data。
- (NSData *)convertCerStringToData:(NSString *)cerStr
{
NSString * pubSpaceStr = [cerStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];
NSString * pubStartStr = [pubSpaceStr stringByReplacingOccurrencesOfString:@"-----BEGIN CERTIFICATE-----" withString:@""];
NSString *pubEndStr = [pubStartStr stringByReplacingOccurrencesOfString:@"-----END CERTIFICATE-----" withString:@""];
NSData *cerData = [[NSData alloc] initWithBase64EncodedString:pubEndStr options:0];
return cerData;
}
附:证书转换命令
pem转换为cer
1.cd到pem证书所在的位置
2.输入此命令即可:openssl x509 -inform pem -in 你的证书名字.pem -outform der -out 你的新证书.cer
crt转换为pem
openssl x509 -in 你的证书名字.crt -out 你的新证书.pem
crt转换为cer
openssl x509 -in 你的证书.crt -out 你的新证书.cer -outform der
本文讲述了iOS开发者在处理HTTPS证书时遇到的问题,发现服务端提供的.cer格式证书需为data格式才能被正确解析。作者提供了.pem和.crt转.cer的转换方法以及相关命令。
809

被折叠的 条评论
为什么被折叠?



