gpt4 book ai didi

ios - 将 PEM 编码的 X.509 证书导入 iOS KeyChain

转载 作者:可可西里 更新时间:2023-11-01 05:41:45 24 4
gpt4 key购买 nike

我从某处收到一个包含 PEM 编码的 X.509 证书的字符串。我想将此证书导入 iOS 的 KeyChain。

我打算执行以下操作:

  1. 将 NSString 转换为 openssl X509
  2. 创建 PKCS12
  3. 将 PKCS12 转换为 NSData
  4. 使用 SecPKCS12Import 导入 NSData

到目前为止,我想出了以下代码:

const char *cert_chars = [certStr cStringUsingEncoding:NSUTF8StringEncoding];

BIO *buffer = BIO_new(BIO_s_mem());
BIO_puts(buffer, cert_chars);

X509 *cert;
cert = PEM_read_bio_X509(buffer, NULL, 0, NULL);
if (cert == NULL) {
NSLog(@"error");
}
X509_print_fp(stdout, cert);


EVP_PKEY *privateKey;
const unsigned char *privateBits = (unsigned char *) [privateKeyData bytes];
int privateLength = [privateKeyData length];

privateKey = d2i_AutoPrivateKey(NULL, &privateBits, privateLength);

if (!X509_check_private_key(cert, privateKey)) {
NSLog(@"PK error");
}

PKCS12 *p12 = PKCS12_create("test", "David's Cert", privateKey, cert, NULL, 0, 0, 0, 0, 0);

不幸的是,即使 X509_check_private_key 成功且 X509_print_fp(stdout, cert) 打印出有效证书,p12 仍为零。

  1. 我的方法正确吗
  2. 为什么 PKCS12_create 似乎失败了?

更新:

调用 PKCS12_create 似乎在以下方法中失败:

int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen,
ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de)
{
const EVP_CIPHER *cipher;
const EVP_MD *md;
int cipher_nid, md_nid;
EVP_PBE_KEYGEN *keygen;

if (!EVP_PBE_find(EVP_PBE_TYPE_OUTER, OBJ_obj2nid(pbe_obj),
&cipher_nid, &md_nid, &keygen))
{
char obj_tmp[80];
EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_UNKNOWN_PBE_ALGORITHM);
if (!pbe_obj) BUF_strlcpy (obj_tmp, "NULL", sizeof obj_tmp);
else i2t_ASN1_OBJECT(obj_tmp, sizeof obj_tmp, pbe_obj);
ERR_add_error_data(2, "TYPE=", obj_tmp);
return 0;
}

if(!pass)
passlen = 0;
else if (passlen == -1)
passlen = strlen(pass);

if (cipher_nid == -1)
cipher = NULL;
else
{
cipher = EVP_get_cipherbynid(cipher_nid);
if (!cipher)
{
EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_UNKNOWN_CIPHER);
return 0;
}
}

if (md_nid == -1)
md = NULL;
else
{
md = EVP_get_digestbynid(md_nid);
if (!md)
{
EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_UNKNOWN_DIGEST);
return 0;
}
}

if (!keygen(ctx, pass, passlen, param, cipher, md, en_de))
{
EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_KEYGEN_FAILURE);
return 0;
}
return 1;
}

检索密码

cipher = EVP_get_cipherbynid(cipher_nid);

以某种方式为“RC2-40-CBC”返回 nil。

最佳答案

在创建 PKCS12 之前缺少以下调用:

OpenSSL_add_all_algorithms();
OpenSSL_add_all_ciphers();
OpenSSL_add_all_digests();

这些解决了丢失密码的问题以及随后的丢失摘要的问题。

关于ios - 将 PEM 编码的 X.509 证书导入 iOS KeyChain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com