【发布时间】:2022-01-11 16:21:32
【问题描述】:
我有以下证书:
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIVAJ3wzBnLSnQvYi31rNVQRAXDUO/zMA0GCSqGSIb3DQEB
CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t
IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0yMDA3MjgxMTMz
MTJaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh
dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHc2tmezGoekLjkQlb
+YOBKFyPswYR+GLq/JRVbFX2k4OrHF5js4GTfbHm1oQ733KbcnIugdejtQnRhtnr
1HRk3pqedVhRKGRo2DFDYyuX3K1UR6xna1poJF+6WNy6vXGxIQYKi7SNS5LtzkRT
1FCziOLBaxfcCRNgR1NBHjlcFsUWyL4evMok6h/wU7HA3/dfKEisyLdh3sMy7Yox
Im/ldvyX+9pH7Hj0TrGGTd5f8GtX8npNuSKdkntuag95r+vAaAPp6bQVyPWm8T/G
SUN8N7Nvc9DOcJ8ZhvB/Ubq+Fa/eoUnr3SgXInufLHhrfxJW7dyrBTlw/1kdXgYw
YiKnAgMBAAGjYDBeMB8GA1UdIwQYMBaAFP4UzdqnzQ4l89+D7UhXC5MKWnOJMB0G
A1UdDgQWBBSn95OHFqTn3DrE3anpNq5RoOsT+DAMBgNVHRMBAf8EAjAAMA4GA1Ud
DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEA2Hvrxy2N0xt3I/w/7JIyoTH4
ixUKMaD1QXe+g6LrsQSCVVsaq0L468OpyydVzQLQONXvDDRv3rqIEel1hPAJNG0y
dp3g+WC1dPl7E44btM+59gBf1369lFwV6FbJMwCltVBUJ4hFAjt3QTkWRHq6DlFQ
wa896aSr5UUiVNAJjf/hLVjERlVG4wDjPN7YifQssRqlNcYDgok3UhVsBfKIGnct
WFbisX+0ONMyNnE1Qq6bX5g4sLN7VlwFhADiz1Xp2rUtLECR1NSPutYibWyvJJ8d
htYYV1a0FSkg7JKyvOIJ8IYKEPsKE+UYo1Z8DwkmHHcap+h0OMWAnKQgRXn6QQ==
-----END CERTIFICATE-----
我把它输入了几个证书阅读网站,它们都能够解析和显示它的内容。
我尝试使用 mbedtls 使用以下代码解析此证书:
mbedtls_x509_crt certificate;
mbedtls_x509_crt_init(&certificate);
char certificate_string[] = "-----BEGIN CERTIFICATE--..."
int result_code = mbedtls_x509_crt_parse(&certificate, (unsigned char*)certificate_string, strlen(certificate_string));
if(result_code != 0) {
char err_str[256];
mbedtls_strerror(result_code, err_str, 256);
printf("Could not read the certificate. Error: %s\n", err_str);
return -1;
}
然后我检查 result_code 是否为 0,如果不是,则打印错误消息。每次尝试解析此证书时,我都会收到以下错误消息: “无法读取证书。错误:X509 - CRT/CRL/CSR 格式无效,例如需要不同的类型”
我尝试查看 mbedtls_x509_crt_parse 代码以了解导致此消息的原因,然后我修改了代码以改用以下 mbedtls_x509_crt_parse 片段:
mbedtls_pem_context pem;
size_t use_len;
mbedtls_pem_init(&pem);
// If we get there, we know the string is null-terminated
int ret = mbedtls_pem_read_buffer(&pem,
"-----BEGIN CERTIFICATE-----",
"-----END CERTIFICATE-----",
(unsigned char *)certificate_string,
NULL,
0,
&use_len);
if(ret != 0) {
printf("we could not pem read the string\n");
return -1;
}
else {
printf("We pem read the certificate\n");
}
ret = mbedtls_x509_crt_parse_der(&certificate, pem.buf, pem.buflen);
if(ret != 0) {
printf("crt parse der has failed\n");
}
else {
printf("The issuer is: %s\n", certificate.issuer.val.p);
return 0;
}
当我运行程序时,我得到以下输出:
491231235959Z010�Uzon 网络服务 O=Amazon.com Inc. L=西雅图 ST=华盛顿 C=US0 *�H�� AWS IoT 证书0�"0
我一直在寻找可能有问题的答案,我发现一个帖子说 mbedtls 默认配置为使用 RSA 1024,所以如果你的密钥是 2048(它在我的里面),那么 mbedtls 将有一个解析错误。我将配置文件修改为使用 2048 并重建了库,但仍然出现错误。
有什么想法吗?我觉得我真的很接近,因为 mbedtls_x509_crt_parse 几乎全程执行。根据我看到的代码示例,我很确定我正确地使用了该库。
谢谢!
【问题讨论】:
-
mbedtls_x509_crt_parse的文档说buflen参数包含空终止符,因此请尝试传递1 + strlen(certificate_string)。 -
我添加了它,它不再失败,但它现在给了我以下输出:491231235959Z010�Uzon Web Services O=Amazon.com Inc. L=Seattle ST=Washington C=US0 *�H �� AWS IoT 证书0�"0
-
我猜它不是空终止的?如果将输出限制为
certificate.issuer.val.len字节怎么办? -
嗯,为了确定,我在 certificate_string 的末尾添加了一个空字符,我得到了相同的输出。你能澄清“限制输出”吗?你的意思是只显示颁发者字符串的第一个 val.len 字节?
-
对不起,我的意思是
printf("The issuer is: %.*s\n", (int)certificate.issuer.val.len, certificate.issuer.val.p);。
标签: c certificate x509 mbedtls