Puppet: Não é possível gerar manualmente o certificado e emitir o pedido de certificação sobre a API

5

Eu gastei muito tempo tentando descobrir isso agora, e eu realmente poderia precisar de um ponteiro. O tl; dr é que preciso gerar manualmente um certificado em um nó e, em seguida, emitir uma solicitação de certificado pela API.

De acordo com a documentação oficial , isso deve ser bastante simples. Aqui está o que eu fiz.

Gere um certificado para myhost.foobar.local (do cliente)

$ puppet cert generate myhost.foobar.local

Gerar um CSR do certificado (do cliente)

$ openssl req -new -key /var/lib/puppet/ssl/private_keys/myhost.foobar.local.pem -subj "/CN=myhost.foobar.local" -out request.csr

Emita uma solicitação de certificado ao mestre de marionetes (do cliente)

A API foi aberta para chamadas de API remotas, para que possamos fazer uma chamada de API a partir do nó de teste. No entanto, só recebo um erro.

$ curl -k -X PUT -H "Content-Type: text/plain" --data-binary @request.csr https://puppetmaster:8140/production/certificate_request/no_key
Could not intern from s: not enough data

Outras chamadas funcionam bem, como:

$ curl -k -H "Accept: pson" https://puppetmaster:8140/production/certificate_statuses/all
[
  {
    "state" : "signed",
    "fingerprints" : {
      "default" : "5A:35:D2:19:59:C6:6E:B8:BE:64:54:FA:14:10:CE:FC:4A:C8:45:F6:DE:8E:7C:E9:2D:B0:5B:E0:5D:93:35:DD",
      "SHA256" : "5A:35:D2:19:59:C6:6E:B8:BE:64:54:FA:14:10:CE:FC:4A:C8:45:F6:DE:8E:7C:E9:2D:B0:5B:E0:5D:93:35:DD",
      "SHA1" : "04:13:AF:B9:CB:44:01:64:24:C9:E0:D6:F4:0D:60:41:52:77:EE:45",
      "SHA512" : "2C:97:11:B9:ED:38:00:1F:B0:7B:75:ED:4C:DB:B1:3E:3D:63:09:C1:38:E2:A3:4F:50:A4:FD:71:FF:55:94:C3:7A:0B:F6:D5:79:09:6D:53:39:B1:EC:C2:BF:DF:CD:9B:67:60:B9:9C:0C:82:51:E9:23:30:AA:33:AC:8B:E9:94"
    },
    "name" : "puppet.foobar.local",
    "dns_alt_names" : [
      "DNS:puppet",
      "DNS:puppet.foobar.local"
    ],
    "fingerprint" : "5A:35:D2:19:59:C6:6E:B8:BE:64:54:FA:14:10:CE:FC:4A:C8:45:F6:DE:8E:7C:E9:2D:B0:5B:E0:5D:93:35:DD"
  },
  {
    "state" : "signed",
    "fingerprints" : {
      "default" : "32:7B:B3:4E:BE:EB:66:21:E5:96:D0:7B:BA:BF:1D:FC:D5:90:E1:6F:52:6B:AB:CF:98:7E:2A:E3:48:00:A2:CF",
      "SHA256" : "32:7B:B3:4E:BE:EB:66:21:E5:96:D0:7B:BA:BF:1D:FC:D5:90:E1:6F:52:6B:AB:CF:98:7E:2A:E3:48:00:A2:CF",
      "SHA1" : "A4:17:D3:05:8A:72:BE:6C:C2:0C:FA:C4:8A:3B:6E:C4:29:90:4B:95",
      "SHA512" : "2D:C3:EE:7E:E3:39:99:C8:21:B8:97:E8:BF:FE:62:26:A8:B8:63:30:C9:F1:77:80:DB:FC:DF:B8:ED:1E:A2:6C:C2:F9:FE:5D:CA:17:D9:08:1E:EB:AA:AF:3D:99:A6:F9:3D:E6:86:A0:B3:3F:E9:EC:1C:7F:25:95:B5:D6:7C:51"
    },
    "name" : "965c252e48c3",
    "dns_alt_names" : [

    ],
    "fingerprint" : "32:7B:B3:4E:BE:EB:66:21:E5:96:D0:7B:BA:BF:1D:FC:D5:90:E1:6F:52:6B:AB:CF:98:7E:2A:E3:48:00:A2:CF"
  }
]

(formatado para legibilidade)

Não tenho certeza se estou perdendo alguma coisa aqui. Todas as outras chamadas de API parecem funcionar bem, incluindo assinatura e DELETE / revogação de nós. É apenas a chamada de solicitação de certificado que parece falhar. Talvez eu esteja sentindo falta de algo óbvio.

O mestre de marionetes está executando '3.7.2-1puppetlabs'.

    
por vpetersson 27.10.2014 / 14:11

2 respostas

1

Peguei isso junto com os caras legais do Puppet Labs. A chamada de solicitação de certificado de assinatura correta deve ser:

$ curl -k -X PUT -H "Content-Type: text/plain" --data-binary @request.csr https://puppetmaster:8140/production/certificate_request/hostname.foobar.local
    
por 06.11.2014 / 12:12
0
Em primeiro lugar, noto que nos seus fragmentos de shell, seu prompt é um '$'. Sem dúvida, existem configurações de fantoches diferentes das minhas, mas eu precisaria estar executando esses comandos como root. Quase certamente no sistema do cliente, onde você estaria executando o boneco como root. Se você executar o puppetmaster como algo diferente de root, presumivelmente você executaria os comandos puppet CA como aquele usuário.

Em segundo lugar, (e novamente pode haver algo diferente em sua configuração), eu nunca preciso executar comandos openssl diretamente. Eu faço tudo com comandos de fantoche.

O que eu faço é:

Primeiro, verifique se o FQDN do seu cliente está como você deseja, pois isso será usado na nomenclatura do certificado. Verifique com hostname -f

No sistema do cliente (como root):

puppet agent --test

Supondo que a chave já não saia, o texto acima exibirá a impressão digital do certificado, mas se posteriormente você precisar exibi-la, use:

puppet agent --fingerprint --noop

On puppetmaster (como root):

puppet cert list

Verifique a impressão digital e faça:

puppet cert sign [client's fqdn]

Se algo der errado, procure as várias chaves, certificados e pedidos de certificado em / var / lib / puppet / ssl (no cliente) e / var / lib / puppet / ssl / ca (no mestre). Na minha experiência, o layout é auto-explicativo, e é seguro apagar coisas e esperar que elas sejam geradas novamente.

Eu vejo que você está perguntando especificamente sobre a API, mas você realmente precisa acessá-la manualmente? Se fizer isso, siga a receita acima, para gerar certificados, solicitações de certificados, etc. e, em seguida, use os comandos openssl para examinar os arquivos criados nos locais indicados e comparar com o que você está gerando.

Se for preciso dar uma olhada em como o fantoche formata a solicitação da API, o que eu faria é usar o ltrace para capturar os dados transmitidos de / para as chamadas da biblioteca openssl. Alguém mais familiarizado com os fantoches do framework ruby pode escolher inserir algum código de depuração lá. (o ltrace é muito mais seguro em um servidor de produção)

    
por 02.11.2014 / 08:12