web-dev-qa-db-ja.com

Puppet:APIを介して手動で証明書を生成し、証明書要求を発行することはできません

私は今これを理解しようと非常に多くの時間を費やしてきました、そして私は本当にポインターが必要かもしれません。 tl; drは、1つのノードで証明書を手動で生成してから、APIを介して証明書要求を発行する必要があるということです。

公式ドキュメント によると、これはかなり簡単なはずです。これが私がしたことです。

Myhost.foobar.localの証明書を生成します(クライアントから)

$ puppet cert generate myhost.foobar.local

(クライアントからの)証明書からCSRを生成する

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

Puppetマスターに(クライアントから)証明書要求を発行します

APIはリモートAPI呼び出し用に開かれているため、テストノードからAPI呼び出しを行うことができます。ただし、エラーが返されるだけです。

$ 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

次のような他の呼び出しは問題なく機能します。

$ 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"
  }
]

(読みやすくするためにフォーマットされています)

ここで何かが足りないかどうかはわかりません。署名やノードのDELETE /取り消しなど、他のすべてのAPI呼び出しは正常に機能しているようです。失敗したように見えるのは、証明書要求の呼び出しだけです。おそらく私は明らかな何かを見逃しています。

Puppetマスターは「3.7.2-1puppetlabs」を実行しています。

5
vpetersson

PuppetLabsで素晴らしい人々と一緒にこれを分類しました。正しい署名証明書要求の呼び出しは次のようになります。

$ curl -k -X PUT -H "Content-Type: text/plain" --data-binary @request.csr https://puppetmaster:8140/production/certificate_request/hostname.foobar.local
1
vpetersson

まず、シェルスニペットでは、プロンプトが「$」であることに気付きました。私とは異なるパペット構成があることは間違いありませんが、これらのコマンドをrootとして実行する必要があります。ほぼ間違いなく、rootとしてpuppetを実行するクライアントシステムではそうです。 puppetmasterをroot以外のものとして実行する場合は、おそらくそのユーザーとしてpuppetCAコマンドを実行します。

次に、(また、セットアップに何か違いがあるかもしれませんが)、opensslコマンドを直接実行する必要はありません。私はパペットコマンドですべてを行います。

私がしていることは:

まず、クライアントのFQDNが希望どおりであることを確認します。これは、証明書の命名に使用されるためです。確認する hostname -f

クライアントシステム(ルートとして):

puppet agent --test

キーがまだ存在していないと仮定すると、上記では証明書のフィンガープリントが表示されますが、後で表示する必要がある場合は、次を使用します。

puppet agent --fingerprint --noop

Puppetmaster(rootとして):

puppet cert list

指紋を確認してから、次の手順を実行します。

puppet cert sign [client's fqdn]

問題が発生した場合は、/ var/lib/puppet/ssl(クライアントの場合)および/ var/lib/puppet/ssl/ca(マスターの場合)でさまざまなキー、証明書、および証明書要求を探します。私の経験では、レイアウトは自明であり、ものを一掃して再生成されることを期待するのは安全です。

APIについて具体的に質問しているようですが、本当に手動でアクセスする必要がありますか?その場合は、上記のレシピに従って証明書や証明書要求などを生成し、opensslコマンドを使用して、指定した場所に作成されたファイルを確認し、生成しているものと比較します。

PuppetがAPIリクエストをどのようにフォーマットするかを確認する場合、私が行うことは、ltraceを使用してopensslライブラリ呼び出しとの間でやり取りされるデータをキャッチすることです。 Ruby puppetが使用するフレームワークに精通している人は、代わりにデバッグコードを挿入することを選択するかもしれません(ただし、ltraceは本番サーバーではるかに安全です)

0
mc0e