我目前正在尝试使用自签名证书连接到服务器.我正在使用NSURLConnection连接到服务器.如何确保我只信任正确的服务器并取消所有其他连接?我使用以下代码
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
SecTrustResultType results;
SecTrustRef trust = [[challenge protectionSpace] serverTrust];
SecTrustEvaluate(trust, &results);
if (results == kSecTrustResultProceed || results == kSecTrustResultConfirm) {
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
} else {
[challenge.sender cancelAuthenticationChallenge:challenge];
}
}
Run Code Online (Sandbox Code Playgroud)
目前SecTrustEvaluate
总是返回结果等于kSecTrustResultRecoverableTrustFailure
.我已使用iphone配置实用程序在手机上安装了带证书的配置文件,并将其标记为已验证,但未更改结果.
任何人都可以帮我获得任何一个kSecTrustResultProceed
或kSecTrustResultConfirm
自签名证书的信任结果吗?
我想阻止我的应用程序/服务器通信从MITM攻击,所以我试图设置SSL固定,但我在使用自签名证书使用AFNetworking 2.2时遇到问题.我认为这主要是我如何生成证书的问题.
我首先尝试根据这些说明生成自签名证书:
生成私钥:
sudo openssl genrsa -des3 -out server.key 2048
Run Code Online (Sandbox Code Playgroud)
生成签名请求,并在询问公共名称时使用域名:
sudo openssl req -new -key server.key -out server.csr
Run Code Online (Sandbox Code Playgroud)
生成证书:
sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Run Code Online (Sandbox Code Playgroud)
最后,将其转换为der
格式(因为AFNetworking 需要它)
sudo openssl x509 -outform der -in server.crt -out server.der
Run Code Online (Sandbox Code Playgroud)
服务器是Ubuntu 12.04,运行ngninx + passenger来提供Rails 4应用程序.这是我的nginx服务器配置打开SSL的位:
server {
listen 80;
listen 443;
server_name myapp.com;
passenger_enabled on;
root /var/www/myapp/current/public;
rails_env production;
ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
}
Run Code Online (Sandbox Code Playgroud)
重新启动nginx后,下载der
文件,将其添加到我的项目,并将其重命名为"server.cer"(因为AFNetworking要求证书使用.cer扩展名),我使用此代码打开我的AFHTTPSessionManager
子类的SSL固定: …
我想与我的服务器安全地沟通,这就是我在做什么......
NSURLProtectionSpace *protectionSpace = [challenge protectionSpace];
SecTrustRef trust = [protectionSpace serverTrust];
NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];
SecPolicyRef myPolicy = SecPolicyCreateBasicX509();
NSArray * certs = [[NSArray alloc] initWithObjects:(id)certificate,nil]; //certificate is my server's cert.
credential = [NSURLCredential credentialForTrust:trust];
SecTrustSetAnchorCertificates(trust,
(CFArrayRef) [NSArray arrayWithObject:(id) certificate ]);
OSStatus status = SecTrustCreateWithCertificates(certs, myPolicy, &trust);
SecTrustResultType trustResult = 0;
if (status == noErr) {
status = SecTrustEvaluate(trust, &trustResult);
}
NSLog(@"Trust I get: %d", trustResult);
[certs release];
if (trustResult == kSecTrustResultRecoverableTrustFailure) {
NSLog(@"Recoverable Failure");
CFAbsoluteTime trustTime,currentTime,timeIncrement,newTime;
CFDateRef newDate; …
Run Code Online (Sandbox Code Playgroud) 我想在iOS应用程序中以编程方式创建证书.我能找到的最接近的API是SecCertificateCreateWithData,它需要DER编码的二进制输入.
鉴于我有所有可用的数据作为运行时对象,我如何构造DER编码的二进制数据输入?
ssl ×3
ios ×2
certificate ×1
cocoa-touch ×1
https ×1
ios4 ×1
iphone ×1
nginx ×1
objective-c ×1
openssl ×1
pki ×1
security ×1