Для безопасности пользователей, были введены ключи для репозитариев, чтобы подтверждать их надежность. Представьте себе, что будет, если в репозитарий покласть что-то лишнее =). С одной стороны, это хорошо, а с другой - не очень. В том плане, что новички просто теряются.
Иногда ключи нужно обновлять, а как это сделать знает не каждый. Представьте ситуацию: вы пытаетесь получить обновления, и консоль выдает вам что-то типа:
W: Ошибка: http://ppa.launchpad.net jaunty Release: Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY BE80FFE08E772DB0
Проблема решается довольно просто. Возьмите последние 8 символов кода ключа. В нашем случае:
BE80FFE08E772DB0 -> 8E772DB0
И выполните 2 команды:
gpg --keyserver keyserver.ubuntu.com --recv 8E772DB0
Если все ок, то получаем:
gpg: запрашиваю ключ 8E772DB0 с hkp сервера keyserver.ubuntu.com
gpg: ключ 8E772DB0: открытый ключ “Launchpad PPA for Plasmoid” импортирован
gpg: Всего обработано: 1
gpg: импортировано: 1 (RSA: 1)
И вторая команда:
gpg --export --armor 8E772DB0 | sudo apt-key add --
--------------------------
Автоматизация добавления ключей:
Пользователь urusha внес и свои труды в эту тему. Создайте файл check_keys.sh, его вместимое:
#!/bin/sh
KEYS=`sudo apt-get update | awk '/NO_PUBKEY/ {print($NF)}'`
if [ -z $KEYS ]
then
echo "No missed public keys found."
else
echo "Missed public keys: $KEYS"
for KEY in $KEYS
do
gpg --keyserver keyserver.ubuntu.com --recv $KEY &&\
gpg --export --armor $KEY | sudo apt-key add -- &&\
echo "Public key $KEY has been added."
done
fi
А вот и мой скрипт на python (getkey.py):
# -*- coding: utf-8 -*-
import sys, os
if not 'linux' in sys.platform:
print 'This script is for linux only'
else:
if len(sys.argv) <= 1:
print 'No arguments'
else:
for i in range (len(sys.argv)-1):
sNeedKey = sys.argv[i+1][-8:]
sSysRequest = 'gpg --keyserver keyserver.ubuntu.com --recv {0} && gpg --export --armor {0} | sudo apt-key add --'.format(sNeedKey)
try:
os.system(sSysRequest)
except error:
print 'Can`t add need key: ' + str(error)
Использовать так (можно несколько ключей-аргументов):
python getkey.py BE80FFE08E772DB0
python getkey.py BE80FFE08E772DB0 4CF19C3233BAC1B3
Сейчас делаю инсталлер к скрипту, чтобы можно было глобально использовать
UPD: Сделал пакет, качаем приложенный файл к посту. Делаем распаковку, устанавливаем:
sudo python setup.py install
После этого наш скрипт будет прописан глобально в системе. В любой директории можно выполнить команду:
getkey.py BE80FFE08E772DB0
getkey.py BE80FFE08E772DB0 4CF19C3233BAC1B3
Скачать пакет можно по этому адресу (форум запретил такие вложения).
Думаю, что этот метод самый простый.
Комментарии (56)
В общем зря они это сделали... Механизм сложный и неинтуитивный. Нужен GUI.
А я не согласен... Как уже сказал, это огромный плюс в защите. Иначе, какой-то новичок добавил бы себе левый репозитарий с левого сайта. Как думаете, что бы могло быть с его компьютером?
А на счет GUI согласен. Я могу попытаться сделать программу, только как она будет работать.
Да как же может не быть GUI? =) Уже все сделали, просто немного телодвижений больше делать надо...
Привиду пример для репозитория kubuntu-experimental/ppa/ubuntu
Вот мы не знали этот репозиторий, а нам сказали его добавить, чтобы от туда что-то установить - это самый сложный случай :)
Обновляемся - видим сообщение
"W: Ошибка: http://ppa.launchpad.net jaunty Release: Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY 60487016493B3065"
Упс
Пол логике: нет ключей, но есть центральный механизм keyserver.ubuntu.com
Топаем на этот сайт
В поле Search String вводим тот самый страшный набор символов в формате (согласно подсказке) 0x, например "0x60487016493B3065".
В моем случае поиск выводит на:
http://keyserver.ubuntu.com:11371/pks/lookup?search=0x60487016493B3065&op=vindex
Вверху читаем внимательно, видим строчку:
pub 1024R/493B3065 2009-01-21
Вот эта ссылка и есть наш ключ!
Переходим, копируем содержимое страницы в любимый редактор и сохраняем, например в ~/key.pgp
Открываем любимое приложение для управления пакетами и импортируем ключ.
На примере kpackagekit:
Settings->Edit Software Sources-> (в новом окошке) вкладка Authentication -> (кнопка) Import Key File -> выбираем сохраненный ~/key.pgp
На мой взгляд все гораздо легче, если вы сами добавляете репозиторий, а не действуете по наводке - все упрощается :)
Вот например вы сами нашли на ланчпаде проект "Project Neon"
Смотрим на страницу внимательнее и видим текст:
This repository is signed with 1024R/0F7992B0 OpenPGP key. Follow these instructions for installing packages from this PPA.
Переходим сразу по ссылке - там ключ. Сохраняем, импортируем.... все очень даже понятно :)
Можно извращаться как только сможешь =). Суть в том, что время мне дорого... И каждый раз заходить, вбивать ключ, качать его, устанавливать... Если я смогу это 1 командой из консоли + копи/паст ключа.
ИМХО
К счастью, мне тоже удобнее зачастую воспользоваться консолью. И это касается не только добавления ключа =)
Но я в своем посте и не утверждал, как вам возможно показалось, что через графику проще. Я вообще не на ваш пост отвечал.
Пользователь с ником Infinitiv сказал, что нужен гуй, я описал, как гуй использовать.
Поэтому понять ваш ответ на свой пост я уже не могу. Единственно возникает желание попросить вас немного внимательнее следить за тредом. Если вы хотели высказаться не применительно к моему ответу предыдущему писателю, то не вводите меня в заблуждение, отвечая на мой пост.
Да, извиняюсь. Поздно уже, не доглядел =).
;)
Переходим по вашей ссылке, там ключ:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.0.10
mI0ESXTXjwEEALR/KX4jGCtnwfrx8ZMrQ9ypcB2xWComeRUIR0vPk+adBerReROVHaufcQ/p
fmXyO0eJTrVVxtVcyk0t+Epo3FoZSlHmpf1NNbYpTGsEJautfJSKLV+RNVb3CxvaQSnAB+27
jOsawWegcU/NzLSR3WlUhyC1gqwPYG/Lje5NnYkhABEBAAG0HkxhdW5jaHBhZCBQUEEgZm9y
IFByb2plY3QgTmVvboi2BBMBAgAgBQJJdNePAhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AA
CgkQd4l4sA95krB4ZwQAohx//vWV5oLwM62uXKRYZbyrg3aRjhjJ8GjhJLUO+XtvluyCQz5h
Y5Ipm+WcQrzeWyAd46XpquZSkvdW/PQhDlNATVPBs2Uo4rkLGN0vGtenLcb0ihXndKSaChGR
fb/Ei2a/bpRypOMw0w47+/3Vqj+zqZyD8U/jP+JJm/b7Yd8=
=UAY5
-----END PGP PUBLIC KEY BLOCK-----
Сохраняем как key.gpg (!!! а не key.pgp !!!), импортируем, получаем окошко с сообщением:
Возможно выбранный файл не является файлом ключа GPG или поврежден.
При этом, в то же самое время:
$ wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -
OK
за инструкцию респект )
Никогда не сталкивался с такой проблемой... Первый раз вижу и слышу...
Считаю ключи - отличной системой защиты. Никогда не испытывал проблемы с этим.
Значит Вам просто повезло. Я в свое время много перетерпел их...
Может быть это в новых дистрибутивах?
У меня 8.04.2
Не, это здесь ни при чем. Защита была везде. Вам просто везло, говорю же =) Или вы не так часто добавляете новые репозитарии.
Второе! Я их вообще не добавляю)
4х мне хватает)
В любом случае - за статью респект)
Полезная статья. Особенно такая проблема возникает с репозиториями игр.
спасибо ) недавно столкнулся с такой траблой, теперь знаю что делать =)
спасибо
Интересно, что man apt-key намекает на то что вместо:
gpg --keyserver keyserver.ubuntu.com --recv KEYKEYKEYKEY
gpg --export --armor KEYKEYKEYKEY | sudo apt-key add --
можно просто, одной командой:
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com KEYKEYKEYKEY
и резать id ключа до последних 8 цифр совсем не обязательно, всетаки;)
так что можно подправить рецепты.
написал не в ту ветвь(
На нетбуке без мыши не удобно добавлять все эти ключи, поэтому написал скрипт check_keys.sh
запускается от обычного пользователя, добавляет все ключи на которые жалуется apt-get update
#!/bin/sh
KEYS=`sudo apt-get update | awk '/NO_PUBKEY/ {print($NF)}'`
if [ -z $KEYS ]
then
echo "No missed public keys found."
else
echo "Missed public keys: $KEYS"
for KEY in $KEYS
do
gpg --keyserver keyserver.ubuntu.com --recv $KEY &&\
gpg --export --armor $KEY | sudo apt-key add -- &&\
echo "Public key $KEY has been added."
done
fi
Обновил, теперь доступен и мой вариант скрипта на Python.
UPD: Теперь можно скачать (по ссылке выше) установочный пакет моего скрипта, для более простой работы.
Мне кажется, можно в подшивку отправить!
правильно слово пишется "репозитОрий" и никак иначе.
в остальном статья очень хорошая. спасибо!
Всегда пожалуйста ;)
А вот это спорный вопрос, как пишется =). Мне больше по душе репозитОрий, не знаю, почему здесь через А писал.
Через "О" действительно правильно, я специально изучал этот вопрос, есть люди разделяющие написание через "А", но они грамматическое меньшинство и те правила которые есть явно в защиту "О".
Кстати, было небольшое обсуждение на тему того, не стоит ли использовать русский термин "хранилище", или хотя бы иногда его упоминать для семантико-логической связи начинающих пользоватлей, тема: Термин "репозиторий"
Спасибо за статью - очень познавательно. Единственное, хотелось бы еще узнать как посмотреть детальную инфу о неподписаном репозитории, прежде чем импортировать его ключ в систему.. Не для того из создавали, надо полагать, чтобы все подряд потом скриптами одобрять ;-)
"Launchpad PPA for Plasmoid" -- слишком малоинформативно. Нет ли способов вытянуть из key-server'а поболее инфы (включая ссылку на страницу проекта в Launchpad)?
gui-apt-key
Точно. Взять key id, вставить его в соответствующее поле внизу окна утилиты, нажать Add
А скрипты лучше изучать по какой литературе?
Тут немного некорректный вопрос. Скрипты какие? Да и такого понятия как просто скрипт нету. Для начала вам нужно разобраться, что вы хотите сделать. Есть bash-скрипты, они подойдут только для *nix и работают в определенной области. Можно использовать скриптовые языки программирования (python, ruby, perl). Самый простой среди них - python, на котором я и написал скрипт выше. Выберите, что вы хотите делать с этими скриптами - я вам подскажу литературу.
Предположим писать программку для кубунту десктоп простенькую.
известное дело по какой: по художественной! %)
При выполнении sudo python setup.py происходит следующее:
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: setup.py --help [cmd1 cmd2 ...]
or: setup.py --help-commands
or: setup.py cmd --help
error: no commands supplied.
Объясните,пожалуйста,что делать! Опыт работы в Линуксе - неделя. =)
P.S. Система Kubuntu 9.04
Спасибо! Помог первый вариант но и последний скрипт тоже себе сохранил.
Огромная благодарность!
отлично!
только что наконец-то разобрался аж с 4-мя ключами - доволен как слон на складе бананов ;)
Доброго времени суток. Подскажите по первому скрипту, что не так. Запускаю скрипт, в ответ почти сразу получаю
W: Ошибка: http://archive.infralinux.org jaunty-updates Release: Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY CAEFE9CA490EA7C5
после чего секунд 10-15 тишина и потомW: Вы можете запустить 'apt-get update' для исправления этих ошибок
No missed public keys found.
Up!: после изменения скрипта до вида
#!/bin/sh
в ответ получилKEYS=`sudo apt-get update`
echo "keys-$KEYS"
W: Ошибка: http://archive.infralinux.org jaunty-updates Release: Следующие подписи не могут быть проверены, так как недоступен открытый ключ: NO_PUBKEY CAEFE9CA490EA7C5
т.е. получается фраза про отсутствие ключа не попадает в переменную кейс?W: Вы можете запустить 'apt-get update' для исправления этих ошибок
keys-Получено:1 http://archive.infralinux.org jaunty-updates Release.gpg [197B]
Игн http://archive.infralinux.org jaunty-updates/restricted Translation-ru
Получено:2 http://archive.infralinux.org jaunty-updates Release [8867B]
Игн http://archive.infralinux.org jaunty-updates Release
Получено:3 http://archive.infralinux.org jaunty-updates/restricted Packages [14B]
Получено 9078Б за 1s (7299Б/c)
Чтение списков пакетов...
Да, с момента публикации нашлось пару глюков... Вот поправленный + с функционалом скрипта Ockonal'a, то есть им можно не только проверять, все ли с ключами ок, но и просто добавлять свои...
#!/bin/sh
if [ -z $1 ]
then
KEYS=`sudo apt-get -qq update 2>&1 | awk '/NO_PUBKEY/ {print($NF)}' | uniq`
if [ -z $KEYS ]
then
echo "No missed public keys found."
else
echo "Missed public keys: $KEYS"
for KEY in $KEYS
do
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com $KEY &&\
echo "Public key $KEY has been added."
done
fi
else
KEYS=`echo $@ | tr '\ ' '\n' | grep '\([[:alnum:]_]\|[a-fA-F]\)\{8,\}' | uniq | tr '\n' '\ '`
echo "Public keys to add: $KEYS"
for KEY in $KEYS
do
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com $KEY > /dev/null &&\
echo "Public key $KEY has been added."
done
fi
Вот ещё один скрипт,знал бы о ваших вариантах может и не слабал бы его на коленке.
#!/usr/bin/env python
# -*- coding: utf8 -*-
#Скрипт для добавления ключей репозиториям,добавленным вами вручную.Опупликовано по лицензии GPL V2 или выше.(с) 2009 GnuReality
#e-mail:[email protected]
import os.path,sys,string,commands
print "Пожалуйста запаситесь терпением,мы получаем недостающие ключи...\nЭто довольно долгий процесс,особенно на слабых интернет каналах.\n"
outp = commands.getoutput("sudo apt-get update ")
spos = string.find(outp, 'NO_PUBKEY ')
if spos < 0:
print "Поздравляем!У вас все репозитории имеют ключ верификации.\n"
quit()
outp = outp.split("\n")
for line in outp:
spos = string.find(line, 'NO_PUBKEY ')
if spos > 0:
spos += 10
line = line[spos:]
print "Ключ " + line + " успешно добавлен."
commandOutput = commands.getoutput("sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com " + line + " ")
Переделал немного.Для использования наберите в терминале python путь_к_скрипту/его_имя.py и все добавленые вами репозитории получат свои ключи.За код сильно не пинать - третий день всего учу питон:)
#!/usr/bin/env python
# -*- coding: utf8 -*-
#Скрипт для добавления ключей репозиториям,добавленным вами вручную.Опупликовано по лицензии GPL V2 или выше.(с) 2009 GnuReality
#e-mail:[email protected]
import os.path,sys,string,commands,re
print "Пожалуйста запаситесь терпением,мы получаем недостающие ключи...\nЭто довольно долгий процесс,особенно на слабых интернет каналах.\n"
outp = commands.getoutput("sudo apt-get update ")
if re.search( ur"NO_PUBKEY", outp ):
outp = outp.split("\n")
for line in outp:
match = re.search( ur"[/nA-Z0-9]{16}", line )
if match > 0:
key = match.group()
print "Ключ " + key + " успешно добавлен."
commandOutput = commands.getoutput("sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com " + key + " ")
else:
print "Поздравляем!У вас все репозитории имеют ключ верификации.\n"
quit()
у меня не хочет ключ получать, пишет:
помогите пожалуйста, инет в порядке
Сервер не отвечает, попробуй ещё раз!
да я уже полдня пробовал....
За инструкцию +100 иначе башку бы поломал...
Был глюк
Release: Следующие подписи не могут быть проверены, так как недоступен общий ключ: NO_PUBKEY 451
W: Не удалось загрузить http://gq.net.ru/ubuntu/dists/hardy/Release
Вылечил удалением из репозитория и повторного включения в него и получения ключа ;-)
Спасибо!!!! Очень помогло!!!!
Статья не совсемполная. У меня, например, сейчас вот такой вывод:
Какие еще бывают keyservers, и как узнать какой именно требуется указать для конкретного репозитория?
а у вас такое бывает при запросе ключей для репозиториев:
gpg: запрашиваю ключ ******** с hkp сервера keyserver.ubuntu.com
gpg: превышено время ожидания сервера ключей
gpg: сбой при получении с сервера ключей: ошибка сервера ключей
в последнее время очень затягивается этот процесс
У меня такое было, но только из-за проблем с интернетом (модем 3G), скорость низкая, частые сбои.
или вот такое:
gpgkeys: HTTP fetch error 56: Failure when receiving data from the peer
gpg: не найдено данных формата OpenPGP.
gpg: Всего обработано: 0
у меня такого точно не было... :)
добавлял ключи безз проблем! :D
Если нужно добавить несколько ключей можно использовать такой способ, добавит все нужные ключи... =)
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com `sudo aptitude update 2>&1 | grep -o '[0-9A-Z]\{16\}$' | xargs`
Я сделал следующее:
gpg --keyserver keyserver.ubuntu.com --recv A6B8F63998A719B4
После чего терминал мне выдал:
gpg: запрашиваю ключ 98A719B4 с hkp сервера keyserver.ubuntu.com
gpg: не могу открыть `/home/ivan/.gnupg/pubring.gpg'
gpg: keydb_get_keyblock failed: eof
gpg: нет доступной для записи таблицы ключей: eof
gpg: ошибка чтения `[stream]': глобальная ошибка
gpg: Всего обработано: 0
Подскажите как можно исправить ситуацию?
launchpad-getkeys
извините, это нужно ввести в терминал? я ввел: command not found
Аха, сначала нужно установить. Точно есть в ppa на ланчпаде.
Спасибо авторам скриптов! помогла вторая редакция скрипта от urusha, питоновский не пробовал, но маст хэв!) Спасибо ребят, облегчили жизнь :)
Отправить комментарий