A mensagem diz que o OpenVPN não consegue carregar um certificado embutido, e o nome do arquivo que está na sua cabeça diz o contrário. O que o analisador recebeu importa mais do que o que o sistema de arquivos contém, porque a diretiva cert aceita dois tipos de valor completamente diferentes. Um é um caminho que ela abre; o outro é texto PEM que chegou dentro da configuração. Enquanto você não souber qual forma o cliente em execução recebeu, cada correção é um palpite.

Duas formas de armazenamento, uma diretiva

As diretivas cert, key e ca aceitam cada uma um caminho ou um bloco embutido. Quando o valor é um caminho, o OpenVPN abre esse arquivo e lê o objeto do disco. Quando a configuração contém um bloco delimitado por tags cert, a mesma diretiva consome em vez disso o conteúdo entre essas tags, e nenhum arquivo separado está envolvido.

As duas formas produzem no final o mesmo tipo de objeto, por isso uma implantação funcional pode alternar entre elas sem qualquer outra alteração. Um perfil que carrega um certificado de cliente e uma chave privada embutidos é autossuficiente, e copiá-lo para outra máquina funciona sem copiar também um diretório de certificados.

O contrário não é verdade. Deixar o client.crt ao lado de um perfil que embute os próprios dados não muda nada, porque nada na configuração se refere a esse arquivo. É a razão mais comum pela qual um arquivo que existe claramente parece ser ignorado.

Como um bloco embutido se torna um objeto

O conteúdo embutido é extraído da configuração e entregue ao analisador PEM como texto. Esse analisador espera os limites habituais: uma linha BEGIN, uma carga base64 e uma linha END correspondente. Se o bloco foi truncado por uma cópia falhada, envolvido em HTML por uma página de download ou aberto num editor que normalizou os hífens, o analisador falha num conteúdo que parece presente.

<cert>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</cert>

Por isso também a formulação do erro é enganosa. A palavra embutido descreve onde o carregador olhou, não o que encontrou ali. Um arquivo nomeado numa configuração e um objeto embutido nela podem produzir a mesma queixa quando os bytes subjacentes são inutilizáveis.

Verifique qual forma o perfil carregado realmente usa, não qual arquivo o seu editor abriu por acaso:

grep -nE '^(ca|cert|key) |^<(ca|cert|key)>' client.ovpn

Como uma referência de caminho é resolvida

Um valor de caminho é aberto relativamente ao diretório de trabalho do cliente, não ao diretório que contém a configuração. Sob o systemd esse diretório de trabalho é o que a unidade define, e uma execução interativa a partir da sua shell herda algo completamente diferente. Por isso o mesmo arquivo de configuração pode funcionar quando você o testa à mão e falhar como serviço.

Caminhos relativos herdam a mesma ambiguidade. Quando vir um nome de arquivo nu, pergunte qual é o diretório atual do processo em produção em vez de assumir que corresponde ao seu terminal.

Para um certificado armazenado separadamente, uma análise offline confirma o objeto antes de depurar qualquer coisa acima dele:

openssl x509 -in client.crt -noout -subject -issuer -dates
openssl pkey -in client.key -noout -check

Esses comandos provam que os arquivos são legíveis e estruturalmente válidos. Não provam que o par confia no emissor, que o certificado ainda está dentro da janela de validade ou que a chave lhe pertence.

O que o erro do analisador pode e não pode lhe dizer

Uma falha de análise localiza o problema num input e numa etapa. Não lhe diz qual das duas formas de armazenamento o cliente usou, nem lhe diz se o objeto teria sido aceito. São perguntas separadas com provas separadas.

Uma vez que a análise tem sucesso, a falha seguinte pertence a uma etapa posterior. Uma rejeição de confiança, uma discrepância de propósito ou uma discrepância de chave é reportada pelo par ou pela camada TLS, não pelo carregador. Substituir o mesmo arquivo repetidamente não moverá esse erro.

Mantenha a metade sensível fora dos relatórios públicos enquanto investiga. Partilhe os nomes das diretivas, o texto do erro e a estrutura do bloco, com o material de chave e qualquer carga identificativa removidos. O manual openvpn(8) documenta ambas as formas das diretivas de arquivo e o comportamento do diretório de trabalho por trás delas.

Artigos relacionados