iOS 共钥验签 证书验签

iOS 公钥验签(也就是公钥解密) 上篇文章写的公钥加密后台进行验签,这片文章是后台加密过数据ios就行验签。就是后台给了txt文件,里面有加签和加密过的文本字符串,需要把这个文本字符串处理下,和原来数据验签,看看是不是被修改过。这篇文章也是上篇文章的需求二。 1.读取本地txt文本文件获取字符串----decode-base64(反编译)--拿到加密数据data---从本地获取原有的数据data---利用公钥把取出加密数据和原数... 阅读详情

坑爹的共钥验签浪费了我一周时间!!!!!!!!!!

由于公司为了某些代码的安全性决定采用证书的方式解决。但是验证证书的问题还必须本地去做,尽量减少或者说避免与服务器的任何交互,所以研究本地证书验签的重任还是落到了我的头上。

首先我曾经试过使用AF的方式,但是这种工作一般都是与服务器交互服务器去做的验签工作。后来发现Secrty.framework的官方框架也可以做,但是发现此框架功能太少了,根本难以满足我的验签需求。最后只能求助于OpenSSL这个框架,不过值得注意的是这个框架很大。真的很大。。。因为我是提供SDK的方式,原本一百多K的SDK静态库直接增加到了十八M左右。

下面还是讲讲我是怎么被他坑的吧。

其实验签很简单
1.证书验证书
在你的主程序中加入下面代码

int i, ret = 1;

X509_STORE *cert_ctx = NULL;
X509_LOOKUP *lookup = NULL;

NSString *Userfile = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"User.pem"];
NSString *CAfile = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Root.pem"];

if (bio_err == NULL)
    if ((bio_err = BIO_new(BIO_s_file())) != NULL)
        BIO_set_fp(bio_err, stderr, BIO_NOCLOSE | BIO_FP_TEXT);

        cert_ctx = X509_STORE_new();
        if (cert_ctx == NULL)
            goto end;
        X509_STORE_set_verify_cb(cert_ctx, cb);
        ERR_load_crypto_strings();
        OpenSSL_add_all_algorithms();

        lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_file());
        if (lookup == NULL)
            abort();
        if (CAfile) {
            i = X509_LOOKUP_load_file(lookup, [CAfile UTF8String], X509_FILETYPE_PEM);
            if (!i) {
                BIO_printf(bio_err, "Error loading file %s\n", CAfile);
                ERR_print_errors(bio_err);
                goto end;
            }
        }

        lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_hash_dir());
        if (lookup == NULL)
            abort();

        ERR_clear_error();

        ret = 0;

        if (1 != check(cert_ctx, [Userfile UTF8String], NULL, NULL, NULL, NULL))
            ret = -1;

    end:
        if (cert_ctx != NULL)
            X509_STORE_free(cert_ctx);

好了骚年,你可以去验证一下了

static int check(X509_STORE *ctx, char *file,
                 STACK_OF(X509) *uchain, STACK_OF(X509) *tchain,
                 STACK_OF(X509_CRL) *crls, ENGINE *e)
{
    X509 *x = NULL;

//    loadCert(file, x);


    int i = 0, ret = 0;
    X509_STORE_CTX *csc;
    //FIXME:这里根据你加在的证书格式动态调整FORMAT_PEM
    x = load_cert(bio_err, file, FORMAT_PEM, NULL, e, "certificate file");
    if (x == NULL)
        goto end;
    fprintf(stdout, "%s: ", (file == NULL) ? "stdin" : file);

    csc = X509_STORE_CTX_new();
    if (csc == NULL) {
        ERR_print_errors(bio_err);
        goto end;
    }
    X509_STORE_set_flags(ctx, vflags);
    if (!X509_STORE_CTX_init(csc, ctx, x, NULL)) {
        ERR_print_errors(bio_err);
        goto end;
    }
    if (tchain)
        X509_STORE_CTX_trusted_stack(csc, tchain);
    if (crls)
        X509_STORE_CTX_set0_crls(csc, crls);
    i = X509_verify_cert(csc);
    X509_STORE_CTX_free(csc);

    ret = 0;
end:
    if (i > 0) {
        fprintf(stdout, "OK\n");
        ret = 1;
    }
    else
        ERR_print_errors(bio_err);
    if (x != NULL)
        X509_free(x);

    return (ret);
}

当然中间你需要把证书加在进来

//定义你的证书是cer格式还是pem格式
//pem格式
#define FORMAT_PEM 0
//cer格式
#define FORMAT_ASN1 1

X509 *load_cert(BIO *err, const char *file, int format,
                const char *pass, ENGINE *e, const char *cert_descrip)
{
    X509 *x = NULL;
    BIO *cert;

    if ((cert = BIO_new(BIO_s_file())) == NULL) {
        ERR_print_errors(err);
        goto end;
    }

    if (file == NULL) {
#ifdef _IONBF
# ifndef OPENSSL_NO_SETVBUF_IONBF
        setvbuf(stdin, NULL, _IONBF, 0);
# endif                         /* ndef OPENSSL_NO_SETVBUF_IONBF */
#endif
        BIO_set_fp(cert, stdin, BIO_NOCLOSE);
    }
    else {
        if (BIO_read_filename(cert, file) <= 0) {
            BIO_printf(err, "Error opening %s %s\n", cert_descrip, file);
            ERR_print_errors(err);
            goto end;
        }
    }

    if (format == FORMAT_ASN1)
        x = d2i_X509_bio(cert, NULL);
    else if (format == FORMAT_PEM)
        x = PEM_read_bio_X509_AUX(cert, NULL,
                                  (pem_password_cb *)password_callback, NULL);
    else {
        BIO_printf(err, "bad input format specified for %s\n", cert_descrip);
        goto end;
    }
end:
    if (x == NULL) {
        BIO_printf(err, "unable to load certificate\n");
        ERR_print_errors(err);
    }
    if (cert != NULL)
        BIO_free(cert);
    return (x);
}

当然错误日志你也是可以看到的

#include <stdio.h>
#include <string.h>

#include <rsa.h>
#include <ui.h>
#include <ui_compat.h>
#include <err.h>
#include <pem.h>

#include <x509v3.h>

# ifdef OPENSSL_SYS_WIN16
#  define MS_CALLBACK     _far _loadds
# else
#  define MS_CALLBACK
# endif
static int v_verbose = 0, vflags = 0;
BIO *bio_err = NULL;
#define FORMAT_PEM 0
#define FORMAT_ASN1 1

# define PW_MIN_LENGTH 4
typedef struct pw_cb_data {
    const void *password;
    const char *prompt_info;
} PW_CB_DATA;

static UI_METHOD *ui_method = NULL;
typedef int pem_password_cb(char *buf, int size, int rwflag, void *userdata);


static void nodes_print(BIO *out, const char *name,
                        STACK_OF(X509_POLICY_NODE) *nodes)
{
    X509_POLICY_NODE *node;
    int i;
    BIO_printf(out, "%s Policies:", name);
    if (nodes) {
        BIO_puts(out, "\n");
        for (i = 0; i < sk_X509_POLICY_NODE_num(nodes); i++) {
            node = sk_X509_POLICY_NODE_value(nodes, i);
            X509_POLICY_NODE_print(out, node, 2);
        }
    }
    else
        BIO_puts(out, " <empty>\n");
}

void policies_print(BIO *out, X509_STORE_CTX *ctx)
{
    X509_POLICY_TREE *tree;
    int explicit_policy;
    int free_out = 0;
    if (out == NULL) {
        out = BIO_new_fp(stderr, BIO_NOCLOSE);
        free_out = 1;
    }
    tree = X509_STORE_CTX_get0_policy_tree(ctx);
    explicit_policy = X509_STORE_CTX_get_explicit_policy(ctx);

    BIO_printf(out, "Require explicit Policy: %s\n",
               explicit_policy ? "True" : "False");

    nodes_print(out, "Authority", X509_policy_tree_get0_policies(tree));
    nodes_print(out, "User", X509_policy_tree_get0_user_policies(tree));
    if (free_out)
        BIO_free(out);
}

int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_tmp)
{
    UI *ui = NULL;
    int res = 0;
    const char *prompt_info = NULL;
    const char *password = NULL;
    PW_CB_DATA *cb_data = (PW_CB_DATA *)cb_tmp;

    if (cb_data) {
        if (cb_data->password)
            password = cb_data->password;
        if (cb_data->prompt_info)
            prompt_info = cb_data->prompt_info;
    }

    if (password) {
        res = strlen(password);
        if (res > bufsiz)
            res = bufsiz;
        memcpy(buf, password, res);
        return res;
    }

    ui = UI_new_method(ui_method);
    if (ui) {
        int ok = 0;
        char *buff = NULL;
        int ui_flags = 0;
        char *prompt = NULL;

        prompt = UI_construct_prompt(ui, "pass phrase", prompt_info);
        if (!prompt) {
            BIO_printf(bio_err, "Out of memory\n");
            UI_free(ui);
            return 0;
        }

        ui_flags |= UI_INPUT_FLAG_DEFAULT_PWD;
        UI_ctrl(ui, UI_CTRL_PRINT_ERRORS, 1, 0, 0);

        if (ok >= 0)
            ok = UI_add_input_string(ui, prompt, ui_flags, buf,
                                     PW_MIN_LENGTH, bufsiz - 1);
        if (ok >= 0 && verify) {
            buff = (char *)OPENSSL_malloc(bufsiz);
            if (!buff) {
                BIO_printf(bio_err, "Out of memory\n");
                UI_free(ui);
                OPENSSL_free(prompt);
                return 0;
            }
            ok = UI_add_verify_string(ui, prompt, ui_flags, buff,
                                      PW_MIN_LENGTH, bufsiz - 1, buf);
        }
        if (ok >= 0)
            do {
                ok = UI_process(ui);
            } while (ok < 0 && UI_ctrl(ui, UI_CTRL_IS_REDOABLE, 0, 0, 0));

        if (buff) {
            OPENSSL_cleanse(buff, (unsigned int)bufsiz);
            OPENSSL_free(buff);
        }

        if (ok >= 0)
            res = strlen(buf);
        if (ok == -1) {
            BIO_printf(bio_err, "User interface error\n");
            ERR_print_errors(bio_err);
            OPENSSL_cleanse(buf, (unsigned int)bufsiz);
            res = 0;
        }
        if (ok == -2) {
            BIO_printf(bio_err, "aborted!\n");
            OPENSSL_cleanse(buf, (unsigned int)bufsiz);
            res = 0;
        }
        UI_free(ui);
        OPENSSL_free(prompt);
    }
    return res;
}

static int MS_CALLBACK cb(int ok, X509_STORE_CTX *ctx)
{
    int cert_error = X509_STORE_CTX_get_error(ctx);
    X509 *current_cert = X509_STORE_CTX_get_current_cert(ctx);

    if (!ok) {
        if (current_cert) {
            X509_NAME_print_ex_fp(stdout,
                                  X509_get_subject_name(current_cert),
                                  0, XN_FLAG_ONELINE);
            printf("\n");
        }
        printf("%serror %d at %d depth lookup:%s\n",
               X509_STORE_CTX_get0_parent_ctx(ctx) ? "[CRL path]" : "",
               cert_error,
               X509_STORE_CTX_get_error_depth(ctx),
               X509_verify_cert_error_string(cert_error));
        switch (cert_error) {
            case X509_V_ERR_NO_EXPLICIT_POLICY:
                policies_print(NULL, ctx);
            case X509_V_ERR_CERT_HAS_EXPIRED:

                /*
                 * since we are just checking the certificates, it is ok if they
                 * are self signed. But we should still warn the user.
                 */

            case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
                /* Continue after extension errors too */
            case X509_V_ERR_INVALID_CA:
            case X509_V_ERR_INVALID_NON_CA:
            case X509_V_ERR_PATH_LENGTH_EXCEEDED:
            case X509_V_ERR_INVALID_PURPOSE:
            case X509_V_ERR_CRL_HAS_EXPIRED:
            case X509_V_ERR_CRL_NOT_YET_VALID:
            case X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION:
                ok = 1;
        }
        return ok;
    }
    if (cert_error == X509_V_OK && ok == 2)
        policies_print(NULL, ctx);
    if (!v_verbose)
        ERR_clear_error();
    return (ok);
}

有什么疑问可以联系私信我。

IOS证书申请流程;证书无法信任;证书到期如何做 申请的流程,大概都可以按照dcloud官方文档进行申请,最后有总结可能存在的问题dcloud官方文档:https://ask.dcloud.net.cn/article/152开发(Development)证书和描述文件(一个账号最多申请两个)用于开发测试,在 HBuilderX 中打包后可在真机环境通过发布(Distribution)证书和描述文件(最多申请三个)用于提交 AppStore,在 HBuilderX 中提交云打包后提交到 AppStore 审核发布。 阅读详情

相关推荐

变焦跟踪理论基础(如何在变焦过程中保持清晰)

如何在整个变焦过程中一直保持图像的清晰度或焦点是变焦跟踪的主要挑战。 当用户在缩放跟踪的情况下改变缩放时,设备保持对焦。 然而,在没有变焦跟踪的情况下,图像变得失焦,图像在变焦跟踪后由于自动对焦(AF)算法才最终对焦。...................................................

ChenYX的博客 20万+

Openssl X509_STORE_CTX系列函数

DESCRIPTION These functions initialise anX509_STORE_CTXstructure for subsequent use by X509_verify_cert(). X509_STORE_CTX_new() returns a newly initialisedX509_STORE_CTXstructure. X509_STORE_CTX_cleanup() internally cleans up anX509_STORE_CTXstruc...

好习惯成就伟大 3814

从零到一:EHB-电机复合制动系统的Simulink仿真实战指南

本文详细介绍了EHB-电机复合制动系统在纯电动汽车中的Simulink仿真实战指南。通过系统概述、建模核心模块解析、控制策略开发及典型问题排查,帮助读者掌握从零到一的开发流程。重点讲解了液压子系统建模、电机再生制动模型及整车动力学集成,为开发者提供了一套完整的解决方案。

hh234的博客 1008

X509_STORE 与 X509_STORE_CTX的用法区别

https://stackoverflow.com/questions/16291809/programmatically-verify-certificate-chain-using-openssl-api static int verify_cb(int ok, X509_STORE_CTX *ctx) { if (!ok) { ...

阿群的笔记(同步备份自简书) 3872

从Palantir到AI时代:Forward Deployed Engineer模式的深度解析

《从Palantir到AI时代:FDE模式的创新与挑战》摘要:Palantir开创的前置部署工程师(FDE)模式正在成为AI创业公司的标配。该模式通过现场工程师深入了解客户需求,填补产品与实际应用间的鸿沟,颠覆了传统SaaS规模化路径。核心优势在于将定制化服务转化为产品发现机制,特别适合高度异质化的AI市场。成功关键在于平衡定制与标准化,通过合同价值增长、产品杠杆效应等独特指标衡量成效。FDE人才需要兼具领域洞察力与快速原型能力。这一模式表明,在AI等新兴领域,深入客户现场可能比单纯追求技术突破更能创造商业

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 4544

PON架构(全光网络)

目前组网架构世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。有线网 无线网 全光网络方案场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入室 千兆到桌面的带宽设计 一般三层 (终端-接入层-汇聚层-核心层-出口(安全设备)-互联网) 单校区核心设备 一般采用两台高性能的核心交换机 双机的方式采用的是 M-LAG 多校区之间核心交换机采用1

qq_56248592的博客 6269

X509数字证书

主要函数 1) X509_STORE_add_cert 将证书添加到X509_STORE中。 1)X509_STORE_add_crl 将crl添加到X509_STORE中。 2)void X509_STORE_set_flags(X509_STORE *ctx, long flags) 将flags赋值给ctx里面的flags,表明了验证证书时需要验证哪些项。 4) X509_TRUST_set_default 设置默认的X509_T...

好习惯成就伟大 6174

华为OD新系统机试真题-8位LED控制器(C/C++/Py/Java/Js/Go)

华为OD新系统机试真题【8位LED控制器】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统4月19号机试真题【8位LED控制器】

qq_45776114的博客 599

x509证书验证

X509_verify_cert函数负责用来验证证书的有效性,函数原型如下int X509_verify_cert(X509_STORE_CTX *ctx),验证成功返回1,失败返回其他值,失败的原因可以通过long nCode = X509_STORE_CTX_get_error(ctx);const char * pChError = X509_verify_cert_error_s...

1309

开源免费!ReaLTaiizor如何用MIT许可证打造专业级WinForm UI?

摘要: ReaLTaiizor是一款开源UI控件库,为WinForm应用提供现代化界面解决方案。支持100+组件、多主题切换(浅色/深色/自定义)和.NET 4.8-8.0全版本兼容,MIT许可证允许免费商用。通过NuGet快速安装,3步改造传统界面:1)注入主题(如this.Theme = new Dark()),2)替换原生控件为高颜值组件(如ModernGrid替代DataGridView),3)集成高级功能(分页/动画提示)。典型场景包括登录界面美化(进度动画+通知控件)和数据表格Material风

墨夶的博客 1521

Winform从入门到精通(1)——Label(史上最全)

本篇文章是对专栏《winform控件从入门到精通》的详细介绍

qq_34059233的博客 4万+

verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead

使用自签名的ssl证书遇到如下问题: tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead

weixin_46660849的博客 9万+

WiFi基本概念(六)(L-STF,L-LTF)

L-STF它由10个OFDM symbol(1,0,1,0,1,0,1,0,1,0)构成,每个symbol是0.8us,GI是0.2us,总计10us。Symbol的长度是正常长度的1/4,因此称为Short training field,主要用于快速进行信号检测,信号同步,自动增益控制,接收天线选择(Diversity Selection)。 由于symbol长度是正常的1/4,子载波的宽度是正常的4倍,能进行初略的信道估计,其使用了-24, -20, -16, -12, -8, -4, 4, 8, 1

reekyli的专栏 6863

iOS端的SHA1验签

1.为什么要验签? (1)提高app的安全性 (2)增强抓包的难度 2.SHA1是什么? (1)SHA1:安全散列算法1,最重要的两条性质是不可逆和无冲突 (2)注意带中文的字符加密 (3)需要导入头文件:#import<CommonCrypto/CommonDigest.h> 3.验签规则是什么? (1)key值:想要做的更加安全的话,可以经常更换 (2...

雨花石的博客 1393

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

保姆级苹果ios自签名ipa文件 自签工具推荐及教程

先了解下什么是签名和证书?苹果手机安装应用,那么此应用就需要上架- App Store如果不上架App Store,那ipa文件就需要签名,签名,是一种认证,每个应用开发者或者组织都有自己的签名。签名就需要有证书,证书分两种,企业证书(比较贵)和个人证书企业证书:通过企业证书对ipa文件进行签名也就是大家常听到的企业签,企业签的ipa可以给所有ios手机进行安装。

wing_77的博客 6万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

iOS开发日常-前后台数据交互之RSA公钥验签

概要背景概述OpenSSL生成秘钥iOS本地RSA公钥验签 背景概述   最近公司新启动一个项目,老大定了一套前后台加密交互方案: 前台发送请求:RSA公钥加密 - 压缩 - Base64编码; 后台返回响应:RSA私钥加密 - 压缩 - RSA私钥加签 - Base64编码; 前台处理响应:RSA公钥验签 - Base64解码 - 解压 - RSA公钥解密。   因为iOS这边验签...

破茧成蝶 765

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

iOS 的 (签名验签)Code Signing 体系

iOS中的Code Signing体系非常复杂,对新手非常不友好,虽然目前网上已经存在大量文章对此进行比较透彻的分析,最核心的部分已经讲解得非常清楚,我阅读了这些文章后,确实从中学习到不少知识,但我始终还是对Code Signing体系中很多相关的地方有着疑惑,于是决定认真地探究一番。本文会引用一些比较好的文章中的内容和图片,加上一些我个人的理解进行分析,有些内容本文不再重复,有需要的请阅读本文最后的参考文章。 概念 公开密钥加密、数字签名、证书这些通用的基本概念这里不再多说,主要提一下iOS上特有的东

学习一定要有针对性的练习-实操! 1797

iOS 公钥获取 公钥验签 证书验签

上一篇博客有点儿乱,到最后把自己都快绕晕了。那么现在我还是简单讲一下快速入门的证书验签过程吧,尽量保准新人直接复制粘贴代码就可以实现功能,以实现效率最大化。1.证书验证书第一步加载证书 如果你的证书是cer格式用下面的代码// 加载证书到 X509 结构 void loadCert( NSString * string, X509 * x){ NSData * certData;

longlongValue 4989

iOS中使用Openssl X509证书进行字符串签名和验签

利用openssl 和x509证书对字符串进行签名和yan qin

u013030990的专栏 3208

windows正确生成ios企业证书的方法_不掉签

企业证书怎样才能不掉签呢?正确的方法就是不要购买那些别人分享的的证书,那些证书太多人使用,苹果发现就会封,而且证书都会过期的,所以企业证书当然是去苹果开发者中心申请企业账号,然后使用自家的企业证书最好,最正规也不会掉签。证书到期后也可以重新生成新的证书来打包。

甄仕俊的专栏 1098

免费p12证书在线检测iOS苹果证书状态一键查询

在 iOS 企业分发、APP 内测、签名打包过程中,是最常见、也最影响业务的问题。很多开发者和运营遇到 APP 突然无法安装、用户打开闪退、提示 “未受信任的企业级开发者”,却不知道问题出在哪里。其实只要用一款靠谱的,就能提前排查风险,避免线上事故。作为长期做应用分发、企业签管理的使用者,我真心推荐大家在都做一次在线检测,省心又安全。

2401_83229810的博客 1289

ios证书在线检测IPA证书P12证书检测证书掉签检测

做iOS分发最头疼的就是证书过期、吊销、掉签、描述文件不匹配,用户装不上、闪退,查半天还定位不到问题。P12需输密码,全程本地加密不上传私钥。10秒内出结果:证书状态、是否吊销/过期、有效期、证书类型(开发/发布/企业)、BundleID、签名完整性、掉签风险,一目了然。• 精准定位:直接告诉你是证书吊销、过期、BID不匹配、描述文件失效,省90%排查时间。✅ 适合:独立开发者、中小团队、内测发包、渠道运营、企业签自查、上线前预检。这篇是纯使用者视角、实测口吻,,包含使用步骤、选择原因、优缺点、避坑建议。

FlatWhite124的博客 540

ios 超签签名服务器搭建(超签)

为什么要搭建签名服务器吗? 因为应用不能上架App Store , 使用企业签名频繁掉签造成客户流失,用户体验不好。 ios安装的app有几种方式吗? 1、App Store 安装,符合法律法规的能走app Store的app 2、企业签名安装,灰色产业 3、搭建签名服务器安装,灰色产业 ios 搭建签名服务优势 1、不掉签 2、用户可以直接安装不需要信任,但第一次需要安装 .mo...

王铁涛技术博客 7515

ios多台电脑,共用一个证书密密钥(最全整理)

注:本文转自毛毛虫灾害ios的博客。http://blog.youkuaiyun.com/mmc7621/article/details/6844223   idp证书如何给另一台机子使用 先在原电脑上用Xcode->Windows->Organizer, 再点击Developer profile, 在其最下面点击Expore按钮, 再弹出的对话框中输入保存的文件名,密码. 将主机

冷小G的技术博客 9137

苹果企业证书_[IOS教程]频繁掉签苹果企业证书的解决方案

在iOS企业签名的市场上,无论是iOS签名用户还是个人的签名商,很大一部分都会偏爱于共享签名,超低的价格,一样的使用效果。但是久了之后因为某些不可抗拒的因素,证书的稳定性成了用户日夜担心的问题,有时候半夜还要起来补签,这也无疑成了企业签名致命的缺点。那么我们先来分析一下掉签的原因:1、市面上很多共享企业签名所签的应用非常多,基本上没有选择,什么应用都能签,其中不乏有很多敏感应用,这些应用...

weixin_39584405的博客 888

iOS永久签名不掉签工具,轻松签超详使用教程

有效期永久~

dnmjun的博客 2万+
上一篇: iOS 等待异步线程结束再执行后续代码
下一篇: iOS 公钥获取 公钥验签 证书验签
longlongValue
博客等级 码龄10年 52粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值