什么是数字证书?
数字证书是用来实现信息传输的安全性和真实性认证的一种数字凭据。在数字证书中,一般包含了证书持有者的信息,证书颁发机构(CA)的信息,证书的有效期以及证书的公钥等信息,这些信息都是加密和验证所必需的。
为什么要自签名证书?
在移动端开发中,有时候需要使用到HTTPS协议来保证数据传输的安全性,而HTTPS协议需要使用数字证书来进行通信。通常情况下,我们需要向第三方证书颁发机构购买证书,但是有时候我们只是需要对本地测试环境进行验证,就没有必要花费大量的金钱来购买证书了,这时候可以自签名一个证书,作为测试使用。
如何自签名证书?
首先,我们需要将证书的私钥和证书请求(CSR)生成到本地,可以使用以下命令执行:
openssl req -new -newkey rsa:2048 -nodes -keyout key.pem -out csr.pem
执行上述命令后,会生成一个私钥文件 key.pem 和一个证书请求文件 csr.pem。接着,我们需要使用私钥文件生成一个自签名证书文件,可以使用以下命令执行:
openssl x509 -req -days 365 -in csr.pem -signkey key.pem -out server.crt
执行上述命令后,会生成一个自签名证书文件 server.crt,其中 -days 365 表示证书的有效期。
在iOS上安装自签名证书
接下来,我们需要在iOS设备上安装自签名证书,可以按照以下步骤进行:
将自签名证书文件 server.crt 传到设备上,可以通过邮件、AirDrop等方式。
打开iOS设备上的设置应用,选择通用 -> 关于本机 -> 证书信任设置。
在证书信任设置中,可以发现刚才传入的自签名证书,点击开关按钮,将其信任状态打开。
在信任提示框中,再次点击确认信任。
至此,我们已经成功地在iOS设备上安装了自签名证书。如果需要在应用内使用证书,可以参考以下代码:
// 读取自签名证书
NSString *path = [[NSBundle mainBundle] pathForResource:@"server" ofType:@"crt"];
NSData *certificateData = [NSData dataWithContentsOfFile:path];
NSSet *certificateSet = [NSSet setWithObject:certificateData];
// 设置证书
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.URLCredentialStorage = [NSURLCredentialStorage sharedCredentialStorage];
config.URLCredentialStorage.sessionDidReceiveAuthenticationChallenge = ^(

NSURLSession *session,
NSURLAuthenticationChallenge *challenge,
NSURLCredential *__autoreleasing *_credential) {
*_credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
[challenge.sender useCredential:*_credential forAuthenticationChallenge:challenge];
};
config.TLSMinimumSupportedProtocol = kTLSProtocol12;
config.TLSMaximumSupportedProtocol = kTLSProtocol12;
config.TLSMinimumSupportedProtocol = kTLSProtocol12;
config.TLSMaximumSupportedProtocol = kTLSProtocol12;
config.connectionProxyDictionary = @{};
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
// 发送HTTPS请求
NSURL *url = [NSURL URLWithString:@"https://localhost:8080/test"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.allHTTPHeaderFields = @{@"Content-Type": @"application/json"};
request.HTTPBody = [@"{"data":"test"}" dataUsingEncoding:NSUTF8StringEncoding];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
[dataTask resume];