Como o OpenVPN resolve o certificado e a chave: PEM embutido ou caminho
A mesma diretiva carrega um caminho de arquivo ou um objeto PEM embutido. Leia qual dos dois o perfil carregado usa antes de mover certificados.
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.