第一步,制作自签名的证书
1.最简单快捷的方法,打开Terminal,使用openssl(Mac OS X自带)生成私钥和自签名的x509证书。
openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
按照命令行的提示输入内容就行了。
几个说明:
public_key.der是输出的自签名的x509证书,即我们要用的。
private_key.pem是输出的私钥,用来解密的,请妥善保管。
rsa:1024这里的1024是密钥长度,1024是比较安全的,如果需要更安全的话,可以用2048,但是加解密代价也会增加。
-days:证书过期时间,一定要加上这个参数,默认的证书过期时间是30天,一般我们不希望证书这么短就过期,所以写上比较合适的天数,例如这里的3650(10年)。
事实上,这一行命令包含了好几个步骤(我研究下面这些步骤的原因是我手头已经由一个private_key.pem私钥了,想直接用这个来生成x509证书,也就是用到了下面的2-3)
1)创建私钥
openssl genrsa -out private_key.pem 1024
2)创建证书请求(按照提示输入信息)
openssl req -new -out cert.csr -key private_key.pem
3)自签署根证书
openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650
2.验证证书。把public_key.der拖到xcode中,如果文件没有问题的话,那么就可以直接在xcode中打开,看到证书的各种信息。
第二步,使用public_key.der来进行加密。
1.导入Security.framework。
2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。
3.从public_key.der读取公钥。
4.加密。
下面是参考代码(只能用于加密长度小于等于116字节的内容,适合于对密码进行加密。使用了ARC,不过还是要注意部分资源需要使用CFRealse来释放)
RSA.h
//
// RSA.h
//
#import Foundation.h>
@interface RSA : NSObject {
SecKeyRef publicKey
SecCertificateRef certificate
SecPolicyRef policy
SecTrustRef trust
size_t maxPlainLen
}
- (NSData *) encryptWithData:(NSData *)content
- (NSData *) encryptWithString:(NSString *)content
@end
RSA.m
//
// RSA.m
//
#import "RSA.h"
@implementation RSA
- (id)init {
self = [super init]
NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"
ofType:@"der"]
if (publicKeyPath == nil) {
NSLog(@"Can not find pub.der")
return nil
}
NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath]
if (publicKeyFileContent == nil) {
NSLog(@"Can not read from pub.der")
return nil
}
certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent)
if (certificate == nil) {
NSLog(@"Can not read certificate from pub.der")
return nil
}
policy = SecPolicyCreateBasicX509()
OSStatus returnCode = SecTrustCreateWithCertificates(certificate, policy, &trust)
if (returnCode != 0) {
NSLog(@"SecTrustCreateWithCertificates fail. Error Code: %ld", returnCode)
return nil
}
SecTrustResultType trustResultType
returnCode = SecTrustEvaluate(trust, &trustResultType)
if (returnCode != 0) {
NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode)
return nil
}
publicKey = SecTrustCopyPublicKey(trust)
if (publicKey == nil) {
NSLog(@"SecTrustCopyPublicKey fail")
return nil
}
maxPlainLen = SecKeyGetBlockSize(publicKey) - 12
return self
}
- (NSData *) encryptWithData:(NSData *)content {
size_t plainLen = [content length]
if (plainLen >maxPlainLen) {
NSLog(@"content(%ld) is too long, must <%ld", plainLen, maxPlainLen)
return nil
}
void *plain = malloc(plainLen)
[content getBytes:plain
length:plainLen]
size_t cipherLen = 128// 当前RSA的密钥长度是128字节
void *cipher = malloc(cipherLen)
OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen)
NSData *result = nil
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode)
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen]
}
free(plain)
free(cipher)
return result
}
- (NSData *) encryptWithString:(NSString *)content {
return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]]
}
- (void)dealloc{
CFRelease(certificate)
CFRelease(trust)
CFRelease(policy)
CFRelease(publicKey)
}
@end
使用方法:
RSA *rsa = [[RSA alloc] init]
if (rsa != nil) {
NSLog(@"%@",[rsa encryptWithString:@"test"])
}
else {
NSLog(@"init rsa error")
}
Xcode自带gcc编译器,但是安装了Xcode以后需要安装Command Line Tools才能在命令行使用!方法是:打开Xcode 选择偏好设置(Preference),然后选择Downloads选项卡,安装一下Command Line Tools就可以在命令行使用了。环境:macbook、终端、XCode、openssl1.1.1a
环境:macbook、终端、XCode、openssl1.1.1a
环境:macbook、终端、XCode、openssl1.1.1a
重要的事儿要说三遍...
【下一篇:openssl 自签名证书 - 制作证书(二)】
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)