###前提・実現したいこと
p12ファイルを利用して認証が必要なサイトをWKWebViewで表示をさせたく
いろいろなサイトを調べてみましたが、以下のようにBad Requestエラーが発生しています。
原因が全くわかっておらず、「こういう所を確認したのか?」などの
ヒントとなるような情報でも構いませんのでコメントよろしくお願い致します。
情報が不足していたら、その点も指摘して頂ければと思います。
###発生している問題・エラーメッセージ
WKWebView上では下記のエラーメッセージが表示されています。
[400 Bad Request No required SSL certificate was sent]
XCode上にはエラーログはありませんでした。
###該当のソースコード
【info.plist】(一部抜粋)
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>XXX.YYY.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
【ViewController.swift】
import UIKit
import WebKit
class ViewController: UIViewController , WKNavigationDelegate {
var webView: WKWebView!
// 接続先URL
let URL_TEST : String = "https://XXX.YYY.com/"
override func viewDidLoad() { super.viewDidLoad() self.webView = WKWebView(frame: self.view.frame) self.webView.navigationDelegate = self self.view.addSubview(webView) self.loadWebView() } func loadWebView() { // 接続先のURL let url = NSURL(string: URL_TEST) // 認証するためのURL let request = NSMutableURLRequest(URL: url!) // webViewのロードを開始 self.webView.loadRequest(request) } // MARK: - WKNavigationDelegate methods func webView(webView: WKWebView, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { let challengeStr : NSString = challenge.protectionSpace.authenticationMethod if challengeStr == (NSURLAuthenticationMethodServerTrust) { let urlCredential:NSURLCredential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!) completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, urlCredential); } else if challengeStr == NSURLAuthenticationMethodClientCertificate{ let identityAndTrust:IdentityAndTrust = self.extractIdentity(); let urlCredential:NSURLCredential = NSURLCredential( identity: identityAndTrust.identityRef, certificates: identityAndTrust.certArray as? [AnyObject], persistence: NSURLCredentialPersistence.ForSession); completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, urlCredential); } } /** * 読み込み開始時 */ func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation) { print("webView:(webView) didStartProvisionalNavigation:(navigation)") } // MARK: - p12ファイル関連 struct IdentityAndTrust { var identityRef:SecIdentityRef var trust:SecTrustRef var certArray:AnyObject } func extractIdentity() -> IdentityAndTrust { var identityAndTrust:IdentityAndTrust! var securityError:OSStatus = errSecSuccess // p12ファイル作成 let path: String = NSBundle.mainBundle().pathForResource("XXXXXXXXXX", ofType: "p12")! let PKCS12Data = NSData(contentsOfFile:path)! let key : NSString = kSecImportExportPassphrase as NSString let options : NSDictionary = [key : "password"] var items : CFArray? securityError = SecPKCS12Import(PKCS12Data, options, &items) if securityError == errSecSuccess { print(" --- p12ファイルの読み込み成功 --- ") let certItems:CFArray = items as CFArray!; let certItemsArray:Array = certItems as Array let dict:AnyObject? = certItemsArray.first; if let certEntry:Dictionary = dict as? Dictionary<String, AnyObject> { // grab the identity let identityPointer:AnyObject? = certEntry["identity"]; let secIdentityRef:SecIdentityRef = identityPointer as! SecIdentityRef!; // grab the trust let trustPointer:AnyObject? = certEntry["trust"]; let trustRef:SecTrustRef = trustPointer as! SecTrustRef; // grab the cert let chainPointer:AnyObject? = certEntry["chain"]; identityAndTrust = IdentityAndTrust(identityRef: secIdentityRef, trust: trustRef, certArray: chainPointer!); } } else { print(" --- p12ファイルの読み込み失敗 --- ") } return identityAndTrust; }
}
###試したこと
Bad Requestが発生している事からp12ファイルの設定や読み込み周りを調査してみましたが、解決には至ってはおりません。
また処理の流れをデバッグで確認してみたところ、
WKWebViewをloadRequestした後に認証のdelegateメソッド(didReceiveAuthenticationChallenge)が実行されたいたので、
didStartProvisionalNavigation にて、再度表示を試してみたのですが、問題は解消されませんでした。
NSURLSessionでの疎通確認は取れています。
###補足情報(言語/FW/ツール等のバージョンなど)
XCode 8.1
Swift 2
iOS9, iOS10
WebKit.framework追加済み
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/26 04:08
2016/12/26 04:22 編集
2016/12/26 05:31
2018/01/30 09:47