Я создал секретный ключ и открытый ключ для моего приложения iOS на основе Swift, используя функцию SecKeyGeneratePair
.
Затем я сгенерировал запрос подписи сертификата с использованием генерация iOS CSR, и мой сервер ответил цепочкой сертификатов в формате PEM.
Я преобразовал PEM-сертификат в DER-формат, используя следующий код:
var modifiedCert = certJson.replacingOccurrences(of: "-----BEGIN CERTIFICATE-----", with: "")
modifiedCert = modifiedCert.replacingOccurrences(of: "-----END CERTIFICATE-----", with: "")
modifiedCert = modifiedCert.replacingOccurrences(of: "\n", with: "")
let dataDecoded = NSData(base64Encoded: modifiedCert, options: [])
Теперь я должен создать сертификат из DER-данных, используя let certificate = SecCertificateCreateWithData(nil, certDer)
Мой вопрос следующий: Как я могу подключить сертификат с закрытым ключом, который я создал в начале, и получить идентификатор, в котором находятся оба из них (ключи и сертификат)? Возможно, добавьте сертификат в цепочку ключей и получите с помощью SecItemCopyMatching
? Я выполнил процедуру, представленную в вопросе Процедура SecIdentityRef
Edit:
При добавлении сертификата в цепочку ключей я получаю ответ на состояние 0, который, я считаю, означает, что сертификат добавлен в цепочку ключей.
let certificate: SecCertificate? = SecCertificateCreateWithData(nil, certDer)
if certificate != nil{
let params : [String: Any] = [
kSecClass as String : kSecClassCertificate,
kSecValueRef as String : certificate!
]
let status = SecItemAdd(params as CFDictionary, &certRef)
print(status)
}
Теперь, когда я пытаюсь получить личность, я получаю статус -25300 (errSecItemNotFound). Для получения тождества используется следующий код. tag - это тег закрытого ключа, который я использовал для создания закрытого/открытого ключа.
let query: [String: Any] = [
kSecClass as String : kSecClassIdentity,
kSecAttrApplicationTag as String : tag,
kSecReturnRef as String: true
]
var retrievedData: SecIdentity?
var extractedData: AnyObject?
let status = SecItemCopyMatching(query as NSDictionary, &extractedData)
if (status == errSecSuccess) {
retrievedData = extractedData as! SecIdentity?
}
Я могу получить секретный ключ и открытый ключ и сертификат из связки ключей с помощью SecItemCopyMatching и добавить сертификат в цепочку ключей, но запрос SecIdentity не работает. Возможно ли, что мой сертификат не соответствует моим ключам? Как это проверяется?
Я распечатал открытый ключ из iOS в формате base64. Было напечатано следующее:
MIIBCgKCAQEAo/MRST9oZpO3nTl243o+ocJfFCyKLtPgO/QiO9apb2sWq4kqexHy
58jIehBcz4uGJLyKYi6JHx/NgxdSRKE3PcjU2sopdMN35LeO6jZ34auH37gX41Sl
4HWkpMOB9v/OZvMoKrQJ9b6/qmBVZXYsrSJONbr+74/mI/m1VNtLOM2FIzewVYcL
HHsM38XOg/kjSUsHEUKET/FfJkozgp76r0r3E0khcbxwU70qc77YPgeJHglHcZKF
ZHFbvNz4E9qUy1mWJvoCmAEItWnyvuw+N9svD1Rri3t5qlaBwaIN/AtayHwJWoWA
/HF+Jg87eVvEErqeT1wARzJL2xv5V1O4ZwIDAQAB
Затем из запроса подписи сертификата я извлек открытый ключ, используя openssl (openssl req -in ios.csr -pubkey -noout). Был напечатан следующий ответ:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo/MRST9oZpO3nTl243o+
ocJfFCyKLtPgO/QiO9apb2sWq4kqexHy58jIehBcz4uGJLyKYi6JHx/NgxdSRKE3
PcjU2sopdMN35LeO6jZ34auH37gX41Sl4HWkpMOB9v/OZvMoKrQJ9b6/qmBVZXYs
rSJONbr+74/mI/m1VNtLOM2FIzewVYcLHHsM38XOg/kjSUsHEUKET/FfJkozgp76
r0r3E0khcbxwU70qc77YPgeJHglHcZKFZHFbvNz4E9qUy1mWJvoCmAEItWnyvuw+
N9svD1Rri3t5qlaBwaIN/AtayHwJWoWA/HF+Jg87eVvEErqeT1wARzJL2xv5V1O4
ZwIDAQAB
-----END PUBLIC KEY----
Похоже, что в начале ключа, генерируемого CSR, существует незначительная разница. (MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A). Основываясь на вопросе шифровании RSA, кажется, что MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A является идентификатором в формате base64 для шифрования RSA "1.2.840.113549.1.1.1". Итак, я думаю, что открытый ключ может быть в порядке?