Как обновить OpenSSL в OS X?

126

Сегодня в дикой природе был анонсирован уязвимый OpenSSL-эксплойт, который позволяет злоумышленнику тайно обнаруживать и похищать приватные ключи сервера (позволяя им MitM и расшифровывать зашифрованные данные и воровать пароли). Это влияет на версии OpenSSL, включая 1.0.1f, которая является версией на моем современном Mac- компьютере Mavericks (потому что я использовал порт / brew для установки другого программного обеспечения, которое обновляло мой openssl, но я этого не осознавал ):

$ openssl version
OpenSSL 1.0.1f 6 Jan 2014

Это показывает, что я не использую версию OpenSL от Mavericks:

$ which openssl
/opt/local/bin/openssl

OpenSSL выпустил исправление сегодня в 1.0.1g, и мне интересно, как я могу установить эту исправленную версию поверх моей текущей версии?

доктор джимбоб
источник
16
Вы не используете версию, поставляемую с OS X Mavericks, - это 0.9.8y, в которой нет ошибки с ошибками (она была представлена ​​в 1.0.1). Ваш лучший путь обновления будет зависеть от того, где и как вы установили более новую версию. which opensslможет быть информативным. Кроме того, основная проблема не в команде openssl, а в библиотеках openssl (которые используются другими программами) - они не совместимы с API между версиями 0.9.x и 1.0.x, поэтому вы не хотите обновлять поставляемые системой библиотеки openssl!
Гордон Дэвиссон
@GordonDavisson - Вы совершенно правы. Я ошибался. Я, очевидно, установил MacPortв какой-то момент на эту машину, которая обновила мой openssl. (Вероятно, когда я пытался заставить работать Python2.7). Вероятно, следует удалить этот вопрос, но не в случае, если другие совершат ту же ошибку, найдут полезный ответ SapphireSun).
Доктор Джимбоб
С этим уточняющим обновлением я бы оставил это. Вероятно, в той же лодке есть другие люди, и наличие этого должно дать им представление о том, что нужно сделать.
Гордон Дэвиссон
2
Если вы устанавливаете OpenSSL с brew, он не будет связывать двоичные файлы с / usr / bin. Поэтому он не будет запущен, если вы введете openssl в командной строке.
Макс Райд
@MaxRied как вы запускаете версию, установленную homebrew? Я установил новый openssl по инструкциям в принятом ответе и openssl versionвозвращает 1.0.1g, но вы говорите, что opensslкоманды не используют эту версию?
неорганик

Ответы:

147

Для чего это стоит, я просто использовал доморощенный ( http://brew.sh/ ):

brew update  
brew install openssl  
brew link --force openssl 
openssl version -a  

Если появится одна из плохих версий (1.0.1a-f), вы можете выяснить, какую версию openssl вы используете, следующим образом:

which openssl

Часто это из / usr / bin. Чтобы убедиться, что вы получили обновленную версию, поместите символическую ссылку в / usr / local / bin, чтобы указать на обновленный openssl, например так:

ln -s /usr/local/Cellar/openssl/1.0.1g/bin/openssl /usr/local/bin/openssl

В качестве альтернативы этому последнему шагу некоторые люди заменяют openssl /usr/binсимволической ссылкой на /usr/local/Cellar/openssl/1.0.1g/bin/openssl(или любой другой версией):

mv /usr/bin/openssl /usr/bin/openssl_OLD  
ln -s /usr/local/Cellar/openssl/1.0.1g/bin/openssl /usr/bin/openssl

Но это, как известно, вызывает проблемы с некоторыми более поздними версиями OSX. Лучше просто вставить новую символическую ссылку в / usr / local / bin, которая должна иметь приоритет на вашем пути над / usr / bin.

SapphireSun
источник
7
Не удаляйте оригинал - просто переименуйте его. Если вы обнаружите, что версия, созданная Homebrew, не работает для какой-то цели, нет никаких оснований ставить себе ручей без (рабочего) весла.
Терри N
1
Справедливо, но с другой стороны, я бы не назвал эту версию работающей ...
SapphireSun
1
Даже с учетом этой уязвимости, она по-прежнему полезна для вас в любой ситуации, в которой вы готовы пойти на расчетный риск, чтобы приложение X (которое зависит от него) работало кратко. Или, если вы предпочитаете ... «работать» в том смысле, что сломанная лопасть может толкнуть воду. :-p
Терри N
8
Просто примечание - после выполнения этих шагов ввод «openssl» в окне терминала завершился неудачно с ошибкой «нет такого файла или каталога», указывающей на старую копию (но она работала в новом окне терминала). Чтобы исправить окно терминала, в котором я работал, мне нужно было сделать следующее:hash -r
Майк Хедман,
6
Лучше, чем создать символическую ссылку в /usr/bin/openssl, можно создать ссылку в /usr/local/bin/openssl. Это должно предшествовать /usr/binвашей $PATH
проблеме
14

Или для тех, кто использует порты Mac и не беспокоится о сохранении версии

sudo port upgrade openssl

просто :-)

mammix2
источник
3
sudo port upgrade outdatedтоже работает.
Доктор Джимбоб
1
Забавно, но на моем компьютере были установлены оба макпорта и brew с обоими установками openssl. Бег sudo port -f uninstall openssl @<old-version>сделал
свое дело
@yair, имеющий как macports, так и homebrew, вызовет много проблем
user151019
6

Для разрешения неограниченного увеличения объема памяти запроса на расширение статуса OCSP (CVE-2016-6304) в macOS Sierra brewс включенной защитой целостности системы :

  1. Временно настройте права доступа, /usr/localчтобы brew мог обновить:

    sudo chgrp -R admin /usr/local
    sudo chmod -R g+w /usr/local
    
  2. Установите обновленную версию OpenSSL (вы, вероятно, хотите 1.0.2i):

    brew install openssl
    
  3. Вы можете / должны удалить существующую символическую ссылку на openssl из /usr/local/bin:

    rm /usr/local/bin/openssl
    
  4. Перепишите правильную версию напитка:

    sudo ln -s /usr/local/Cellar/openssl/1.0.2i/bin/openssl /usr/local/bin/openssl
    
  5. Восстановить исходные разрешения на /usr/local/bin:

    sudo chown root:wheel /usr/local
    
brandonscript
источник
В моем случае старая версия OpneSSL находится в / usr / bin. Сбой при попытке изменить разрешение бина.
Рамис
Вы используете судо?
brandonscript
Да. Я использовал sudo. Я нашел комментарий, что в последней версии OS OS X нет способа изменить разрешение этого файла. Поэтому я перестаю добиваться этого.
Рамис
Почему бы просто не изменить свою $PATHпеременную для поиска /usr/local/bin?
brandonscript
Привет всем, меня смущают все ответы, удаление символической ссылки, ссылки, ошибка с разбитым сердцем и т.д. ... Когда я бегу, $ openssl versionя получаю, OpenSSL 0.9.8zh 14 Jan 2016но когда я бегу, $ brew install opensslя получаю Warning: openssl 1.0.2l is already installed. Значит ли это, что у меня установлены две версии? Что именно мне теперь делать?
Джошуа
1

Тот, кто не хочет использовать brew или порты и просто хочет заменить установку OpenSSL 0.9.8 по умолчанию, всегда может отключить защиту целостности системы, перезагрузившись в режим восстановления (cmd + R) и выполнив команду

csrutil disable

а затем скомпилировать openssl с

./config --prefix=/usr
make install

Он успешно заменил OpenSSL в ElCapitan для меня, и я смог без проблем скомпилировать httpd 2.4 для curl и apache напрямую из источников. Причиной этого метода, который некоторые могут счесть радикальным, является то, что ElCapitan больше не поддерживается Apple, и никаких обновлений не ожидается, так что, скорее всего, он не сломается. Во-вторых, это избавляет вас от указания на папку openssl в / usr / local для каждой программы, которую вы компилируете, что делает компиляцию более надежной.

Захар Джо
источник