納得がいかないクライアント証明書格納(iOS) | 熱脳しゃちょのブログ

熱脳しゃちょのブログ

おせっかい焼SE兼プログラマ兼……の辛い日々と、思う事なぞ

KeyChainに格納したかったわけである。

間違えてる気がすごくするんだが、これ以外でうまくいかなかったので、一応晒しておく。

 

まず、PKCS12のデコード(certP12Base64にPKCS12、passwordにPrivateKeyのPassword。エラー処理は抜いてる)。

 

    var rawItems: CFArray?
    let importPasswordOption: NSDictionary = [kSecImportExportPassphrase as NSString: password]
    let status = SecPKCS12Import(
            NSData(base64Encoded: certP12Base64, options: Data.Base64DecodingOptions(rawValue: 0))!,
            importPasswordOption,
            &rawItems)
    if(status != errSecSuccess) {
        // error
    }

 

んで、SecIdentityを取り出す。

 

    let items = rawItems! as! Array<Dictionary<String, Any>>
    let firstItem = items[0]
    let identity = firstItem[kSecImportItemIdentity as String] as! SecIdentity

 

これをKeyChainに突っ込みたいのだが、

 

    let addquery = [
//        kSecClass        : kSecClassIdentity,
        kSecValueRef     : identity,
        kSecAttrLabel    : label
    ] as CFDictionary

    var resultRef : AnyObject?
    let status = SecItemAdd(addquery, &resultRef)
    if status != errSecSuccess {
        // error
    }

 

"kSecClassIdentity"を指定したら、保存できなかった。

取得するときは

 

    let getquery = [
        kSecClass         : kSecClassIdentity,
        kSecAttrLabel    : label,
        kSecReturnRef   : kCFBooleanTrue as Any
    ] as CFDictionary

    var resultRef: CFTypeRef?
    let status = SecItemCopyMatching(getquery as CFDictionary, &resultRef);
    if status != errSecSuccess {
        // error
    }
    let identity = resultRef as! SecIdentity?

 

で、差し替えの時は、あらかじめ同じLabelの"Key"を削除する。

 

    let delQuery = [
        kSecClass         : kSecClassKey,
        kSecAttrLabel    : label
    ] as CFDictionary

    SecItemDelete(delQuery)

 

……納得がいかないんだが。