gpt4 book ai didi

iOS:如何以编程方式从应用程序中的私钥和 x509 证书创建 PKCS12 (P12) keystore ?

转载 作者:可可西里 更新时间:2023-11-01 03:05:32 25 4
gpt4 key购买 nike

这个问题显然很相似,但没有任何答案:Programmatically create a x509 certificate for iPhone without using OpenSSL

在我们的应用程序(服务器、客户端)中,我们正在实现客户端身份验证(基于 X509Certificate 的 SSL)。我们已经有了生成 key 对、创建PKCS10 证书签名请求、由自签名 CA 签名并创建一个X509Certificate,将其发回。但是,要在 SSL 请求中使用此证书,必须将 私钥X509Certificate 导出到 PKCS12 (P12) keystore

有没有人知道如何做到这一点,或者即使这是可能的?客户端必须生成P12文件(我们不想泄露私钥),客户端运行iOS,是一个移动设备。该解决方案适用于使用 BouncyCaSTLe (SpongyCaSTLe) 的 Android,但我们没有找到适用于 iOS 的解决方案。

编辑:在 Java 中,此导出由以下内容完成:

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
KeyStore ks = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME);
ks.load(null);
ks.setKeyEntry("key-alias", (Key) key, password.toCharArray(),
new java.security.cert.Certificate[] { x509Certificate });
ks.store(bos, password.toCharArray());
bos.close();
return bos.toByteArray();

最佳答案

如果您使用 openssl,您不必将完整的源代码复制到您的项目中,添加库和 header 就足够了,因此可以使用 openssl 库而不会出现任何大小问题。您可以使用 openssl 生成 key 和证书:

EVP_PKEY * pkey;
pkey = EVP_PKEY_new();

RSA * rsa;
rsa = RSA_generate_key(
2048, /* number of bits for the key - 2048 is a sensible value */
RSA_F4, /* exponent - RSA_F4 is defined as 0x10001L */
NULL, /* callback - can be NULL if we aren't displaying progress */
NULL /* callback argument - not needed in this case */
);

EVP_PKEY_assign_RSA(pkey, rsa);

X509 * x509;
x509 = X509_new();

ASN1_INTEGER_set(X509_get_serialNumber(x509), 1);

X509_gmtime_adj(X509_get_notBefore(x509), 0);
X509_gmtime_adj(X509_get_notAfter(x509), 31536000L);

X509_set_pubkey(x509, pkey);

X509_NAME * name;
name = X509_get_subject_name(x509);

X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC,
(unsigned char *)"CA", -1, -1, 0);
X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC,
(unsigned char *)"MyCompany Inc.", -1, -1, 0);
X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,
(unsigned char *)"localhost", -1, -1, 0);

X509_set_issuer_name(x509, name);

//X509_sign(x509, pkey, EVP_sha1());

const EVP_CIPHER *aConst = EVP_des_ede3_cbc();

你可以用这些函数把它写成 pem 格式:

PEM_write_PrivateKey(f, pkey, NULL, NULL, 0, NULL, NULL);


PEM_write_X509(
f, /* write the certificate to the file we've opened */
x509 /* our certificate */
);

之后就可以将这些文件写入一个 p12 文件,源代码来自这里: https://github.com/luvit/openssl/blob/master/openssl/demos/pkcs12/pkwrite.c

/* pkwrite.c */

#include <stdio.h>
#include <stdlib.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/pkcs12.h>

/* Simple PKCS#12 file creator */
int main(int argc, char **argv)
{
FILE *fp;
EVP_PKEY *pkey;
X509 *cert;
PKCS12 *p12;
if (argc != 5) {
fprintf(stderr, "Usage: pkwrite infile password name p12file\n");
exit(1);
}
SSLeay_add_all_algorithms();
ERR_load_crypto_strings();
if (!(fp = fopen(argv[1], "r"))) {
fprintf(stderr, "Error opening file %s\n", argv[1]);
exit(1);
}
cert = PEM_read_X509(fp, NULL, NULL, NULL);
rewind(fp);
pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
fclose(fp);
p12 = PKCS12_create(argv[2], argv[3], pkey, cert, NULL, 0,0,0,0,0);
if(!p12) {
fprintf(stderr, "Error creating PKCS#12 structure\n");
ERR_print_errors_fp(stderr);
exit(1);
}
if (!(fp = fopen(argv[4], "wb"))) {
fprintf(stderr, "Error opening file %s\n", argv[1]);
ERR_print_errors_fp(stderr);
exit(1);
}
i2d_PKCS12_fp(fp, p12);
PKCS12_free(p12);
fclose(fp);
return 0;
}

关于iOS:如何以编程方式从应用程序中的私钥和 x509 证书创建 PKCS12 (P12) keystore ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26883342/

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