I'm trying to implement client certificate authentication in the URLSessionDelegate.urlSession(:didReceive:completionHandler:)
by using the URLCredential(identity:certificates:persistence:)
and CryptoKit
, but it appears this is currently not supported. On my client I generate a key and a CSR and after I sent that to the server, I receive an X.509 certificate which I store in the Keychain.
I used to create the keys as SecKey
objects, which were also stored in the Keychain; this works fine. Now I would like to use the CryptoKit
keys, preferably the SecureEnclave.P256
ones. It appears that storing these keys, as suggested by Apple (generic passwords), does not create the SecIdentity
I'm after that's needed to create the URLCredential
, nor have I been able to transform a SecKey
created in the Secure Enclave to a CryptoKit.SecureEnclave.P256
key. The SecKeyCopyExternalRepresentation
function simply returns an error telling me that I cannot export Secure Enclave keys (which is weird, as CryptoKit
's implementation does somewhat allow this).
Also, the URLCredential.init
does not allow you to add a private key directly, nor does the SecIdentity
provide any way of manually creating it, by supplying the right keys and the right certificates.
How can I use CryptoKit
for client certificate authentication or how can I use CryptoKit
or the older SecKey
implementations to create SecIdentity
or URLCredential
objects that will work?