Usando (tentando/aprendendo) WolfSSL em um dispositivo limitado (pico) - precisando de um cliente TLS. Gostaria de manter a compilação o mais pequena possível.
Tentando carregar a CA confiável
const char *cacerts = AWS_ROOT_CA1_SIGNED;
if ((ret = wolfSSL_CTX_load_verify_buffer(pCtx, (const unsigned char *)cacerts,
strlen(cacerts), SSL_FILETYPE_PEM)) != WOLFSSL_SUCCESS) {
displayWatermark();
printf("ERROR: failed to load CA cert. %d\n", ret);
for(;;);
}
wolfSSL_CTX_set_verify(pCtx, SSL_VERIFY_PEER, verifyCert);
No entanto, o certificado raiz não é reconhecido :/ Ainda acredito que tenho algo errado (notei que o certificado raiz pode vir com assinatura cruzada para alguns serviços)
No retorno de chamada de verificação, preverify 0, erro = -188, erro de ASN sem signatário para confirmar falha. Profundidade do erro de verificação 2, domínio Amazon Root CA 1
Minha ideia é usar o callback verify para validar os certificados com base em seu número de série ou impressão digital. Deve ser muito menor do que ter uma lista de certificados CA ou intermediários incorporados ao código.
No objeto WOLFSSL_X509_STORE_CTX há uma matriz de buffers certs
contendo toda a cadeia. De acordo com os exemplos, os buffers store->cert estão mantendo a cadeia de certificados do servidor no formato DER.
Descobri que se eu definir OPENSSL_EXTRA_X509_SMALL
, o armazenamento de retorno de chamada contém o current_cert
atributo (contendo apenas o certificado raiz), mas eu gostaria de manter a compilação sem carga adicional, se possível. E então não tenho certeza se precisarei validar toda a cadeia de qualquer maneira (nome do host, datas de validade, ..)
QUESTÕES:
Existe uma maneira de obter atributos (assinatura, nome, serial do emissor...) do buffer DER? Vejo essa opção para os certificados X509 analisados, mas... existe uma função disponível para analisar o formato DER?
Sou membro da equipe wolfSSL.
Aqui está um trecho.
A declaração para a estrutura cert decodificada pode ser encontrada em
wolfssl/wolfcrypt/asn.h