CentOS6.8(64bit)でOpenSSLのソースファイルからrpmを作成して失敗した話

## 概説
- ここではrpmbuildコマンドを使ってOpenSSLのrpmパッケージを作成する方法を示します。

## 環境の確認
- 64bit環境のCentOS6.8です。

```bash:
$ uname -a
Linux localhost.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release 
CentOS release 6.8 (Final)
```

## OpenSSLのソースファイルのダウンロード
- 1.0.xの最新版を利用します。

```bash:
$ wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
```

## rpmbuildコマンドでrpm作成
- オプションを「-ta（`*.rpm`、`*.src.rpm`を作成）」にするか「-tb（`*.rpm`のみ作成）」にするかといったところはお好みで。
- しかし、rpmbuildコマンドを実行すると失敗します。

```bash:
$ rpmbuild -tb openssl-1.0.2h.tar.gz 

RPM ビルドエラー:
    ファイルが見つかりません (by glob): /PATH_TO/rpmbuild/BUILDROOT/openssl-1.0.2h-1.x86_64/usr/lib/*.so*
```

## なぜ失敗したのか
- 64bit環境の場合は「〜/lib」ではなく、「〜/lib64」配下に関連するファイルが存在するからです。

- /lib配下にはファイルがない

```bash:
$ ls -l /PATH_TO/rpmbuild/BUILDROOT/openssl-1.0.2h-1.x86_64/usr/lib/*.so*
ls: cannot access /PATH_TO/rpmbuild/BUILDROOT/openssl-1.0.2h-1.x86_64/usr/lib/*.so*: そのようなファイルやディレクトリはありません
```

- /lib64配下にはファイルがある

```bash:
$ ls -l /PATH_TO/rpmbuild/BUILDROOT/openssl-1.0.2h-1.x86_64/usr/lib64/*.so*
lrwxrwxrwx. 1 vagrant vagrant      18  8月 14 04:21 2016 /PATH_TO/rpmbuild/BUILDROOT/openssl-1.0.2h-1.x86_64/usr/lib64/libcrypto.so -> libcrypto.so.1.0.0
-r-xr-xr-x. 1 vagrant vagrant 2304624  8月 14 04:21 2016 /PATH_TO/rpmbuild/BUILDROOT/openssl-1.0.2h-1.x86_64/usr/lib64/libcrypto.so.1.0.0
lrwxrwxrwx. 1 vagrant vagrant      15  8月 14 04:21 2016 /PATH_TO/rpmbuild/BUILDROOT/openssl-1.0.2h-1.x86_64/usr/lib64/libssl.so -> libssl.so.1.0.0
-r-xr-xr-x. 1 vagrant vagrant  455912  8月 14 04:21 2016 /PATH_TO/rpmbuild/BUILDROOT/openssl-1.0.2h-1.x86_64/usr/lib64/libssl.so.1.0.0
```

## specファイルを修正する

- ソースファイルを展開し、「/lib」と記述されている箇所を「/lib64」に修正します。

```bash:展開
$ tar zxvf openssl-1.0.2h.tar.gz
```

```bash:spec書き換え
$ vi openssl-1.0.2h/openssl.spec 
:%s/\/lib\//\/lib64\//g

以下の3箇所が書き換わっていればOKです。
%attr(0755,root,root) /usr/lib64/*.so*
%attr(0644,root,root) /usr/lib64/*.a
%attr(0644,root,root) /usr/lib64/pkgconfig/openssl.pc

:wq
```

```bash:圧縮
$ tar zcvf openssl-1.0.2h_spec_edited.tar.gz openssl-1.0.2h
```

## rpmbuildコマンドでrpm作成（再チャレンジ）
- specファイルを修正して作りなおしたソースファイルを元にrpmbuildコマンドを実行します。

```bash:
$ rpmbuild -tb openssl-1.0.2h_spec_edited.tar.gz 
```

- 無事に作成されました。

```bash:
$ ls -l /PATH_TO/rpmbuild/RPMS/x86_64/openssl-*
-rw-rw-r--. 1 vagrant vagrant 1667540  8月 14 04:50 2016 /PATH_TO/rpmbuild/RPMS/x86_64/openssl-1.0.2h-1.x86_64.rpm
-rw-rw-r--. 1 vagrant vagrant  122516  8月 14 04:50 2016 /PATH_TO/rpmbuild/RPMS/x86_64/openssl-debuginfo-1.0.2h-1.x86_64.rpm
-rw-rw-r--. 1 vagrant vagrant 2716460  8月 14 04:50 2016 /PATH_TO/rpmbuild/RPMS/x86_64/openssl-devel-1.0.2h-1.x86_64.rpm
-rw-rw-r--. 1 vagrant vagrant  678352  8月 14 04:50 2016 /PATH_TO/rpmbuild/RPMS/x86_64/openssl-doc-1.0.2h-1.x86_64.rpm
```


## インストール
- インストールしようとすると、大量の「依存性の欠如」でインストールに失敗します。

```bash:
$ sudo rpm -Uvh /PATH_TO/rpmbuild/RPMS/x86_64/openssl-*
エラー: 依存性の欠如:
   ・
   ・
   ・
   ・
```

- なので強制的にインストールします。

```bash:
$ sudo rpm -Uvh --force --nodeps /PATH_TO/rpmbuild/RPMS/x86_64/openssl-*
準備中...                ########################################### [100%]
   1:openssl                ########################################### [ 25%]
   2:openssl-devel          ########################################### [ 50%]
   3:openssl-doc            ########################################### [ 75%]
   4:openssl-debuginfo      ########################################### [100%]
```

## ssh接続しようとすると。。。
- 強制的にOpenSSLを上書きインストールしたサーバーにssh接続を試みると、以下のエラーが発生しログインできなくなってしまいました。

```bash:
ssh_exchange_identification: read: Connection reset by peer
```

- `ssh_exchange_identification`については設定変更などでログインできるようになるようですが、大量の依存性欠如を無視するのは正直こわいです。なので、手動でビルドして普通通りにインストールした方が無難っぽいです。