我要做的是在Mac上通过终端复制以下命令,但在iPhone上/在Cocoa上运行:
openssl smime -binary -sign -signer cert.pem -inkey key.pem -in file.txt -out encrypted -outform DER其中“加密”是从命令中得到的加密文件。
虽然它指定了两个单独的密钥(公共密钥和私钥),但可以将它们作为一个.p12文件。
在遵循了使用这证书加密文件的.p12可可片段之后,我不确定这是否是正确的做法。
在iPhone上复制smime命令的最佳方法是什么(如上面的终端命令所示),还是根本不可能通过可用的Security.framework/CommonCrypto方法进行复制?
发布于 2013-05-08 06:54:49
据我所知--你在小溪上,把桨锁在了商店里。
我过去已经用openssl和Chilkat解决了这个问题。
然而,在每一种情况下,我都会“缓存”私钥的副本--一旦它进入密钥链--我只能得到一个SecKeyRef (你需要与苹果签订额外的协议/许可,才能把它拿回来,然后还在应用商店里)。反向工程任何VPN (例如,juniper )应用程序,以查看链接的方法/框架)。
对于openssl,只需使用openssl应用程序中的smime.c代码并修改即可。对于辣椒来说,事情要简单得多:
CkoCert * mine = [identity ckoCert];
assert([mime AddEncryptCert: mine] == YES);
for(id cc in backupCerts) {
assert([mime AddEncryptCert:cc] == YES);
}
for(id key in [headers allKeys]) {
[mime SetHeaderField:[NSString stringWithFormat:@"%s%@", X_HDR_PREFIX, key]
value:[headers objectForKey:key]
];
};
[mime SetBodyFromBinary:data];
assert([mime EncryptN] == YES);
return [mime GetMimeBytes];以及identity字段有“保存自己的缓存”欺骗的地方:
-(id)initWithPKCS12:(NSData*)pkcs12der password:(NSString *)password {
if (password == nil)
password = [APPSETTINGS wellKnownPkcsPassword];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
password, kSecImportExportPassphrase,
nil];
CFArrayRef items;
OSStatus status = SecPKCS12Import((__bridge CFDataRef)pkcs12der,
(__bridge CFDictionaryRef)options, &items);
if (status != noErr) {
NSLog(@"PKCS12 importAsDer failed: Error %ld",(long)status);
...
}
if (!items || CFArrayGetCount(items) < 1) {
NSLog(@"PKCS12 importAsDer failed - nothing returned (%ld bytes DER)",
(long)[pkcs12der length]);
...
}
CFDictionaryRef dict0 = (CFDictionaryRef) CFArrayGetValueAtIndex(items, 0);
if (!dict0)
return nil;
SecIdentityRef iRef = (SecIdentityRef) CFDictionaryGetValue(dict0,
kSecImportItemIdentity);
CFArrayRef cRef = (CFArrayRef) CFDictionaryGetValue(dict0, kSecImportItemCertChain);
self = [self initWithIdentityRef:iRef withChainArrayRef:cRef];
CFRelease(items);
#if TARGET_OS_IPHONE
// We lack SecPrivate* on iOS. So we cheat a bit - rather than
// use the keychain we limt ourselves to our own *.p12's and
// keep a copy of the private key in memory.
//
# ifdef WITH_OPENSSL
const unsigned char * ptr = [pkcs12der bytes];
PKCS12 * p12 = d2i_PKCS12(NULL, &ptr, len);
char buff[1024];
if (!p12) {
NSLog(@"Could not decode PKCS#12: %s", ERR_error_string(ERR_get_error(), buff));
...
};
const char * pass = [password cStringUsingEncoding:NSASCIIStringEncoding];
if (PKCS12_parse(p12, pass, &pkey, &x509, NULL) != 1) {
NSLog(@"Could not parse PKCS#12: %s", ERR_error_string(ERR_get_error(), buff));
...
};
....
# else
ckoCert = [[CkoCert alloc] init];
if (!([ckoCert LoadPfxData:pkcs12der password:[APPSETTINGS wellKnownPkcsPassword]])) {
NSLog(@"PKCS12 loadPfxData failed: %@", [ckoCert LastErrorText]);
...
}
ckoPrivateKey = [ckoCert ExportPrivateKey];
# endif // chilkat or openssl
#endif // iOS
return self;
}警告:在上面,我已经删除了大多数mngt/错误管理和/或替换它为断言,否则它变得有点过于粗放。
谢谢,
Dw。
https://stackoverflow.com/questions/11011669
复制相似问题