とうとう、自分でサーバーを構築してSSL(暗号化)化させることになってしまいました。
実際は、SSL化できないWEBサーバーの接続に信頼性を持たせるために、ドメイン(URLの住所のようなもの)をhttpsにて接続させるために已む無くProxyServer(代理サーバー)を構築することにしたのです。
そのWEBサーバー自体をSSL化させればいい事じゃない!?
その通りなのですが、そのWEBサーバーに手を入れられないのです。ならばってことで、ProxyServer構築を考えて、ユーザーとの間に入ってもらってSSL化させたのです。
CentOS7はLinuxなので、Windowsとはちょっと扱いが違います。その辺の説明は今回はしません。
つまり、その辺も分かっている人でないと、まったく???のブログ内容だと思います。
というか、このブログサイトを検索する人は、私のようなやらなければならない人が必死で検索して見つけたって感じかと思います。それは良いとして、さっそく説明に進みます。
SSL証明書の申請
SSL証明書の申請
SSLがCentOS7にインストールされているのか確認
ターミナルモードから下記のコマンドを打ち込んで確認します。
openssl version
私の環境では、「OpenSSL 1.0.2k-fips 26 Jan 2017」と帰ってきました。
nginx(WEBサーバー)をインストールしたせいか、最初から入っていました。
秘密鍵ファイルを作成
ここでそのファイルを作成する場所を決めておかないとルートにファイルを作成されます。
私は、/etc/nginx/conf/sslまで、GNOMEのGUIからフォルダを手動で作成しました。
そのフォルダーまで移動してから下記のコマンドを入れて秘密鍵ファイルを作成しました。
openssl genrsa -des3 -out server.key 2048
上記は、パスフレーズ込みの秘密ファイルの作成方法です。
CSR(署名要求)の作成
openssl req -new -key server.key –out server.csr
署名情報を聞かれるので入力してきます。
State or Province Name (full name) []:Tokyo #都道府県を入力(ローマ字で)
Locality Name (eg, city) [Default City]:Minato-ku #市区町村名
Organization Name (eg, company) [Default Company Ltd]:ma2n2n co,.ltd. #組織名・会社名
Organizational Unit Name (eg, section) []:Technical Division #(部門名 空欄でもOK)
Common Name (eg, your name or your server's hostname) []:hogehoge.jp #サイトのドメイン名 最重要
Email Address []: #何も打ち込まずにEnter
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #何も打ち込まずにEnter
An optional company name
同じフォルダの中にserver.csrというファイルが作成されるのでテキストファイルで開けると、
-----BEGIN CERTIFICATE REQUEST-----
MIICwDCCAagCAQAwezELMAkGA1UEBhMCSlAxEDAOBgNVBAgMB1RvY2hpZ2kxETAP
(略)
YMnMHN7JoeQl0INezYxEBFPPhYWI8AM+QRDBJH+cU7EiEuW0
-----END CERTIFICATE REQUEST-----
というファイルが出来上がっているのでコピーして、SSL認証取扱業者に申請します。
今回は、1年間で1000円程度の利用料のNetowlを使っています。
業者認証申請
次の画面で恐れていたことが・・・受信メールアドレスが申請するドメインで決められた数個のアカウントに限定されている。CentOS7のまっさらな状態なので、メールサーバーの設定もしていない。結局しなければならないのだなーーーー。
admin@hogehoge.jp を作成するまでのサーバー設定部分の説明も加えます。
メールサーバー設定(postfix)
色んなサイトにメールサーバーの構築例がでていましたが、案外大変でした。
まず、postfixっていうのを使ってメールサーバーを立てるのですが、メールサーバーの意味を理解していなくて、メールクライアントに設定しても受信ができないのです。正確には接続さえもできてない状態でした。
数時間悩んで、結局はクライアントに接続する場合は、Dovecotっていうのをインストールしないとできない事がわかりました。
実際インストールしてやってみたら接続はできるようになりましたが、メールを受信できないのです。
今回の目的はSSL化なので、admin@hogehoge.jpで受信さえできればいいのです。
ということで、postfixとDovecotをアンインストールして最初からやる事にしました。
設定したのは、
●/etc/postfix/main.cf ※細かい変更箇所は検索すれば大量にでる。
●アカウントの追加
●メールボックスのフォルダの作成とパーミッション
ハマったのは、メールボックスのフォルダの作成とパーミッションでした。
HOME/ユーザー名/Maildir までは作られたが、その中のnew,curは手動で作成(tmpは自動で作成された。)し、手動でパーミッションを変更(実際はユーザーもrootから変更した。)
※自動で作成する設定コマンドがあるようです。
今回は、adminというアカウントなので、とりあえず、etc/aliasestというファイルにも目を通し、admin,administratorとうをコメントアウトしておいた。
ファイヤーウォールの設定をしないとメールの受信さえもできなかったので、ポート110だけを解放してみたがうまく行かなかったので、ファイヤーウォールOFFでメールを受けた。
#####Postfixの内容は以上にしておきます#####
SSL証明書の取得
情報を入力して申請
メール内容を確認
メールをadmin@ドメイン名にてサーバー内でpostfix内のメール内容を確認
「取得申請を完了しました。
承認メールアドレス「admin@hogehoge.jp」にメールが届きますので承認作業をお願いします。」
上記のような表示がSSL業者サイトに表示されます。
承認作業
サーバーに届いたメールを確認すると、ちゃんと内容を確認できるのですが、コピペすると文字化けして承認手続きができません。
仕方なく手打ちで承認サイトにアクセスして、validation code を手入力でいれました。
完了メール到着
前回のコンパネがあるサーバーSSL設定の場合は、admin@ドメイン名だったのですが、今回は、そのメールアドレスじゃなく、SSL業者の登録時に入力した連絡用メールアドレスにきました。
セキュアコアのSSL証明書をお申し込みいただき、ありがとうございます。
以下のコモンネームのSSL証明書が発行されましたのでお知らせいたします。
■コモンネーム
ドメイン.jp
www.ドメイン.jp
■SSL証明書
-----BEGIN CERTIFICATE-----
MIIGdTCCBV2gAwIBAgIQWGhQR9tnd+/PcWcCMGfA/jANBgkqhkiG9w0BAQsFADBh
(省略)
qSQuY1FWz3YJaXYai7FGRsv+bbsZ49gTnA==
-----END CERTIFICATE-----
SSL証明書のインストール手順やその他ご不明な点は、
下記販売代理店が公開している情報をご参照ください。
販売代理店 :SSLボックス(ネットオウル株式会社)
サポートマニュアル:https://www.sslbox.jp/support/
よくある質問 :https://www.sslbox.jp/support/faq.php
----------------------------------------------------
セキュアコア株式会社
https://www.securecore.co.jp
SSL証明書のサーバー設定
CERT(SSL証明書)と中間証明書をサーバーに転送
私の場合は、VNCserverでGUI接続していますので、ファイルを作成してコピペして2つのファイルを作成しました。
どうも、この2つのファイルを結合させるらしいですが、普通に結合させればいいのか!?
サーバーの方で、
#cat SSLサーバ証明書ファイル 中間証明書ファイル > 新しい結合ファイル
とやって結合させるようですがやってみたら、ただ単に結合させただけだったので手動で結合させても同じだと思います。
nginxの設定ファイルの変更(/etc/nginx/nginx.conf)
この他に、(/etc/nginx/conf.d/defoult.conf)がnginx.conf内でインクルードされているので、conf.d内のconfファイルはnginx.confファイルに含まれるようです。
とりあえず、私は、nginx.confの方だけをいじってみました。
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
#server {
#listen 80;
#server_name hogehoge.jp;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Host $http_host;
#proxy_redirect off;
#proxy_max_temp_file_size 0;
#location / {
#proxy_pass http://hoge.com:80;
#}
#}
server {
listen 443 ssl;
#ssl on;
server_name hogehoge.jp;
ssl_certificate /etc/nginx/conf/server.crt;
ssl_certificate_key /etc/nginx/conf/server.key;
root /usr/share/nginx/html;
access_log /var/log/nginx/ssl-access.log main;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
この内容で良いのですが、SSLの部分を追加すると再起動をするとエラーがでました。
そこからハマりました。
原因ははっきりしませんが、パスフレーズが問題だった!?かな?って感じです。
$ openssl rsa -in ssl.key -out ssl.key
$ systemctl restart nginx
この上の作業をするとパスフレーズを外すようです。なんだか、最初からパスフレーズを入れない方法があるようですが、ここまでくると戻れませんでした。
systemctl status nginx.service
上記のコマンドで調べると、相変わらずエラーがでますが、https://ドメインで見てみるとちゃんと接続することができました。
firewallの設定
サーバ認証を取るのにadmin@ドメインでメールを受けなければならなかったのでfirewallを切っていました。GNOMEの遠隔で接続していましたのでGUIでポートを433を解放したらhttpsでも問題なく接続することができました。
もし、コマンドでやるなら下記でできます。
# firewall-cmd --add-port=443/tcp
success
# firewall-cmd --add-port=443/tcp --permanent
success
# firewall-cmd --list-ports
110/tcp 465/tcp 4000-4005/tcp 443/tcp 873/tcp
さて、本当の本題に突入します。
SSL化で接続させる
【SSL化してないWEBサーバーをProxyServer経由でSSL化で接続させる】
SSL化してない前の普通のProxyServer接続は簡単に終わっていました。
/etc/nginx/nginx.confの内容で、コメントアウトしていた部分になります。
そのコメントアウトを解除すると、hoge.comに自動転送になるわけです。
ではSSL化したProxyServerに接続した時に、SSL化してない転送先にするのは簡単でした。
server {
listen 443 ssl;
#ssl on;
server_name hogehoge.jp;
ssl_certificate /etc/nginx/conf/server.crt;
ssl_certificate_key /etc/nginx/conf/server.key;
root /usr/share/nginx/html;
access_log /var/log/nginx/ssl-access.log main;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://hoge.com:80;
}
}
つまり、locationの部分だけを転送先に変更すればいいという事です。
これで、目的のProxyServerが出来上がりました。
リダイレクトさせてhttpをhttpsで接続設定
でも、せっかくなのでhttpでアクセスしてきた時に、httpsに変えるリダイレクトという設定に変更しました。
server {
listen 80;
server_name yoyacle.jp;
return 301 https://$host$request_uri;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Host $http_host;
#proxy_redirect off;
#proxy_max_temp_file_size 0;
#location / {
#proxy_pass http://160.16.231.215:80;
#}
}
return 301 https://$host$request_uri;を追加して、他はコメントアウトして使わないようにすればOKです。削除しちゃってもいいのですが、いちおう残しておきました。
nginxの自動起動
再起動したら接続できなくなりました。
どうも、nginxが起動してないようです。
常時起動させます。
systemctl enable nginx.service
firewallもGUIからやりましたが再起動すると外れたのでコマンドで設定しました。
再起動しても大丈夫になりました。
これで目的のサーバー構築ができたので終了になります。
ふー長かった!!
でも達成感ありますねーーー(笑)
サーバー証明書更新のご案内(85日前) が来た!
SSL認証の更新日が近づいてきたようです。
お知らせメールに記載してあった作業内容をみると、
1) SSLボックスにログインします。
2) ログイン後、更新を行うコモンネームの【更新申込】ボタンをクリ
SSL証明書を設定されるサーバーをお選びください。
3) 更新する期間を選択し、ご利用料金のお支払いを行います。
4) 発行申請へと進み、サーバー証明書の発行手続きを行います。
発行に伴い「CSR」が必要となりますのであらかじめご用意くだ
※固定IPアドレスオプションを選択された場合は不要です。
5) 認証メールが送信されますので、認証をお願いします。
6) サーバー証明書発行後、ご登録メールアドレス宛てに証明書が送信
※SSLボックスの管理ツールからもダウンロードいただけます。
7) 更新手続きは完了です。
必要に応じてサーバー証明書をサーバーへインストールしてくださ
ログインして支払いを済ませると更新申請
サーバー内に残っていた、CSR(署名要求)をそのまま使ってみました。
次へ次へと進み申請を確定しました。
メール返信が来たので処理
指定されているURLにアクセスして、validation codeを入力しました。
なんか、ちょっとエラーっぽい内容だったので日本語に翻訳してみました。
さらに詳しく
これでいいのかな!?
でも、「必要に応じてサーバー証明書をサーバーへインストールしてくださ
手動で更新作業をしないと期限切れになる!
やっぱり、SSL業者の管理パネルだけで更新しても期限が来れば期限切れになるようです。
考えてみれば当たり前のことですね。
サーバーの方にも
ココがポイント
新しいSSL証明書の設定が必要です!
別記事にしましたので、興味のある方はどうぞ。
https://pctips.jp/security/centos7-nginx-ssl2020/