Подтвердить что ты не робот

Сертификаты клиентов и идентификаторы в iOS

Я создал секретный ключ и открытый ключ для моего приложения 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". Итак, я думаю, что открытый ключ может быть в порядке?

4b9b3361

Ответ 1

Обычный способ создания SSL-сертификатов заключается в том, что закрытый ключ используется для генерации CSR, информации о запросе сертификата. На самом деле, вы скрываете информацию о компании, электронной почте и т.д. С этой ключевой подписью. После этого CSR вы подписываете свой сертификат, поэтому он будет связан с вашим личным ключом и информацией, хранящейся в CSR, и никогда не будет публичным ключом. В настоящее время я не могу видеть в проекте IOS CSR Generation, где вы можете передать свой сгенерированный ключ: мне кажется, что CSR, сгенерированный проектом IOS CSR Generation, использует его собственный сгенерированный ключ или вообще не имеет закрытого ключа. Тогда получится логика с тем, что вы не можете извлечь закрытый ключ из CER или DER, потому что его нет.