Посмотрите на этот код .Суть в том, что после того, как вы создали пару ключей, вы должны указать openssl использовать их.Для этого вам нужно снабдить ключ RSA новыми методами шифрования и дешифрования с помощью ключей цепочки для ключей.
Я немного изменил функцию set_private_key, потому что если вы хотите создать CSR с openssl, вынужны правильные значения модуля и экспоненты открытого ключа.Итак, вот оно:
static int set_private_key(EVP_PKEY *pkey, SecKeyRef privKey, SecKeyRef pubKey)
{
struct kc_rsa *kc = NULL;
RSA *rsa = NULL;
int ret = 0;
CFDataRef key_data = NULL;
const unsigned char * p = NULL;
OSStatus status = 0;
long len = 0;
kc = (kc_rsa*) calloc(1, sizeof(struct kc_rsa));
if (!kc){
GOTO_ERR("out of memory");
}
kc->item = privKey;
// we have to export the public key (CSSM does not give us a way to get 'e' and 'n')
status = SecKeychainItemExport(pubKey, kSecFormatBSAFE, 0, NULL, &key_data);
if (status){
GOTO_ERR("SecKeychainItemExport failed");
}
p = (unsigned char *) CFDataGetBytePtr(key_data);
len = CFDataGetLength(key_data);
d2i_PublicKey(EVP_PKEY_RSA, &pkey, &p, len);
rsa = EVP_PKEY_get1_RSA(pkey);
if (!rsa){
GOTO_ERR("d2i_PublicKey fails");
}
{
SecKeychainAttributeList *attrs = NULL;
uint32_t size;
if (getAttribute(privKey, kSecKeyKeySizeInBits, &attrs)){
GOTO_ERR("getAttribute failed");
}
size = *(uint32_t *)attrs->attr[0].data;
SecKeychainItemFreeAttributesAndData(attrs, NULL);
kc->keysize = (size + 7) / 8;
}
RSA_set_method(rsa, &kc_rsa_pkcs1_method);
ret = RSA_set_app_data(rsa, kc);
if (ret != 1)
GOTO_ERR("RSA_set_app_data");
EVP_PKEY_assign_RSA(pkey,rsa);
CFRetain(privKey);
err:
if(key_data)
CFRelease(key_data);
return ret;
}