apacheでhttpsを使う

httpsを使いたい。

別にセキュアにしたいわけではなく、httpsでのアクセスを確認したいだけ。

macでやってみて証明書も自分で発行できて簡単でopensslとかならcentosも同じだろうと、やってみた。

ちょっとゴタゴタしたので、メモしておく。

# which openssl
/usr/bin/openssl

opensslは入っている。


# which mod_ssl
/usr/bin/which: no mod_ssl in (/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

mod_sslは入ってない。

じゃあ、入れよう。

# yum install mod_ssl
読み込んだプラグイン:fastestmirror, refresh-packagekit, security
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * remi-safe: mirrors.tuna.tsinghua.edu.cn
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package mod_ssl.x86_64 1:2.2.15-54.el6.centos will be インストール
--> 依存性の処理をしています: httpd = 2.2.15-54.el6.centos のパッケージ: 1:mod_ssl-2.2.15-54.el6.centos.x86_64
--> 依存性解決を終了しました。
エラー: パッケージ: 1:mod_ssl-2.2.15-54.el6.centos.x86_64 (updates)
             要求: httpd = 2.2.15-54.el6.centos
            インストール: httpd-2.2.27-1.el6.x86_64 (@CentALT)
                httpd = 2.2.27-1.el6
            利用可能: httpd-2.2.15-53.el6.centos.x86_64 (base)
                httpd = 2.2.15-53.el6.centos
            利用可能: httpd-2.2.15-54.el6.centos.x86_64 (updates)
                httpd = 2.2.15-54.el6.centos
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest


入らない。

apacheのバージョンが新しすぎるようだ。

別にバージョンなんかなんでもいいので、ダウングレードしよう。


yum downgradeをやってみたができないので、消して入れなおす。

# yum remove httpd

消えた。

インストール

# yum install httpd
読み込んだプラグイン:fastestmirror, refresh-packagekit, security
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * ius: hkg.mirror.rackspace.com
 * remi-safe: mirrors.tuna.tsinghua.edu.cn
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package httpd.x86_64 0:2.2.15-54.el6.centos will be インストール
--> 依存性の処理をしています: httpd-tools = 2.2.15-54.el6.centos のパッケージ: httpd-2.2.15-54.el6.centos.x86_64
--> 依存性解決を終了しました。
エラー: パッケージ: httpd-2.2.15-54.el6.centos.x86_64 (updates)
             要求: httpd-tools = 2.2.15-54.el6.centos
            インストール: httpd-tools-2.2.27-1.el6.x86_64 (@CentALT)
                httpd-tools = 2.2.27-1.el6
            利用可能: httpd-tools-2.2.15-53.el6.centos.x86_64 (base)
                httpd-tools = 2.2.15-53.el6.centos
            利用可能: httpd-tools-2.2.15-54.el6.centos.x86_64 (updates)
                httpd-tools = 2.2.15-54.el6.centos
            利用可能: httpd24u-tools-2.4.23-2.ius.centos6.x86_64 (ius)
                httpd-tools = 2.4.23-2.ius.centos6
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest


できない。

httpd-toolsとやらがひっかかってる。

こいつも消す。



# yum remove httpd-tools
読み込んだプラグイン:fastestmirror, refresh-packagekit, security
削除処理の設定をしています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package httpd-tools.x86_64 0:2.2.27-1.el6 will be 削除
--> 依存性解決を終了しました。

依存性を解決しました

========================================================================================================================
 パッケージ                    アーキテクチャ           バージョン                     リポジトリー                容量
========================================================================================================================
削除:
 httpd-tools                   x86_64                   2.2.27-1.el6                   @CentALT                   137 k

トランザクションの要約
========================================================================================================================
削除                 1 パッケージ

インストール済み容量: 137 k
これでいいですか? [y/N]y
パッケージをダウンロードしています:
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
  削除中                  : httpd-tools-2.2.27-1.el6.x86_64                                                         1/1
  Verifying               : httpd-tools-2.2.27-1.el6.x86_64                                                         1/1

削除しました:
  httpd-tools.x86_64 0:2.2.27-1.el6

完了しました!


「will be 削除」(笑い)


インストール

#yum install httpd

はいった。



# httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Jul 18 2016 15:24:00


mod_sslをインストール

# yum install mod_ssl

はいった。


「will be インストール」(笑い)



これで必要なものはそろったので設定をしていく。


httpsサーバを動かすには証明書が必要。

証明書といっても、テストでhttpsアクセスするだけならお金を払って発行してもらう必要はない。

そういう場合は自己署名証明書というものを使う。

いわゆる「オレオレ証明書」である。


(参考)
http://www.maruko2.com/mw/Apache/SSL%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8mod_ssl%E3%81%AE%E8%A8%AD%E5%AE%9A


apache + ssl 設定の方法はいろんな人が書いているが、内容は微妙に異なる。



秘密鍵を作る。

よくわからないが、これがないと証明書が作れないし、簡単に作れるので作る。

暗号の強度とかはどうでもいいがいまどき 3desとか1024は古いのでナウくする。

パスワードを要求されるので2回入力する。

# openssl genrsa -aes128 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...............................................................................................................................................................................................................................+++
..............................................................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:


CSRを作る。

CSRとは証明書を発行する元ネタのようなものだ。
国だの組織名だのいろいろ聞かれるが全部適当でよい。

challenge password、emailだのは入れなくてよい。
というか、確認してないが必須項目はCNのみじゃないだろうか。

CNとはサーバのfqdnだが、自己署名証明書なので一致してなくても関係ないと思う。

一応、本当のfqdnを登録した。

下記のkintamaはもちろんサンプルである。


# openssl req -new -key server.key -sha256 -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Tokyo
Organization Name (eg, company) [Default Company Ltd]:kintama
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:kintama.net
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


秘密鍵とCSRがそろったら、証明書を発行する。

有効期間10年。100年とか1000年とかでもできるのだろうか?確認してない。

-in に作成したcsr、 -signkey に作成した秘密鍵の名前を指定する。

-out で指定した名前で作成される。


秘密鍵を作ったときに設定したパスワードを入力する。


# openssl x509 -in server.csr -days 3650 -req -signkey server.key -sha256 -out server.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Tokyo/O=kintama/CN=kintama.net
Getting Private key
Enter pass phrase for server.key:


証明書ができたら、ssl.confを編集する。

(参考)
http://www.ryouto.jp/linux/linux_44.html


vi /etc/httpd/conf.d/ssl.conf

変更するのは以下

DocumentRoot "/var/www/html/" #コメントを外す
ServerName kintama.net:443 #サーバ名
SSLCertificateFile /home/kintama/ssl/server.crt #コメントを外して証明書の場所を指定
SSLCertificateKeyFile /home/kintama/server.key #コメントを外して秘密鍵の場所を指定



DocumentRootは任意の場所を指定できる。

つまり、httpとhttpsで違うページを表示できる。

証明書と鍵はさっき作成したものを指定する。

場所と名前はなんでもよいがもちろんそこに先ほど作った秘密鍵と証明書がないとだめだ。



httpdを再起動する。

さっき設定したパスワードを入力する。

# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中: Apache/2.2.15 mod_ssl/2.2.15 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server kintama.net:443 (RSA)
Enter pass phrase:

OK: Pass Phrase Dialog successful.
                                                           [  OK  ]

iptablesで443を開ける。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT


おわり。


おまけ

httpdを再起動するたびにパスワードを入力するのがウザい場合は、
下記で無効にできる。

# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:
writing RSA key

無効にするときにパスワードを聞かれてイラっとするが、これが最後なので我慢する。

centosは6です。

正式なバージョンは.....

# cat /etc/redhat-release
CentOS release 6.8 (Final)