LoginSignup
0
2

More than 5 years have passed since last update.

OSX Yosemite に openssl-1.0.2f をインストールしてPythonの_ssl.soも更新する

Last updated at Posted at 2016-01-29

OSX Yosemite の OpenSSL は 0.9.8系なのだが、2015年12月31日でサポートが終了している。Appleがどのような修正を出してくれるのかわからないが、openssl-1.0.2f をインストールしてみたのでその記録。

openssl-1.0.2f のビルド

32bit 版と 64bit 版を二度に分けてビルドし lipo で Univesal Binary にする。
コンパイルオプションで -arch x86_64 -xarch i386 で multilib にできるかと思ったら、コンパイルでラーがでるためこのような方法をとっている。

$ ./Configure shared darwin64-x86_64-cc
$ make

テスト

$ make test

エラーがでていなければOK

インストール
デフォルトの /usr/local/ssl にインストールされる。

$ sudo make install
$ cd /usr/local/ssl
$ sudo mkdir bin64
$ sudo sh -c 'cd bin && find . -print | cpio -pdmu ../bin64'
$ sudo mkdir lib64
$ sudo sh -c 'cd lib && find . -print | cpio -pdmu ../lib64'

ソースツリーに戻って 32bit 版をビルド

$ make clean
$ ./Configure shared darwin-i386-cc
$ make

インストール
ドキュメントは不要なので make install_sw を実行する。

$ sudo make install_sw
$ cd /usr/local/ssl
$ sudo mkdir bin32
$ sudo sh -c 'cd bin && find . -print | cpio -pdmu ../bin32'
$ sudo mkdir lib32
$ sudo sh -c 'cd lib && find . -print | cpio -pdmu ../lib32'

lipo で Univesal Binary を作成する。

$ cd /usr/local/ssl
$ sudo lipo -create bin{32,64}/openssl -output bin/openssl
$ sudo lipo -create lib{32,64}/libcrypto.a -output lib/libcrypto.a
$ sudo lipo -create lib{32,64}/libssl.a -output lib/libssl.a
$ find lib64 -type f -name '*.dylib' | while read file ; do echo lipo -create $(echo "$file" | sed 's/64/{32,64}/') -output $(echo "$file" | sed 's/64//'); done | sudo sh
$ sudo rm -r bin{32,64} lib{32,64}

今後プログラムをビルドするときに/usr/local/ssl にある openssl を使うようにすれば、1.0.2 系の openssl がリンクされる。

python の SSL ライブラリを更新しておく。

https://www.python.org/downloads/release/python-2710/ からソースファイルを取得する。

tar xfz Python-2.7.10.tgz
cd Python-2.7.10
CC=cc \
CPPFLAGS=-I/usr/local/ssl/include \
LDFLAGS='-L/usr/local/ssl/lib -Wl,-rpath,/usr/local/ssl/lib' \
./configure --enable-framework --enable-universalsdk --with-universal-archs=intel

エラーが出た。

Fatal: You must get working getaddrinfo() function.
       or you can specify "--disable-ipv6".

getaddrinfo() がないだと?
config.log を見て確認する。

configure:11464: checking for getaddrinfo
configure:11482: cc -o conftest -arch i386 -arch x86_64 -g -O2  -arch i386 -arch x86_64 -isysroot /  conftest.c  >&5
conftest.c:110:10: fatal error: 'sys/types.h' file not found
#include <sys/types.h>
         ^
1 error generated.

<sys/types.h> がない!

Fatal: You must get working getaddrinfo() function. で検索すると、ビルド環境の問題だから xcode-select --install せよ、というのが見つかった。

$ sudo xcode-select --install
Password:
xcode-select: note: install requested for command line developer tools

再度 configure を実行する。今度は問題なし。

$ make

じつは、欲しいのは _ssl.so だけ。

$ find . -name _ssl.so
./build/lib.macosx-10.5-intel-2.7/_ssl.so

python で import ssl したときに、この _ssl.so がロードされるようすればよい。

$ sudo mkdir /Library/Python/2.7/lib-dynload
$ sudo cp build/lib.macosx-10.5-intel-2.7/_ssl.so /Library/Python/2.7/lib-dynload

このような sitecustomize.py を作成して、/Library/Python/2.7/lib-dynload を検索パスに追加する。

/Library/Python/2.7/site-packages/sitecustomize.py
import sys
sys.path.insert(0, '/Library/Python/2.7/lib-dynload')

動作確認。

$ python
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.2f  28 Jan 2016'
0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2