В собственном приложении реагирования я пытаюсь добавить определенный и его закрытый ключ в ключевое слово iOs, поэтому я пытаюсь использовать следующий код, но у меня возникает ошибка с SecItemAdd при попытке добавить закрытый ключ (ошибка -50) .
Как вы можете видеть из приведенного ниже кода и из информации, которую мне удалось получить, я очищаю исходные строки от их BEGIN/END благодаря StripPEMHeader, а затем преобразую строки в NSData.
Как это правильно сделать?
- (SecIdentityRef)createIdentityWithCert:(NSString *)pemCert privateKey:(NSString *)pemKey {
RCTLogWarn(@"createIdentity: Starting identity creation");
// Strip PEM headers and convert to data
NSString *cleanedCert = [self stripPEMHeader:pemCert prefix:@"CERTIFICATE"];
NSString *cleanedKey = [self stripPEMHeader:pemKey prefix:@"PRIVATE KEY"];
// RCTLogWarn(@"createIdentity: Cleaned cert length: %lu, key length: %lu",
// (unsigned long)cleanedCert.length,
// (unsigned long)cleanedKey.length);
NSData *certData = [[NSData alloc] initWithBase64EncodedString:cleanedCert
options:NSDataBase64DecodingIgnoreUnknownCharacters];
NSData *keyData = [[NSData alloc] initWithBase64EncodedString:cleanedKey
options:NSDataBase64DecodingIgnoreUnknownCharacters];
if (!certData || !keyData) {
RCTLogWarn(@"createIdentity: Failed to create data from base64");
return NULL;
}
// First, generate key pair and store private key
NSDictionary *keyAttributes = @{
(__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeRSA,
(__bridge id)kSecAttrKeyClass: (__bridge id)kSecAttrKeyClassPrivate,
(__bridge id)kSecValueData: keyData,
(__bridge id)kSecAttrKeySizeInBits: @2048,
(__bridge id)kSecAttrIsPermanent: @YES,
(__bridge id)kSecAttrApplicationTag: [@"com.yourdomain.app.key" dataUsingEncoding:NSUTF8StringEncoding]
};
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)keyAttributes, NULL);
if (status != errSecSuccess && status != errSecDuplicateItem) {
RCTLogWarn(@"createIdentity: Failed to store private key, status: %d", (int)status);
return NULL;
}
// Create certificate reference
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certData);
if (!cert) {
RCTLogWarn(@"createIdentity: Failed to create certificate from data");
return NULL;
}
// Store certificate in keychain
NSDictionary *certAttributes = @{
(__bridge id)kSecClass: (__bridge id)kSecClassCertificate,
(__bridge id)kSecValueRef: (__bridge id)cert,
(__bridge id)kSecAttrIsPermanent: @YES
};
status = SecItemAdd((__bridge CFDictionaryRef)certAttributes, NULL);
if (status != errSecSuccess && status != errSecDuplicateItem) {
RCTLogWarn(@"createIdentity: Failed to store certificate, status: %d", (int)status);
if (cert) CFRelease(cert);
return NULL;
}
// Query for the identity
NSDictionary *identityQuery = @{
(__bridge id)kSecClass: (__bridge id)kSecClassIdentity,
(__bridge id)kSecReturnRef: @YES,
(__bridge id)kSecMatchLimit: (__bridge id)kSecMatchLimitOne
};
SecIdentityRef identity = NULL;
status = SecItemCopyMatching((__bridge CFDictionaryRef)identityQuery, (CFTypeRef *)&identity);
if (status != errSecSuccess || !identity) {
RCTLogWarn(@"createIdentity: Failed to find identity, status: %d", (int)status);
} else {
RCTLogWarn(@"createIdentity: Successfully found identity");
}
if (cert) CFRelease(cert);
return identity;
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... ertificate
Создание удостоверения на основе сертификата и закрытого ключа на iOS (SecItemAdd, SecCertificateCreateWithData,...) ⇐ IOS
Программируем под IOS
1737234656
Anonymous
В собственном приложении реагирования я пытаюсь добавить определенный и его закрытый ключ в ключевое слово iOs, поэтому я пытаюсь использовать следующий код, но у меня возникает ошибка с SecItemAdd при попытке добавить закрытый ключ (ошибка -50) .
Как вы можете видеть из приведенного ниже кода и из информации, которую мне удалось получить, я очищаю исходные строки от их BEGIN/END благодаря StripPEMHeader, а затем преобразую строки в NSData.
Как это правильно сделать?
- (SecIdentityRef)createIdentityWithCert:(NSString *)pemCert privateKey:(NSString *)pemKey {
RCTLogWarn(@"createIdentity: Starting identity creation");
// Strip PEM headers and convert to data
NSString *cleanedCert = [self stripPEMHeader:pemCert prefix:@"CERTIFICATE"];
NSString *cleanedKey = [self stripPEMHeader:pemKey prefix:@"PRIVATE KEY"];
// RCTLogWarn(@"createIdentity: Cleaned cert length: %lu, key length: %lu",
// (unsigned long)cleanedCert.length,
// (unsigned long)cleanedKey.length);
NSData *certData = [[NSData alloc] initWithBase64EncodedString:cleanedCert
options:NSDataBase64DecodingIgnoreUnknownCharacters];
NSData *keyData = [[NSData alloc] initWithBase64EncodedString:cleanedKey
options:NSDataBase64DecodingIgnoreUnknownCharacters];
if (!certData || !keyData) {
RCTLogWarn(@"createIdentity: Failed to create data from base64");
return NULL;
}
// First, generate key pair and store private key
NSDictionary *keyAttributes = @{
(__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeRSA,
(__bridge id)kSecAttrKeyClass: (__bridge id)kSecAttrKeyClassPrivate,
(__bridge id)kSecValueData: keyData,
(__bridge id)kSecAttrKeySizeInBits: @2048,
(__bridge id)kSecAttrIsPermanent: @YES,
(__bridge id)kSecAttrApplicationTag: [@"com.yourdomain.app.key" dataUsingEncoding:NSUTF8StringEncoding]
};
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)keyAttributes, NULL);
if (status != errSecSuccess && status != errSecDuplicateItem) {
RCTLogWarn(@"createIdentity: Failed to store private key, status: %d", (int)status);
return NULL;
}
// Create certificate reference
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certData);
if (!cert) {
RCTLogWarn(@"createIdentity: Failed to create certificate from data");
return NULL;
}
// Store certificate in keychain
NSDictionary *certAttributes = @{
(__bridge id)kSecClass: (__bridge id)kSecClassCertificate,
(__bridge id)kSecValueRef: (__bridge id)cert,
(__bridge id)kSecAttrIsPermanent: @YES
};
status = SecItemAdd((__bridge CFDictionaryRef)certAttributes, NULL);
if (status != errSecSuccess && status != errSecDuplicateItem) {
RCTLogWarn(@"createIdentity: Failed to store certificate, status: %d", (int)status);
if (cert) CFRelease(cert);
return NULL;
}
// Query for the identity
NSDictionary *identityQuery = @{
(__bridge id)kSecClass: (__bridge id)kSecClassIdentity,
(__bridge id)kSecReturnRef: @YES,
(__bridge id)kSecMatchLimit: (__bridge id)kSecMatchLimitOne
};
SecIdentityRef identity = NULL;
status = SecItemCopyMatching((__bridge CFDictionaryRef)identityQuery, (CFTypeRef *)&identity);
if (status != errSecSuccess || !identity) {
RCTLogWarn(@"createIdentity: Failed to find identity, status: %d", (int)status);
} else {
RCTLogWarn(@"createIdentity: Successfully found identity");
}
if (cert) CFRelease(cert);
return identity;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79367975/creating-identity-from-a-cert-and-private-key-on-ios-secitemadd-seccertificate[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия