私はObjectiveCとHTTPsに非常に慣れていません。この件について教えてください。
HTTPを介してサーバーと通信するためにiPhoneアプリケーションが必要です。自己署名証明書を作成しました。ブラウザを介してURLにアクセスすると、サーバーが信頼されていないという警告メッセージが表示されますが、機能します。それで大丈夫です。
iPhoneアプリからHTTPリクエストを送信します。HTTPS経由でASIHTTPRequestを使用しています。しかし、「接続障害が発生しました:SSLの問題(考えられる原因には、証明書の不良/期限切れ/自己署名、時計の日付が間違っているなど)」というエラーメッセージが表示されます。
私はStackoverflowを閲覧し、次の方法でそれを行うことを学びました。
- ブラウザから証明書をダウンロードし、Xcodeプロジェクトに含めました。
NSDataに証明書をロードします
NSString * fullFileName = @ "myCertificate.cer"; NSString * fileName = [[fullFileName lastPathComponent] stringByDeletingPathExtension]; NSString*拡張=[fullFileNamepathExtension]; NSData * PKCS12Data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:extension]];
アイデンティティを抽出する
[self extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data password:@ "myCertificatePasswordHere"];
HTTPS経由でHTTPリクエストを送信する
ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:myHTTPsURLHere]; [リクエストsetClientCertificateIdentity:identity]; [リクエストstartSynchronous];
ここで多くの人が提案したように、私もASIHTTPRequest.mを変更し、
[sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredCertificates]; [sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredRoots];
IFステートメントに
if (![self validatesSecureCertificate]) {
NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
kCFNull,kCFStreamSSLPeerName,
@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
nil];
CFReadStreamSetProperty((CFReadStreamRef)[self readStream],
kCFStreamPropertySSLSettings,
(CFTypeRef)sslProperties);
[sslProperties release];
}else {
NSMutableDictionary *sslProperties = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithBool:NO], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:NO], kCFStreamSSLAllowsAnyRoot,
[NSNumber numberWithBool:YES], kCFStreamSSLValidatesCertificateChain,
@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel,
nil];
CFReadStreamSetProperty((CFReadStreamRef)[self readStream],
kCFStreamPropertySSLSettings,
(CFTypeRef)sslProperties);
[sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredCertificates]; // Sergey added this line
[sslProperties setObject:(NSString *)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsExpiredRoots]; // Sergey added this line
[sslProperties release];
}
しかし、それは役に立ちません:(。私はまだエラーメッセージを受け取っています:
Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred: SSL problem (Possible causes may include a bad/expired/self-signed certificate, clock set to wrong date)"
クライアント証明書がサーバーによって検証されるように、HTTPを介してASIHTTPRequestを作成する方法を教えてください。プライベートAPIを使いたくない...
どうもありがとうございます!