Марионетка: не Может вручную генерировать сертификат и выпустить запрос сертификата по API

Я провел слишком много времени, пытаясь понять это теперь, и мне мог действительно быть нужен указатель. tl; доктор - то, что я должен вручную генерировать сертификат на одном узле и затем выпустить запрос сертификата по 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

Выпустите запрос сертификата Марионеточному ведущему устройству (от клиента)

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

(отформатированный для удобочитаемости)

Я не уверен, пропускаю ли я что-то здесь. Все другие вызовы API, кажется, хорошо работают, включая подписание, и УДАЛЯЮТ/ОТМЕНЯЮТ узлов. Это - просто вызов запроса сертификата, который, кажется, перестал работать. Возможно, я пропускаю что-то очевидное.

Марионеточное ведущее устройство работает '3.7.2-1puppetlabs'.

5
задан 23 March 2015 в 21:35
2 ответа
..

Разобрались с хорошими людьми в кукольной лаборатории. Вызов правильного запроса на подписание сертификата должен быть:

$ curl -k -X PUT -H "Content-Type: text/plain" --data-binary @request.csr https://puppetmaster:8140/production/certificate_request/hostname.foobar.local
1
ответ дан 3 December 2019 в 02:03

Во-первых, я заметил, что в ваших фрагментах оболочки ваше приглашение - это '$'. Несомненно, существуют конфигурации марионеток, отличные от моих, но мне нужно запускать эти команды как root. Почти наверняка так и в клиентской системе, где вы будете запускать puppet от имени пользователя root. Если вы запустите puppetmaster от имени пользователя, отличного от root, то, вероятно, вы запустите команды puppet CA от имени этого пользователя.

Во-вторых, (и опять же, в вашей настройке может быть что-то другое), мне никогда не нужно запускать команды openssl прямо.Я все делаю с помощью марионеточных команд.

Что я делаю:

Во-первых, убедитесь, что полное доменное имя вашего клиента такое, как вы хотите, поскольку оно будет использоваться в именовании сертификата. Проверьте с помощью hostname -f

В клиентской системе (как root):

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, чтобы просмотреть файлы, созданные в указанных мною местах, и сравнить с тем, что вы создаете.

Если это сводится к тому, чтобы посмотреть, как марионетка форматирует запрос API, я бы использовал ltrace для перехвата данных, передаваемых в / из вызовов библиотеки openssl. Кто-то, более знакомый с использованием марионеток Ruby Framework, может вместо этого вставить туда отладочный код. (ltrace намного безопаснее на производственном сервере)

0
ответ дан 3 December 2019 в 02:03

Теги

Похожие вопросы