一、证书转X509结构体 #
1. PEM格式 #
- 接口如下,从BIO中读取X509结构体
1// 从bio读取
2X509 *PEM_read_bio_X509(BIO *out, X509 **x, pem_password_cb *cb, void *u);
3// 从fp中读取
4X509 *PEM_read_X509(FILE *out, X509 **x, pem_password_cb *cb, void *u);
从pem格式的证书文件中读取证书信息
- 从bio读取
1int main(int argc, char* argv[]) {
2 BIO* b = NULL;
3 X509* pcert;
4
5 // 读取PEM格式证书文件
6 FILE* fp = fopen("/home/wangyubo/work/src/local/openssl/20230418/ssl_diy/domain.crt", "r");
7 // 获取文件大小
8 fseek(fp, 0, SEEK_END);
9 auto file_size = ftell(fp);
10 rewind(fp);
11 // 分配内存
12 auto buffer = (char*)malloc(sizeof(char) * file_size);
13 if (buffer == NULL) {
14 printf("内存分配失败\n");
15 exit(1);
16 }
17 // 读取文件
18 fread(buffer, file_size, 1, fp);
19 // 关闭文件
20 fclose(fp);
21
22 // 转到bio中
23 if ((b = BIO_new(BIO_s_mem())) == NULL) {
24 printf("内存分配失败\n");
25 exit(1);
26 }
27 BIO_write(b, buffer, file_size);
28 // 从bio读取证书,X509为NULL代表里面申请内存,后面的密码回调和密码回调参数按需处理
29 pcert = PEM_read_bio_X509(b, NULL, NULL, NULL);
30 return 0;
31}
- 从fp中读取证书
1int main(int argc, char* argv[]) {
2 BIO* b = NULL;
3 X509* pcert;
4
5 // 读取PEM格式证书文件
6 FILE* fp = fopen("/home/wangyubo/work/src/local/openssl/20230418/ssl_diy/domain.crt", "r");
7 // 从fp读取证书,X509为NULL代表里面申请内存,后面的密码回调和密码回调参数按需处理
8 pcert = PEM_read_X509(fp, NULL, NULL, NULL);
9 fclose(fp);
10 return 0;
11}
2. der格式 #
- 接口有两个,一个是从bio读取,一个是直接从文件中读取
1X509 *d2i_X509_bio(BIO *bp, X509 **x509)
2X509 *d2i_X509_fp(FILE *fp, X509 **x509)
从der格式的证书文件中读取证书信息
- 从bio读取参考上面即可,从文件读取如下
1int main(int argc, char* argv[]) {
2 X509* pcert;
3
4 // 读取der格式证书文件
5 FILE* fp = fopen("/home/wangyubo/work/src/local/openssl/20230418/ssl_diy/signedDomain.cer", "r");
6 // 从bio读取证书,X509为NULL代表里面申请内存
7 pcert = d2i_X509_fp(fp, NULL);
8 fclose(fp);
9 return 0;
10}
二、X509结构体的一些操作 #
1. 获取公钥 #
1// 增加EVP_PKEY引用计数的获取
2EVP_PKEY *X509_get_pubkey(X509 *x)
3// 不增加EVP_PKEY引用计数的获取
4EVP_PKEY *X509_get0_pubkey(const X509 *x)