【问题标题】:Converting .crt to .pem using OpenSSL API使用 OpenSSL API 将 .crt 转换为 .pem
【发布时间】:2014-11-26 09:01:39
【问题描述】:

谁能告诉我如何使用 openssl API 将 .crt 文件转换为 .pem 文件? 我试过这样:

FILE *fl = fopen(cert_filestr, "r");
fseek(fl, 0, SEEK_END);
long len = ftell(fl);
char *ret = malloc(len);
fseek(fl, 0, SEEK_SET);
fread(ret, 1, len, fl);
fclose(fl);
BIO* input = BIO_new_mem_buf((void*)ret, sizeof(ret));
x509 = d2i_X509_bio(input, NULL);
FILE* fd = fopen(certificateFile, "w+");
BIO* output = BIO_new_fp(fd, BIO_NOCLOSE);
X509_print_ex(output, x509, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
fclose(fd);

但这不起作用,x509 始终为 NULL。

【问题讨论】:

  • 一个主要问题是在指针上使用sizeof 会得到指针的大小,而不是指针指向的大小。
  • 另外,在 C 语言中,您不必将指针转换为 void*,所有指针都可以隐式转换为(和从)void*。
  • 哦,不,'char **size = malloc(sizeof(fl));'是否有可能获得合适的尺寸?
  • len的大小,就是你需要传递给BIO_new_mem_buf的大小。
  • 好的,谢谢!修好了!但问题仍然存在..

标签: c api openssl pem crt


【解决方案1】:

.crt 证书“可以编码为二进制 DER 或 ASCII PEM。” (见http://info.ssl.com/article.aspx?id=12149)。

如果您的 .crt 文件已经经过 PEM 编码,则无需转换,只需将文件名从 .crt 更改为 .pem。

如果编码为 DER,则将其转换为 PEM,如下例所示:

X509* x509 = NULL;
FILE* fd = NULL,*fl = NULL;

fl = fopen(cert_filestr,"rb");
if(fl) 
{
    fd = fopen(certificateFile,"w+");
    if(fd) 
    {
        x509 = d2i_X509_fp(fl,NULL);
        if(x509) 
        {
            PEM_write_X509(fd,x509);
        }
        else 
        {
           printf("failed to parse to X509 from fl");
        }
        fclose(fd);
    }
    else
    {
        printf("can't open fd");
    }
   fclose(fl);
}
else 
{
    printf("can't open f");
}

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 2013-06-22
    • 2023-03-20
    • 2023-03-04
    • 1970-01-01
    • 2011-06-09
    • 2011-07-22
    • 2015-03-07
    • 2012-08-13
    相关资源
    最近更新 更多