Mac下openssl升级
# 前言
Mac 下需要将一个调用 openssl-0.9.8
的项目升级到 openssl-1.1.1
# Mac 下 openssl 编译
下载 openssl-1.1.1 版本 https://www.openssl.org/source/ (opens new window),这里下载的最新版本是
openssl-1.1.1t
解压到
/Users/YourName/Desktop/OpenSSL
目录下,在该目录下创建build_arm64
目录,用于编译安装 arm64 版本 (终端uname -a
查看系统架构)进入 openssl-1.1.1t 目录,执行
cd /Users/YourName/Desktop/OpenSSL/openssl-1.1.1t
# 配置并生成 makefile
./configure darwin64-arm64-cc no-shared --prefix=/Users/YourName/Desktop/OpenSSL/build_arm64
# 编译 安装
make && make install
# 测试
make test
1
2
3
4
5
6
7
2
3
4
5
6
7
提示
darwin64-arm64-cc
- 编译 arm64 版本no-shared
- 编译静态库--prefix
- make install 安装路径
如果你不知道当前系统架构,也可以使用以下命令,自动获取当前系统的架构进行配置,无需指定
./config no-shared --prefix=/Users/lake/Desktop/OpenSSL/build
1
- 编译安装成功后,到安装目录下查看一下
cd ../build_arm64/lib
# 查看库架构版本
lipo -archs libcrypto.a
# 或
lipo -info libcrypto.a
# 或
otool -hv libcrypto.a
1
2
3
4
5
6
7
2
3
4
5
6
7
- 编译其他架构版本
可以在 openssl-1.1.1t/Configurations/10-main.conf
下查看,找到 Mac 对应的,类似如下:
"darwin-i386-cc" => {
inherit_from => [ "darwin-common", asm("x86_asm") ],
CFLAGS => add(picker(release => "-fomit-frame-pointer")),
cflags => add("-arch i386"),
lib_cppflags => add("-DL_ENDIAN"),
bn_ops => "BN_LLONG RC4_INT",
perlasm_scheme => "macosx",
},
"darwin64-x86_64-cc" => {
inherit_from => [ "darwin-common", asm("x86_64_asm") ],
CFLAGS => add("-Wall"),
cflags => add("-arch x86_64"),
lib_cppflags => add("-DL_ENDIAN"),
bn_ops => "SIXTY_FOUR_BIT_LONG",
perlasm_scheme => "macosx",
},
"darwin64-arm64-cc" => {
inherit_from => [ "darwin-common", asm("aarch64_asm") ],
CFLAGS => add("-Wall"),
cflags => add("-arch arm64"),
lib_cppflags => add("-DL_ENDIAN"),
bn_ops => "SIXTY_FOUR_BIT_LONG",
perlasm_scheme => "ios64",
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
在
/Users/YourName/Desktop/OpenSSL/
下创建build_x86_64
和build_i386
目录进入
openssl-1.1.1t
目录,执行
cd /Users/YourName/Desktop/OpenSSL/openssl-1.1.1t
# 编译安装 x86_64 版本
make clean
./configure darwin64-x86_64-cc no-shared --prefix=/Users/lake/Desktop/OpenSSL/build_x86_64
make && make install
# 编译安装 i386 版本
make clean
./configure darwin-i386-cc no-shared --prefix=/Users/lake/Desktop/OpenSSL/build_i386
make && make install
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
具体可以查看源码下的
INSTALL
文件
# 版本差异
OpenSSL 1.1.0
版本之后更改了许多结构体成员的可见性,无法再直接访问成员,必须使用相应的 getter
和 setter
函数。
getter
相关的函数中,带 0
的,例如 RSA_get0_n
,表示引用指针,而不是创建新的内存。不要 free 它们。
// 不能通过 rsa->n 去访问内部成员了,需要使用以下 getter 拿到每个成员数据
const BIGNUM *RSA_get0_n(const RSA *d);
const BIGNUM *RSA_get0_e(const RSA *d);
const BIGNUM *RSA_get0_d(const RSA *d);
const BIGNUM *RSA_get0_p(const RSA *d);
const BIGNUM *RSA_get0_q(const RSA *d);
const BIGNUM *RSA_get0_dmp1(const RSA *r);
const BIGNUM *RSA_get0_dmq1(const RSA *r);
const BIGNUM *RSA_get0_iqmp(const RSA *r);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
如果要区分版本使用,可以通过如下进行条件编译
#include <openssl/opensslv.h>
#if OPENSSL_VERSION_NUMBER < 0x10100000L
/* OpenSSL 1.0.2 and below (old code) */
#else
/* OpenSSL 1.1.0 and above (new code) */
#endif
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 修改记录
- X509 *x509
// x509->cert_info->key->pkey -->
EVP_PKEY *pkey = X509_get0_pubkey(x509);
// x509->cert_info->serialNumber -->
ASN1_INTEGER *serialNumber = X509_get_serialNumber(x509);
// x509->cert_info->issuer -->
X509_NAME *issuerName = X509_get_issuer_name(x509);
// x509->cert_info->subject -->
X509_NAME *subjectName = X509_get_subject_name(x509);
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- X509_NAME *x509Name
// x509Name->bytes->data
// x509Name->bytes->length -->
const ASN1_STRING *x509NameData = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(x509Name, 0));
x509NameData->data
x509NameData->length
1
2
3
4
5
2
3
4
5
- PKCS12_SAFEBAG *safeBag
// safeBag->attrib -->
const STACK_OF(X509_ATTRIBUTE) *safeBagAttrib = PKCS12_SAFEBAG_get0_attrs(safeBag);
// safeBag->value.keybag -->
PKCS8_PRIV_KEY_INFO *p8PrivateKeyInfo = PKCS12_SAFEBAG_get0_p8inf(safeBag);
// ASN1_TYPE* av = PKCS12_get_attr(safeBag, NID_localKeyID); -->
const ASN1_TYPE* av = PKCS12_SAFEBAG_get0_attr(safeBag, NID_localKeyID);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- EVP_PKEY *pKey
// pKey->pkey.rsa -->
RSA *rsa = EVP_PKEY_get0_RSA(pkey);
1
2
2
- RSA *rsa
// rsa->n -->
const BIGNUM *n = RSA_get0_n(rsa);
// rsa->e -->
const BIGNUM *e = RSA_get0_e(rsa);
// rsa->d -->
const BIGNUM *d = RSA_get0_d(rsa);
// rsa->p -->
const BIGNUM *p = RSA_get0_p(rsa);
// rsa->q -->
const BIGNUM *q = RSA_get0_q(rsa);
// rsa->dmp1 -->
const BIGNUM *dmp1 = RSA_get0_dmp1(rsa);
// rsa->dmq1 -->
const BIGNUM *dmq1 = RSA_get0_dmq1(rsa);
// rsa->iqmp -->
const BIGNUM *iqmp = RSA_get0_iqmp(rsa);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- BIGNUM *bn
// KEYLEN_MULTIPLIER 根据不同平台的值为 4 / 8
// bn->top * KEYLEN_MULTIPLIER -->
BN_num_bytes(bn);
// bn->d -->
unsigned char *tmpbuff = NULL_PTR;
unsigned int length = BN_num_bytes(bn);
tmpbuff = (unsigned char *)malloc(length);
BN_bn2bin(bn, tmpbuff);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
编辑此页 (opens new window)
上次更新: 2023/03/10, 17:42:48