見出し画像

HTTPS通信のテスト環境を作り、仕組みを理解する

情報系の資格試験などでよく見かけるHTTPS通信ですが、座学だけだとなかなか実感が湧かないため、実際にテスト環境を構築し、その仕組みを理解してみようと思いました。

HTTPS通信の仕組み


インターネットを安全に利用するために不可欠な技術の一つにHTTPSがあります。HTTPSは、HTTPにSSL/TLSプロトコルを組み合わせたもので、通信内容を暗号化することで、情報の盗聴や改ざんを防ぎます。

①サーバ側の役割と秘密鍵の生成

HTTPS通信を始めるためには、まずサーバ側で秘密鍵を生成する必要があります。秘密鍵は、サーバが自分自身を識別し、暗号化通信を行うための非常に重要な情報です。一般的には、以下のような手順で秘密鍵を生成します。
1. 秘密鍵の生成: サーバ上で秘密鍵(keyファイル)を生成します。この秘密鍵は厳重に保管し、外部に漏れないようにする必要があります。

②CSRファイルの生成

秘密鍵が生成されたら、次にCSR(Certificate Signing Request)ファイルを生成します。CSRファイルには、公開鍵とともに、証明書を発行するためのサーバの情報(ドメイン名、組織名、所在地など)が含まれています。このファイルを使って、認証局(CA)に証明書の発行を依頼します。
1. CSRファイルの生成: 秘密鍵を用いてCSRファイルを生成します。

③認証局(CA)での証明書発行

生成したCSRファイルを認証局(CA)に送信すると、CAはその情報を基にサーバ証明書を発行します。CAはサーバの情報を検証し、正当性を確認した後に証明書を発行します。この証明書は、サーバの公開鍵とサーバの身元情報が含まれており、ブラウザがサーバを信頼するための基準となります。
1. 証明書の発行: CAはCSRファイルを受け取り、確認後にサーバ証明書(CRTファイル)を発行します。

④クライアント側ブラウザの役割

クライアント側のブラウザは、サーバとの通信を行う際に、サーバが提示する証明書を検証します。この検証プロセスは以下の手順で行われます。

サーバとブラウザ間のHTTPS通信の流れ

1. ブラウザがサーバに接続: ユーザーがブラウザでHTTPSのURLを入力し、サーバに接続を試みます。この時点で、ブラウザはサーバに対してSSL/TLSハンドシェイクを開始します。
2. サーバが証明書を送信: サーバは自身のデジタル証明書(CRTファイル)をブラウザに送信します。この証明書には、サーバの公開鍵、サーバの識別情報、認証局のデジタル署名などが含まれています。
3. ブラウザが証明書を検証:
証明書チェーンの確認: ブラウザは受け取った証明書が信頼できる認証局によって発行されたものであるかを確認します。これは証明書チェーンをたどることで行われます。
デジタル署名の検証: ブラウザは認証局の公開鍵を使用して証明書のデジタル署名を検証します。これにより、証明書が改ざんされていないことを確認します。
有効期間の確認: 証明書の有効期限を確認し、現在の日付がその範囲内にあることを確認します。
4. セッションキーの生成:
鍵交換: ブラウザとサーバはセッションキーを生成するための鍵交換プロトコルを実行します。これには、サーバの公開鍵を使用してデータを暗号化し、安全に共有する方法が含まれます。
セッションキーの共有: ブラウザとサーバは、今後の通信に使用する対称鍵(セッションキー)を安全に共有します。
5. 暗号化通信の開始: セッションキーが確立されると、以降の通信はこの対称鍵を使用して暗号化されます。これにより、データの盗聴や改ざんが防止されます。

HTTPS通信を体験

環境について

macOS sonoma 14.2
ubuntu 22.04.2 ARM64 (Parallels Desktop上に構築)

Apache(Webサーバー)環境

DockerでApacheコンテナを構築
以下の内容のdocker-compose.ymlを所定の場所に配置後、cdで移動

#docker-compose.yml

services:
  web:
    image: httpd
    volumes:
     - .:/usr/local/apache2/htdocs/
    ports:
      - "443:443"

バックグラウンドでApacheを起動

#docker-compose.ymlの実行
sudo docker compose up -d

Apacheコンテナの中に移動
vimが入っていないので、インストール

#Apacheコンテナの中に移動
sudo docker compose exec web bash

#vimインストール
apt-get update
apt-get install vim

ssl通信の設定確認

vim /usr/local/apache2/conf/extra/httpd-ssl.conf

httpd-ssl.confの中で、鍵と認証ファイルのパスを確認
SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"
SSLCertificateFile "/usr/local/apache2/conf/server.crt"

手順

①秘密鍵の生成

RSA暗号において、秘密鍵は以下のような役割を果たします。
1. データの復号: 公開鍵で暗号化されたデータを復号するために使用します。秘密鍵が無ければ、暗号化されたデータを元の形に戻すことはできません。
2. デジタル署名の作成: データに対してデジタル署名を行い、そのデータが改ざんされていないことや送信者を証明するために使用します。 

このとき2048ビット長の秘密鍵を生成することは、高い計算コストを必要とするため、現時点では非常に強力な暗号強度を持っています。

RSAで2048ビット長の秘密鍵を生成

#Apacheコンテナの中でconfフォルダへ移動
cd /usr/local/apache2/conf

#RSAで2048ビット長の秘密鍵を生成
openssl genrsa 2048 > server.key

②証明書要求ファイルの作成

CSR(Certificate Signing Request)は、デジタル証明書の発行をリクエストするためのファイルです。CSRファイルには、証明書を発行するために必要な情報が含まれており、主にサーバ管理者が認証局(CA)に送信します。

CSRファイルには以下の情報が含まれます。

1. 公開鍵: サーバが生成した公開鍵。秘密鍵と対になっており、暗号化や署名のために使用されます。
2. 識別情報: 証明書を発行する対象となるサーバや組織の情報。具体的には以下のような情報が含まれます。
国名 (C): 国の2文字コード(例:JP)
都道府県名 (ST): 都道府県名(例:Tokyo)
市区町村名 (L): 市区町村名(例:Chiyoda-ku)
組織名 (O): 組織名(例:Example Inc.)
部署名 (OU): 部署名(例:IT Department)
共通名 (CN): サーバの完全修飾ドメイン名(例:www.example.com)
3. その他のオプション情報: 電子メールアドレスや追加の属性情報など。

CSRファイルの生成

#Apacheコンテナの中でconfフォルダへ移動
cd /usr/local/apache2/conf

# 作成した秘密鍵からCSR(証明書署名要求)ファイルを作成
openssl req -new -key server.key > server.csr

③認証局での証明書発行

CRTファイルは、デジタル証明書を保存するためのファイル形式です。CRTは「Certificate」の略で、サーバ証明書やクライアント証明書などのデジタル証明書を含みます。このファイル形式は主にX.509規格に基づいており、インターネット上の安全な通信を確保するために広く使用されています。

CRTファイルの内容
CRTファイルには以下の情報が含まれています。
1. 公開鍵: サーバまたはクライアントの公開鍵。これにより、通信相手はデータを暗号化して送信することができます。
2. 証明書の所有者情報: ドメイン名や組織名、所在地などの識別情報。
3. 証明書の発行者情報: 証明書を発行した認証局(CA)の情報。
4. 有効期間: 証明書の有効開始日と有効期限。
5. デジタル署名: 認証局によるデジタル署名。この署名により、証明書の正当性と改ざんされていないことが保証されます。

CRTファイルの生成

#Apacheコンテナの中でconfフォルダへ移動
cd /usr/local/apache2/conf

#証明書(CRT)を作成
openssl x509 -days 3650 -req -sha256 -signkey server.key < server.csr > server.crt

このコマンドは、OpenSSLを使用してCSR(Certificate Signing Request)から自己署名のデジタル証明書を生成するためのものです。以下に、各部分の詳細な説明を示します。
openssl x509: この部分は、OpenSSLのx509ユーティリティを使用することを示しています。x509ユーティリティは、X.509証明書の生成や処理を行うためのツールです。
-days 3650: このオプションは、生成される証明書の有効期間を指定します。この場合、証明書は10年間(3650日)有効です。
-req: このオプションは、入力がCSR(Certificate Signing Request)であることを指定します。
-sha256: このオプションは、証明書の署名に使用するハッシュアルゴリズムをSHA-256に指定します。SHA-256は、現在広く使用されている安全なハッシュアルゴリズムの一つです。
-signkey server.key: このオプションは、自己署名に使用する秘密鍵ファイルを指定します。ここでは、server.keyが秘密鍵ファイルです。
< server.csr: これは、入力として使用するCSRファイルを指定しています。ここでは、server.csrがCSRファイルです。
> server.crt: これは、出力として生成される証明書ファイルを指定しています。ここでは、server.crtが生成される証明書ファイルです。

④Apache設定

/usr/local/apache2/conf/httpd.confを開く
httpd.confの中にある以下の行の#を削除

LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include conf/extra/httpd-ssl.conf

Apacheを再起動し、クライアント側(MacOS)からparallels desktop上のWEBサーバ(https://10.211.55.4)へアクセス

この記事が気に入ったらサポートをしてみませんか?