X509证书

一、证书转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)