Установите OpenSSL. Сначала убедитесь, что в вашей системе установлены инструменты OpenSSL. Если он еще не установлен, вы можете скачать и установить его через Homebrew или с официального сайта OpenSSL.
Создайте закрытый ключ корневого сертификата. Используйте OpenSSL для создания файла закрытого ключа корневого сертификата. Выполните следующую команду, чтобы создать 2048-битный файл закрытого ключа RSA (root.key):
openssl genrsa -out root.key 2048
Эта команда создаст новый файл закрытого ключа RSA для подписи и шифрования корневого сертификата.
Создание корневого сертификата. Создайте самозаверяющий корневой сертификат, используя закрытый ключ корневого сертификата. Выполните следующую команду, чтобы создать файл самозаверяющего корневого сертификата (root.crt):
openssl req -x509 -new -key root.key -out root.crt
Выполните следующую команду в терминале, чтобы сгенерировать закрытый ключ:
Создать закрытый ключ, защищенный паролем
openssl genpkey -algorithm RSA -out private.pem -aes256
Или сгенерируйте закрытый ключ без пароля
penssl genpkey -algorithm RSA -out private.pem
Создайте файл запроса сертификата. Для каждого объекта, которому необходимо выдать сертификат (например, сервера или клиента), необходимо создать файл запроса сертификата (файл CSR). Запустите следующую команду, чтобы создать файл запроса сертификата.
openssl req -new -key private.pem -out certificate.csr
Подпишите сертификат. Используйте закрытый ключ корневого сертификата, чтобы подписать запрос на сертификат и создать файл сертификата (certificate.crt). Запустите следующую команду, чтобы создать подписанный файл сертификата: (подчиненный сертификат)
openssl x509 -req -in certificate.csr -CA root.crt -CAkey root.key -CAcreateserial -out certificate.crt
Создайте p12 и установите пароль
openssl pkcs12 -export -in certificate.crt -inkey private.pem -out certificate.p12
Ниже приведен простой пример использования OC p12 для проверки подписи.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *p12Data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"p12"]];
NSDictionary *options = @{(__bridge id)kSecImportExportPassphrase: @"123456"};
CFArrayRef items = NULL;
OSStatus status = SecPKCS12Import((__bridge CFDataRef)p12Data, (__bridge CFDictionaryRef)options, &items);
if (status == errSecSuccess) {
CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);
SecIdentityRef identity = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);
SecCertificateRef certificate = NULL;
SecIdentityCopyCertificate(identity, &certificate);
// Получить закрытый ключ
SecKeyRef privateKey = NULL;
SecIdentityCopyPrivateKey(identity, &privateKey);
// Получить открытый ключ
SecPolicyRef policy = SecPolicyCreateBasicX509();
SecTrustRef trust;
SecTrustCreateWithCertificates(certificate, policy, &trust);
SecTrustResultType trustResult;
SecTrustEvaluate(trust, &trustResult);
SecKeyRef publicKey = SecTrustCopyPublicKey(trust);
NSString *testBase64 = @"Cy4JAEFCQ0QjMTIzNA4uBwAAAAEBAAABCi4gAJjruIAtnUTW0IkHex7/gCKJUb+927IrBoD40CP+nZjdCS4uAHpoYW5nMyZKREpoSkRFd0pFcGpaVGc0V0ZsSE9HZHpkRWcyZWtGeVFXRnZMbVUNLggAAAABAAAAAQAMLkEABHTznz0bpFsvbiYz7gwwVwZEBU2hcRHEwKNDdyGCfKc1IktkBlDqUogUnfqJPUrnkKQCDaEU91zB2aQrBqoAvUo=";
NSData *signData = [[NSData alloc] initWithBase64EncodedString:testBase64 options:0];
SecKeyAlgorithm algorithm = kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA256;
CFErrorRef error = NULL;
NSData *signature = (NSData *)CFBridgingRelease(SecKeyCreateSignature(privateKey, algorithm, (__bridge CFDataRef)signData, &error));
if (error == NULL) {
// Подписано успешно, используйте signature Следовать за
SecKeyAlgorithm algorithm = kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA256;
BOOL result = SecKeyVerifySignature(publicKey, algorithm, (__bridge CFDataRef)signData, (__bridge CFDataRef)signature, NULL);
if (result) {
// Проверка подписи прошла успешно
NSLog(@"Используйте p12 для добавления подписи, Проверка подписи прошла успешно");
} else {
// Проверка подписи не удалась
}
} else {
// Не удалось добавить подпись, ошибка обработки.
}
// свободная память
if (identity) CFRelease(identity);
if (certificate) CFRelease(certificate);
if (privateKey) CFRelease(privateKey);
if (publicKey) CFRelease(publicKey);
}
});