TOP

コンテナ化

このエントリーをはてなブックマークに追加

ホーム > 個人開発したことまとめ > https化

https化

https化してみたかった。


作ったもの(実際に稼働したときのツイート)

内容は対応前後で変化なし。



どんな仕組み?

以下のサイトの手順に従えばある程度できたが、それぞれの手順が何をしているのかよくわかっていない部分があるので明日以降整理したい
さくらVPSにSSL証明書を導入しHTTPS通信の構築



ぶつかった壁とか学んだこととか

httpd 起動時にエラー

12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp httpd[19419]: [Mon Dec 27 09:13:07.298143 2021] [so:warn] [pid 19419] AH01574: module ssl_module is already loaded, skipping
12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp httpd[19419]: AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf.d/vhost.conf:4
12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp httpd[19419]: AH00526: Syntax error on line 9 of /etc/httpd/conf.d/vhost.conf:
12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp httpd[19419]: Invalid command 'SSLMutex', perhaps misspelled or defined by a module not included in the server configuration
12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp kill[19421]: kill: cannot find process ""
12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: control process exited, code=exited status=1
12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Failed to start The Apache HTTP Server.
12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Unit httpd.service entered failed state.
12月 27 09:13:07 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service failed.

Apache2.4.x SSLMutexが廃止されたらしい。「/etc/httpd/conf.d/vhost.conf」の「SSLMutex default」をコメントアウトして「Mutex default ssl-cache」に修正。

12月 27 09:40:50 ik1-344-32350.vs.sakura.ne.jp httpd[19643]: AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf.d/vhost.conf:4
12月 27 09:40:51 ik1-344-32350.vs.sakura.ne.jp httpd[19643]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:443
12月 27 09:40:51 ik1-344-32350.vs.sakura.ne.jp httpd[19643]: no listening sockets available, shutting down
12月 27 09:40:51 ik1-344-32350.vs.sakura.ne.jp httpd[19643]: AH00015: Unable to open logs
12月 27 09:40:51 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
12月 27 09:40:51 ik1-344-32350.vs.sakura.ne.jp kill[19645]: kill: cannot find process ""
12月 27 09:40:51 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: control process exited, code=exited status=1
12月 27 09:40:51 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Failed to start The Apache HTTP Server.
12月 27 09:40:51 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Unit httpd.service entered failed state.
12月 27 09:40:51 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service failed.

修正前がわからん 「/etc/httpd/conf.d/vhost.conf」のCustomLogとErrorLogを修正を修正。「CustomLog /etc/httpd/logs/ssl_request_log」、「ErrorLog /etc/httpd/logs/ssl_error_log」
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp httpd[19750]: [Mon Dec 27 09:54:23.644037 2021] [so:warn] [pid 19750] AH01574: module ssl_module is already loaded, skipping
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp httpd[19750]: AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf.d/vhost.conf:4
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp httpd[19750]: AH00526: Syntax error on line 24 of /etc/httpd/conf.d/vhost.conf:
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp httpd[19750]: CustomLog takes two or three arguments, a file name, a custom log format string or format name, and an optional "env=" or "expr=" clause (see docs)
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp kill[19751]: kill: cannot find process ""
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: control process exited, code=exited status=1
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Failed to start The Apache HTTP Server.
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Unit httpd.service entered failed state.
12月 27 09:54:23 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service failed.

「/etc/httpd/conf.d/vhost.conf」のCustomLogとErrorLogを修正を修正。「CustomLog /var/log/httpd/ssl_access_log "%h %l %u %t \"%r\" %>s %b"」、「ErrorLog /var/log/httpd/ssl_error_log」

参考

12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp httpd[20113]: AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf.d/vhost.conf:4
12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp httpd[20113]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:443
12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp httpd[20113]: no listening sockets available, shutting down
12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp httpd[20113]: AH00015: Unable to open logs
12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp kill[20115]: kill: cannot find process ""
12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: control process exited, code=exited status=1
12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Failed to start The Apache HTTP Server.
12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Unit httpd.service entered failed state.
12月 27 10:48:39 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service failed.

エラーの内容は変わったけど相変わらずログが読めないと言っている。
エラーは二つ。
・AH00072: make_sock: could not bind to address 0.0.0.0:443
・AH00015: Unable to open logs
一旦ログは置いておいて1つ目の方の対処
443 portを複数プロセスがlistenしていると起きるみたい。
/etc/httpd/conf.d/ssl.confに「Listen 443 https」とあるのでssl.confをどかしてみた。
・・・が、うまく動かず、最終的には、ssl.confの「Listen 443 https」を復活させ、「vhost.conf」を消した。

ApacheのVirtualHost

1台のサーバーで複数のドメインを管理する技術(参考
 ⇒そんなことがしたいわけではないので vhost.conf を消したのは正解。

httpd.conf (apache が読み込む設定ファイル)に「IncludeOptional conf.d/*.conf」を(たぶん自分で昔)追記している。conf.d 配下には複数ファイルがおいてあり、その中に ssl.conf と vhost.conf の両方が置いてあったため、apache起動時は両方の設定が読み込まれる。
両方のファイルでListen 443としていたので、「(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:443」というエラーが吐かれていて、vhost.confを消したことで解消された。
vhost.conf はこの記事を見て作成したものだったが理解しないまま作ったので混乱していた。

crt, key, cer?

ssl.confに以下を記載したけどなんだっけ?
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.cer
ServerName sagamax.cyou:443
ServerName???
 ⇒サーバ名とポート番号(ServerName, Listen)

server.key

まず server.key ですが、これは 以下のコマンドで生成した秘密鍵です。
openssl genrsa -des3 -out server.key 2048
この秘密鍵からCSRというものを生成し、CSRを認証局(CA)に提示することでSSLサーバ証明書を発行してもらいます。
CSRとは「Certificate Signing Request」の略で、認証局に対し、SSLサーバ証明書への署名を申請するためのものです。CSR には「公開鍵」とその所有者情報、及び申請者が対応する秘密鍵を持っていることを示すために申請者の署名が記載されています。
↑この説明はここから引用
CSR生成コマンドは以下
openssl req -new -key ssl.key/server.key -out ssl.csr/server.csr
Enter pass phrase for ssl.key/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]:Adachi-ku
Organization Name (eg, company) [Default Company Ltd]:sagamax
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:sagamax.cyou
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

リンク先でSSL証明書を申し込む。特にこだわりはないので一番安いやつにした。
暫くすると利用開始までの手順が記載されたメールが届く。

さらに暫くすると認証ファイルのアップロードのお願いメールが届く。認証ファイルは、対象のサーバーが存在するか(厳密にはドメインが存在するか)を認証局が確認するためのものです。
認証ファイルのアップロードの手順:ファイル認証の手続きをしたい
管理画面から認証ファイル( xxx.txt )をダウンロードして、自分のサーバの所定のフォルダに認証ファイルを配置します。
/var/www/html/.well-known/pki-validation/xxx.txt
「/var/www/html/」は DocumentRoot で、apacheのデフォルトはここです。httpd.conf に記載されています。
http://example.com/.well-known/pki-validation/xxx.txt にアクセスして認証ファイルが見れることを確認したら暫く待ちます。
無事認証されたら「SSLサーバ証明書発行のお知らせ」というメールが届き、サーバ証明書(server.srt)がダウンロードできるようになります(サーバが存在するかを確認するため数分時間がかかる私の場合は30分ぐらいでした)。



サーバにサーバー証明書(server.crt)と中間証明書(internal.cer)を配置します。
中間証明書は、SSLサーバ証明書を発行する認証局が自身の正当性を証明するためのものです。
/etc/httpd/conf/ssl.crt/internal.cer
/etc/httpd/conf/ssl.crt/server.crt

中間証明
CSR

/etc/httpd/conf.d/ssl.confにもSSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile と ServerName を設定。
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.cer
ServerName sagamax.cyou:443
ServerName???ドメイン認証型???
 ⇒ここがわかりやすい
 ⇒ここもまあ


ブラウザの鍵マークからキーチェーンを確認できる。



httpd再起動
service httpd restart





図はネスペの剣から作成
「共通鍵の元になるデータの送信」は、共通鍵を生成するためのもの。共通鍵そのものを送るのではなく、共通鍵を生成するための元ネタを送ることで鍵漏洩のリスクを軽減するためのもので、 DH(Diffie-Hellman)法というやり方で共通鍵を生成する。DH法のアルゴリズム自体はややこしいので省略するが、ざっくり言うと、クライアントとサーバがそれぞれ生成した別々の乱数をお互いに送り、それをもとに共通の値を生成してそれを共通鍵暗号方式の鍵として使用する方式のこと。
デジタル署名の技術を使って公開鍵を共有する。
クライアント認証はオプションです。/etc/httpd/conf.d/ssl.conf は以下の通りデフォルトはコメントアウトされているので、自分で設定を変えない限りクライアント認証は実施されません。
# Client Authentication (Type):
# Client certificate verification type and depth. Types are
# none, optional, require and optional_no_ca. Depth is a
# number which specifies how deeply to verify the certificate
# issuer chain before deciding the certificate is not valid.
#SSLVerifyClient require
#SSLVerifyDepth 10


認証局のデジタル署名付きの公開鍵を公開鍵証明書といい、「証明書」という単語が出てきたら大抵がこの公開鍵証明書を指します。
ここから引用


認証局が発行する「ルート証明書」は、パソコンやスマートフォンなどの端末内に保存されており、サーバーから送られてくる証明書(サーバー証明書と中間CA証明書)が、ルート証明書に関連付けられた証明書(認証局が発行した証明書)であるかを検証します。
ここから引用
参考
デジタル署名
DH法
クライアント認証
デジタル署名
SSL通信のシーケンス

参考
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp httpd[20545]: In order to read them you have to provide the pass phrases.
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp httpd[20545]: Server sagamax.cyou:443 (RSA)
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp httpd[20545]: Enter pass phrase:Apache:mod_ssl:Error: Private key not found.
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp httpd[20545]: **Stopped
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp kill[20547]: kill: cannot find process ""
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service: control process exited, code=exited status=1
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Failed to start The Apache HTTP Server.
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp systemd[1]: Unit httpd.service entered failed state.
12月 27 11:14:38 ik1-344-32350.vs.sakura.ne.jp systemd[1]: httpd.service failed.
パスワードを対話入力することすらなくエラー。
SSLCertificateKeyFile, SSLCertificateFileのパスはあってる。
server_****.keyのパスフレーズ解除してみる(参考)。
「openssl rsa -in /etc/httpd/conf/ssl.key/server.key -out /etc/httpd/conf/ssl.key/server.key」
正常にhttpdが立ち上がるようになった。


url打ってアクセスしようとしたが、タイムアウトでエラーになる。。。

以下の画面が出てきてアクセスできない


firewallの設定
firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http ssh
ports: 8009/tcp 8009/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
services に https がない

firewall-cmd --zone=public --add-service=https --permanent
※permanentオプションはCentOSを再起動しても設定を残すためのオプション

firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http ssh
ports: 8009/tcp 8009/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

まだ追加されていない。firewall 再起動
firewall-cmd --reload
firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports: 8009/tcp 8009/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
https が追加されたので再度画面表示したら動いた。


参考