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

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

有没有人知道如何做到这一点,或者即使它可能?客户端必须生成P12文件(我们不想发出私钥),客户端正在运行iOS,并且是移动设备.该解决方案适用于Android使用BouncyCastle(spongycastle),但我们没有找到任何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,则不必将完整的源代码复制到项目中,只需添加lib和头文件即可,因此可以使用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,0);
X509_NAME_add_entry_by_txt(name,"O",(unsigned char *)"MyCompany Inc.","CN",(unsigned char *)"localhost",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,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);
    rewind(fp);
    pkey = PEM_read_PrivateKey(fp,NULL);
    fclose(fp);
    p12 = PKCS12_create(argv[2],argv[3],cert,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,argv[1]);
        ERR_print_errors_fp(stderr);
        exit(1);
    }
    i2d_PKCS12_fp(fp,p12);
    PKCS12_free(p12);
    fclose(fp);
    return 0;
}

iOS:如何以编程方式在应用程序中从私钥和x509certificate创建PKCS12(P12)密钥库?的更多相关文章

  1. iOS:如何以编程方式在应用程序中从私钥和x509certificate创建PKCS12(P12)密钥库?

    这个问题显然很相似,但没有任何答案:Programmaticallycreateax509certificateforiPhonewithoutusingOpenSSL在我们的应用程序(服务器,客户端)中,我们正在实现客户端身份验证(基于X509Certificate的SSL).我们已经有办法生成密钥对,创建PKCS10证书签名请求,由自签名CA签名并创建X509Certificate,然后发回.

  2. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  3. stdout – 使用Windows Script Host捕获WshShell.Exec的输出

    我尝试使用“WshShell.Run()”,但这给我一个“权限被拒绝”的错误,这是有问题的,因为我不想告诉我的客户端改变他们的Windows环境如何配置只是为了运行我的程序.我能做什么?

  4. Windows – 将批处理文件重定向到文件

    我有一个执行java应用程序的批处理文件.我试图修改它,以便每当发生异常时,它会将STDERR写入一个文件.看起来像这样:有没有办法我可以将参数%1和%2写入log.txt文件?

  5. 在stderr的Windows上更改文本输出颜色

    我最近发现了一个帖子给出了一个解决方案,让stderr的文本输出为Linux的不同颜色他们创建了以下bash脚本脚本这会导致输出在来自stderr时打印黄色文本.stdout仍然打印相同的颜色.该脚本保存在名为color的$PATH目录中.这允许我使用make或scons运行脚本,并且它将以黄色显示来自stderr的所有文本.这对于在编译时发现错误非常有用.是否有类似的脚本可用于Windowscmdshell?

  6. ubuntu – 如何重定向已经运行的进程的stdout / stderr?

    (在Ubuntu10.0464位服务器上运行)昨天,我犯了一个错误,就是在不使用屏幕的情况下通过SSH启动一个进程(我没有意识到要花几天时间才能运行).我今天花了一整天的时间试图找出一些方法,我可以从SSH的铁把手中撬开这个过程的输出,这样我就可以重新启动我的客户端机器,但是我没有到达任何地方.我尝试使用gdb并遵循thispage底部的说明,但是当我运行第一个gdb命令来创建文件时,我收到一条错

  7. stdout – PHP CLI不使用stderr输出错误

    我在MacOS中通过NSTask运行PHPCLI,但这个问题更多的是关于CLI本身.我正在听stderr管道,但没有任何输出,无论我尝试运行什么文件:>如果文件类型不是纯文本,则stdout设置为?>如果文件是具有错误的PHP脚本,则错误消息仍将打印到stdout.解释器是否有切换到通过stderr处理错误?除了解析stdout之外,我还有一个检测错误的选项吗?

  8. PHP proc_open多次打开

    我有一个实用程序函数用于通过CLI(cmd,bash等)执行程序.它返回一个包含3个项目的数组:STDOUT,STDERR和EXITCODE.到目前为止,它一直很好地没有问题.事实上,我遇到的问题并没有真正阻碍它的功能,但我关注的是性能.问题是在某些情况下,PHP会多次运行相同的命令(在我的情况下是3次),即使它只应该执行一次.注意注释行(第9行).那是为了测试.我启用它以确保目标程序只运行一次(

  9. php – 使cURL输出STDERR到文件(或字符串)

    我们正在尝试在服务器上调试一些cURL错误,我想看到STDERR日志.目前,我们可以看到我们的错误是“错误代码:7”,我们无法连接到目标服务器.我们已经联系了主机,并制定了特殊规则来开放我们需要的港口,我们甚至暂时忽略证书.不过,我们无法连接.我需要调试这个,但是我看不到任何有关的信息.提到“VERBOSE”和“STDERR”的线条是我最重要的.没有任何东西写入$curl_log.我究竟做错了什么?遵循手册逻辑,这应该是正确的…

  10. 可以将STDOUT和STDERR发送到日志文件以及Win32 Perl中的屏幕吗?

    我已经搜索了互联网,并发现了一些很好的解决方案,将STDOUT发到两个不同的地方.喜欢日志文件,也可以同时到屏幕.这里有一个例子:但这个解决方案让STDERR只能进入屏幕,我想让STDERR去屏幕,同时也是STDOUT被记录的同一个日志文件.甚至有可能吗我的任务是让我的构建过程记录下来,但是我也想像往常一样在我的IDE屏幕上看到它.并记录错误消息与记录快乐消息一样重要.并将错误记录到单独的日志文件

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部