SSL通信用自己証明書の発行手順~ SOCKET SERVER 'HAL'

安全な HTTPS 通信を行うには認証局によって通信先の信頼性を保証して貰う必要があるのですが、SSL 証明書を認証局に発行してもらうには少なからずお金がかかります。

そこで、非商用の個人サーバーで、暗号化の通信さえ利用できれば問題ない場合などにおいて、認証局を利用せず、自己発行の自己署名証明書を利用することで、暗号化通信だけを利用するケースがあります。

このページでは自己証明書を発行し、Apache に設定する手順を記します。

SSL通信用自己証明書の発行手順

 WEB の通信で通信内容を漏らさないためには SSL/TLS プロトコルを使った暗号化通信が必要です。これは https:// といった URL で暗号化通信を行うことを明示します。

 安全な HTTPS 通信を行うには認証局によって通信先の信頼性を保証して貰う必要があるのですが、SSL 証明書を認証局に発行してもらうには少なからずお金がかかります。

 近年ではオープンソースを使い、無料で証明局を運営して証明書を発行する方法もありますが、最低限、独自ドメインが必要です。

 そこで、非商用の個人サーバーで、暗号化の通信さえ利用できれば問題ない場合などにおいて、認証局を利用せず、自己発行の自己署名証明書を利用することで、暗号化通信だけを利用するケースがあります。

 この場合、認証局を通していないので第三者からみると信頼できませんが、自分自身で利用する限りでは問題ないことになります。

 Raspberry Pi を外部から操作したい場合など、第三者からの信頼は無くても構わないが、通信内容は傍受されたくない場合は多いでしょう。

 こういった場合には自己証明書を発行して WEB サーバーに適用することで、暗号化された通信を行うことが出来るようになります。

 以下に、自己証明書を発行し、Apache に設定する手順を記します。

自己証明書作成手順

 まず、管理者権限になり、サーバー証明書用のディレクトリに移動します。

su -

cd /etc/ssl/private

 ここで、AES-256暗号方式、2048bit長の秘密鍵 server.key を作成します。パスフレーズが2回聞かれるので、任意の同じパスフレーズを入力しましょう。

openssl genrsa -aes256 -out server.key 2048

 次は、先程の秘密鍵から証明書署名要求 csr を作成します。有効期限は3650日にしています。以下のコードを実行すると、先程の秘密鍵作成時に設定したパスフレーズを聞かれます。その後は、必要情報の入力です。基本的に自己証明なので、あまり正確に入力する必要はありません。

openssl req -new -days 3650 -key server.key -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) [AU]:JP ←国名2文字のコード
State or Province Name (full name) [Some-State]:Tokyo ←都道府県
Locality Name (eg, city) []:Shibuya ←市区町村
Organization Name (eg, company) [Internet Widgits Pty Ltd]:feijoa.jp ←組織名
Organizational Unit Name (eg, section) []: ←部署名(エンターで可)
Common Name (e.g. server FQDN or YOUR name) []:hal.jp ←サーバーコモンネーム(独自ドメインを取得していない場合は適当に)
Email Address []:test@test.jp ←連絡先メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ←エンターで可
An optional company name []: ←エンターで可

 最後に、自分の秘密鍵で自己署名した証明書を作成します。パスフレーズが再び聞かれます。

openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650

これで、/etc/ssl/private ディレクトリ内に

  • server.key
  • server.csr
  • server.crt

という、3 つのファイルが作成されました。

 これらのファイルは一応重要なファイルなため、管理者以外は扱えないようにしておきます。4 は、「読み出しのみ」という設定です。400 は、ファイルの所有者のみ読み出し可、他のユーザーはアクセス不可です。

chmod 400 server.*

 最後に、秘密鍵を利用する度にパスフレーズを聞かれるのを阻止するため、以下を実行して秘密鍵からパスフレーズを削除します。削除前にパスフレーズが 1 度聞かれます。(上の行は、念のため秘密鍵をバックアップしています)

cp server.key server.key.org

openssl rsa -in server.key -out server.key

以上で鍵の作成は終了です。管理者権限から抜けましょう。

exit

Apache に SSL 用の鍵を設定

※以下の SSL に関する設定は、HAL の自動インストールスクリプトで SSL を利用する設定で実行した場合、自動で設定されます。

まず、Apache の設定ファイルのディレクトリに移動します。

cd /etc/apache2/sites-available

Apache での SSL 用の設定は default-ssl.conf で行います。本来はこのファイルを複製してリネームしバーチャルホストを作成しますが、複数サイトを運営することは想定していないので今回は直接このファイルで設定します。

sudo vi default-ssl.conf

ドキュメントルート設定は大体以下のようになります。

ServerAdmin test@test.jp

DocumentRoot /var/www/HAL/webapps/public
<Directory /var/www/HAL/webapps/public/>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>

あとは、先程作成した鍵を設定します。

#   SSLCertificateFile directive is needed.
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

    ↓

#   SSLCertificateFile directive is needed.
#SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
#SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
SSLCertificateFile /etc/ssl/private/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key

最後に、変更した設定内容を有効化し、Apacheを再起動します。

sudo a2ensite default-ssl
sudo a2enmod ssl
sudo a2enmod rewrite
sudo systemctl daemon-reload
sudo service apache2 restart

接続テスト

さて、では接続テストをしてみましょう。

LAN内の別のパソコン、又はスマフォから、https://RaspberryPiのIPアドレス でアクセスします。

セキュリティ警告

上記のようなセキュリティ警告画面が表示されます(画像はFirefox)。

以後の対処はブラウザによって違いますが、Firefox の場合は「エラー内容」をクリックして表示される画面から「例外を追加」でこの IP アドレスに対してセキュリティ例外が設定され、接続出来るようになります。

接続後

URLバーの左側に、警告アイコンは出ていますが鍵アイコンも表示され、鍵アイコンをクリックして表示される情報から暗号化通信は行えていることが分かります。


ご購入

もう少々お待ち下さい。

体験版

version 1.5 から、IPアドレス制限が無くなり、ライセンス制になりました。ライセンスされていない場合、起動後30時間後に自動的に HAL を終了します。

体験版のインストーラー・スクリプトをダウンロード インストーラー・スクリプト
SHA-1: dd2a390b4f0f8c15301eaee23cd92bd5e831da91
※インストール方法については ソケットサーバー「HAL」の概要 (version 2.0対応版)~導入方法 を御覧ください。

体験版パッケージ
HAL_trial_2_0.tar.gz | version 2.0 | SHA-1: ce31802a5b423a9b0d73721a3d43e0585b009a6f
試用期限 2017/1/31 まで

この記事へのコメント

※現在コメントはMarkdown記法が強制です。>>Markdown の書き方


この記事に返信

このコメントに返信