iOS:如何通过程序中的私钥和x509证书创建PKCS12(P12)密钥库?

史诗熊猫力量

这个问题显然很相似,但是没有任何答案:以编程方式为iPhone创建x509证书,而无需使用OpenSSL

在我们的应用程序(服务器,客户端)中,我们正在实现客户端身份验证(基于X509Certificate的SSL)。我们已经有一种生成keypair,创建PKCS10 Certificate Signing Request,由签名self-signed CA并创建X509Certificate,发送回的方法。但是,要在SSL请求中使用此证书,private keyX509Certificate必须将和导出到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();
csufsag

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

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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SSLContext和PKCS12密钥库-在JVM上有效,但在Android上无效

来自分类Dev

.p12证书/文件的使用和实用程序

来自分类Dev

X509证书公用密钥填充

来自分类Dev

HOWTO:从iTunes分发证书和签名密钥(P12文件)和mobileprovision获取信息

来自分类Dev

iOS应用程序SSL .p12身份验证-错误的证书错误(-9825)

来自分类Dev

如何创建没有私钥的.p12或.pfx文件?

来自分类Dev

Glassfish使用P12密钥库覆盖密钥库

来自分类Dev

如何在Java PKCS12密钥库中存储对称密钥

来自分类Dev

无法导入.p12密钥库

来自分类Dev

在PHP中使用PKCS12证书(.p12)对XML文档(XADES-BES)进行签名

来自分类Dev

以编程方式验证X509证书和私钥匹配

来自分类Dev

在Azure网站中为Google API从p12证书生成X509Certificate2时出现502错误

来自分类Dev

在Java中,如何使用JKS密钥库中的X509证书(公用/专用密钥对)中的专用密钥解密?

来自分类Dev

在将C#导出到p12之前,将私钥添加到X509证书

来自分类Dev

如何使用Apple Push Notification P12证书文件通过代码设置ios平台?

来自分类Dev

如何使用.p12证书和密码加密URL

来自分类Dev

如何从aws导出证书创建.p12(或.jks)文件?

来自分类Dev

SSLContext和PKCS12密钥库-在JVM上可用,但在Android上不可用

来自分类Dev

Winserver2008证书颁发机构的PKCS12密钥

来自分类Dev

加密p12证书

来自分类Dev

如何使用RSA私钥和自签名证书生成p12文件?

来自分类Dev

如何使用RSA私钥和自签名证书生成p12文件

来自分类Dev

读入Android应用程序的PKCS12 / P12客户端证书文件

来自分类Dev

解析错误:证书必须为.p12文件(获取应用程序/ pkcs-12)

来自分类Dev

在Java中,如何使用JKS密钥库中的X509证书(公用/专用密钥对)中的专用密钥解密?

来自分类Dev

无法从p12证书加载密钥对-OPENSSL错误

来自分类Dev

UI程序可在ubuntu中从iOS打开.p12证书

来自分类Dev

Chrome如何使用.p12证书?

来自分类Dev

通过java读取PKCS7和.p12文件证书信息(subjectDN,vaildstartfrom,ValildTo..)

Related 相关文章

  1. 1

    SSLContext和PKCS12密钥库-在JVM上有效,但在Android上无效

  2. 2

    .p12证书/文件的使用和实用程序

  3. 3

    X509证书公用密钥填充

  4. 4

    HOWTO:从iTunes分发证书和签名密钥(P12文件)和mobileprovision获取信息

  5. 5

    iOS应用程序SSL .p12身份验证-错误的证书错误(-9825)

  6. 6

    如何创建没有私钥的.p12或.pfx文件?

  7. 7

    Glassfish使用P12密钥库覆盖密钥库

  8. 8

    如何在Java PKCS12密钥库中存储对称密钥

  9. 9

    无法导入.p12密钥库

  10. 10

    在PHP中使用PKCS12证书(.p12)对XML文档(XADES-BES)进行签名

  11. 11

    以编程方式验证X509证书和私钥匹配

  12. 12

    在Azure网站中为Google API从p12证书生成X509Certificate2时出现502错误

  13. 13

    在Java中,如何使用JKS密钥库中的X509证书(公用/专用密钥对)中的专用密钥解密?

  14. 14

    在将C#导出到p12之前,将私钥添加到X509证书

  15. 15

    如何使用Apple Push Notification P12证书文件通过代码设置ios平台?

  16. 16

    如何使用.p12证书和密码加密URL

  17. 17

    如何从aws导出证书创建.p12(或.jks)文件?

  18. 18

    SSLContext和PKCS12密钥库-在JVM上可用,但在Android上不可用

  19. 19

    Winserver2008证书颁发机构的PKCS12密钥

  20. 20

    加密p12证书

  21. 21

    如何使用RSA私钥和自签名证书生成p12文件?

  22. 22

    如何使用RSA私钥和自签名证书生成p12文件

  23. 23

    读入Android应用程序的PKCS12 / P12客户端证书文件

  24. 24

    解析错误:证书必须为.p12文件(获取应用程序/ pkcs-12)

  25. 25

    在Java中,如何使用JKS密钥库中的X509证书(公用/专用密钥对)中的专用密钥解密?

  26. 26

    无法从p12证书加载密钥对-OPENSSL错误

  27. 27

    UI程序可在ubuntu中从iOS打开.p12证书

  28. 28

    Chrome如何使用.p12证书?

  29. 29

    通过java读取PKCS7和.p12文件证书信息(subjectDN,vaildstartfrom,ValildTo..)

热门标签

归档