パソコン情報

CentOS7を「SSL化してないWEBサーバーをProxyServer経由でSSL化で接続させる」(メールサーバー構築含む)

とうとう、自分でサーバーを構築して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

署名情報を聞かれるので入力してきます。

Country Name (2 letter code) [XX]:JP #国名コードを入力(日本ならJP)
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/