Boa Noite Alexandre,
Não existe problema algum com a geração do XML do CTe, mais precisamente com a chave do mesmo.
O que esta acontecendo é que, ao alimentar o componente com os dados pertinentes ao transporte da carga, você esta informando ZERO ao campo cCT (código aleatório que compõe a chave do CT-e):
Ide.cCT := 0;
Desta forma ao executar os procedimentos GerarXml ou Assinar ou Validar é gerado a chave do CT-e, a rotina que a gera utiliza o valor do campo cCT se este for igual a ZERO é gerado um código aleatório.
O que eu faço é gerar esse código aleatório e depois atribuir esse valor ao campo cCT, veja este exemplo:
Randomize;
CodigoAleatorio := Random(999999999);
With ACBrCTe.Conhecimentos.Add.CTe do
begin
Ide.cCT := CodigoAleatorio;
(....)
end;
Fazendo desse jeito a rotina que gera a chave vai utilizar sempre o mesmo código aleatório, pois é diferente de ZERO, portanto a chave gerada sempre vai ser igual.
Outro detalhe muito importante eu salvo o valor do código Aleatório em um campo na tabela do banco de dados, juntamente com os demais dados.
Espero ter ajudado.