下午好🌅🌅🌅
本答案参考ChatGPT-3.5
根据你提供的代码和错误提示,可能导致Mbedtls PEM证书解析失败的原因有以下几点:
-
PEM格式的证书内容是否完整:确保证书的起始标签
-----BEGIN CERTIFICATE-----
和结束标签-----END CERTIFICATE-----
没有被修改、删除或添加其他字符,确保证书内容没有被截断。 -
PEM证书是否包含其他非必要的内容:确保证书中只包含必要的PEM格式证书,而不包含其他内容,如私钥、公钥或其他非X.509证书内容。
-
PEM解析函数的参数是否正确设置:确保
mbedtls_pem_read_buffer
函数的参数header
和footer
与给定的PEM证书起始标签和结束标签匹配,确保cert_buffer_len_used
在使用之前被初始化为0。
除了以上几点,还有一些其他的建议可以考虑:
-
使用
mbedtls_pem_read_buffer()
函数的返回值进行错误检查:确保函数调用后返回的错误码没有出错,若出错请使用mbedtls_strerror()
函数获取错误描述。 -
确保正确初始化
mbedtls_x509_crt
结构体:在调用mbedtls_x509_crt_parse()
函数之前,确保已经对x509_crt
结构体调用过mbedtls_x509_crt_init()
进行初始化。 -
检查证书是否损坏:可以尝试使用其他工具对该PEM证书进行解析,如openssl指令,以验证证书的完整性和有效性。
以下是修改后的代码,包含以上的建议和修改:
#include "mbedtls/pem.h"
#include "mbedtls/ssl.h"
unsigned char cert_buffer[] = "-----BEGIN CERTIFICATE-----\n"
"MIIBrTCCAVKgAWIBAgIUDXpIQEyiJBRFhdFkUZSAe+ppeSIwCgYIKoZIzj0EAwIw\n"
"JjEkMCIGA1UEAWWbTU9DSy1DQVItSUSURVJNRURJQVRFLVVTQS1NMB4XDTE5MDEw\n"
"MTAWMDAWMFoXDTQ5MDEWMTAWMDAWMFoWKzEpMCcGA1UEAwwgVi5NTONLLlVTTS5C\n"
"UK5ELjAWMDEWMjAZMDQWNTA2MDCWWTATBgcqhkjOPQIBBggqhkjOPQMBBWNCAAQc\n"
"hCuvIcwrKDuDA2ulJt286cIB9j6A3HNQiMTzypD/8qQIunRPeLZoyItj0Jcj40jS\n"
"TSnRU/UxFeCKMUV/1oYBo1kwVzAfBgNVHSMEGDAWgBTml1BXEAkTw6sHKdRTP04R\n"
"KZo0gZAMBgNVHRMBAf8EAjAAMBYGCiSGAQQBgsRpBQEBAf8EBTADAgEBMA4GA1Ud\n"
"DwEB/WQEAWIHgDAKBggqhkjOPQQDAgNJADBGAiEAy190tqrQUn6wv9aMgr+8iczQ\n"
"Uw7UmilU56dhswckNJkCIQCxDbP720D/5623kVeiEVxBDPfpaoS72sRGO+qVK3Ec\n"
"3g==\n"
"-----END CERTIFICATE-----\n";
int main() {
int errorCode = 0;
mbedtls_pem_context pem_context;
mbedtls_x509_crt x509_crt;
mbedtls_pem_init(&pem_context);
mbedtls_x509_crt_init(&x509_crt);
size_t cert_buffer_len_used = 0;
// PEM格式证书解析
errorCode = mbedtls_pem_read_buffer(&pem_context, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----", cert_buffer, NULL, 0, &cert_buffer_len_used);
if (errorCode != 0) {
printf("mbedtls_pem_read_buffer failed with error: %d\n", errorCode);
mbedtls_pem_free(&pem_context);
return -1;
}
// 解析PEM证书内容
errorCode = mbedtls_x509_crt_parse(&x509_crt, pem_context.private_buf, pem_context.private_buflen);
if (errorCode != 0) {
printf("mbedtls_x509_crt_parse failed with error: %d\n", errorCode);
mbedtls_pem_free(&pem_context);
mbedtls_x509_crt_free(&x509_crt);
return -1;
}
// 证书解析成功
// TODO: 在此处对证书进行操作
// 释放资源
mbedtls_pem_free(&pem_context);
mbedtls_x509_crt_free(&x509_crt);
return 0;
}
希望以上建议和修改能帮助你解决问题。如果问题仍然存在,请提供更多的信息,如错误码的定义和错误描述,以便我们进一步分析和解决。