Недействительный https-сертификат WKWebView

Вот код, который я использую для разрешения сертификата:

@interface NSURLRequest(DummyInterface)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host;
+ (void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString*)host;
@end
@implementation NSURLRequest(DummyInterface)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
  return [host isEqualToString:@"mysite.com"];
}
@end

И я инициализирую свой WKWebView следующим образом:

NSURL *urlReq = [NSURL URLWithString:@"mysite.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:urlReq];
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[urlReq host]];

WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
mainWebView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:theConfiguration];
[mainWebView setNavigationDelegate:self];
[mainWebView loadRequest:request];

Он отлично работает для http-сайта, но у меня есть эта ошибка при использовании https:

Сертификат для этого сервера недействителен. Возможно, вы подключаетесь к серверу, выдающему себя за «mysite.com», что может подвергнуть риску вашу конфиденциальную информацию.

Это работало, когда я использовал UIWebView и реализовывал функцию «canAuthenticateAgainstProtectionSpace», но теперь я не понимаю, что мне нужно делать.

Я что-то упустил или WKWebView не может обрабатывать HTTPS?


person Pull    schedule 22.10.2014    source источник
comment
Вы решили эту проблему?   -  person szuniverse    schedule 02.07.2015
comment
Честно говоря, я вернулся к классическому UIWebView, и он отлично работает, я не пробовал новый WKWebView с тех пор... Извините.   -  person Pull    schedule 03.07.2015
comment
У кого-нибудь есть решение для этого? Я застрял прямо сейчас в той же проблеме в WKWebView. Работает нормально в UIWebview с использованием частного API-интерфейса AllowAnyHTTPSCertificateForHost, но в WKWebView не работает.   -  person harshit2811    schedule 03.08.2015


Ответы (3)


Попробуйте этот, у меня сработало

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
  NSLog(@"Allowing all");
  SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
  CFDataRef exceptions = SecTrustCopyExceptions (serverTrust);
  SecTrustSetExceptions (serverTrust, exceptions);
  CFRelease (exceptions);
  completionHandler (NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:serverTrust]);
}

И не забудьте добавить в Info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
person Andrew B    schedule 12.07.2017
comment
Куда добавить первый код? в /platforms/ios/‹Project›/Classes/AppDelegate.m или любом другом файле? Не могли бы вы кратко рассказать о начале и конце кода? Спасибо. - person Kapilrc; 24.03.2020

Не знаю, в чем проблема, но есть сообщения о проблемах WKWebView с SSL: https://code.google.com/p/chromium/issues/detail?id=423444#c3

person Sender    schedule 18.11.2014
comment
Так что похоже это все еще не исправлено... спасибо за информацию - person Pull; 18.11.2014

Это работает для меня

установить webView.navigationDelegate = self

воплощать в жизнь

 func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    let trust = challenge.protectionSpace.serverTrust!
    let exceptions = SecTrustCopyExceptions(trust)
    SecTrustSetExceptions(trust, exceptions)
    completionHandler(.useCredential, URLCredential(trust: trust))
}

И добавьте это в plist с доменами, которые вы хотите разрешить

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPSLoads</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
person Yatheesha    schedule 26.03.2019