Secure Sockets Layer(SSL)とは、ネットワーク通信に安全性およびデータ完全性を提供するためのセキュリティプロトコルの一種です。ここでは主にSSLの単方向認証および双方向認証についてご説明します。
SSL単方向認証と双方向認証の違い
SSL単方向認証はクライアントが証明書を所有する必要がなく、サーバーのみ証明書が必要です。SSL双方向認証ではクライアントとサーバーの両方が証明書を所有する必要があります。 SSL単方向認証はSSL双方向認証の認証プロセスと異なり、サーバーでクライアント証明書の検証と暗号化方式のネゴシエーションを行う必要がなく、サーバーからクライアントへも暗号化されていない暗号化方式が送信されます(SSL認証プロセスの安全性に影響はありません)。
一般的に、Webアプリケーションはユーザー数が非常に多く、通信層でユーザーのID認証を行う必要がないため、SSL単方向認証の設定で十分です。ただし、一部の金融業界ユーザーのアプリケーションアクセスでは、クライアントのID認証が要求される可能性があり、この場合はSSL双方向認証が必要です。
SSL単方向認証
SSL単方向認証ではサーバーのIDのみ検証する必要があり、クライアントのIDを検証する必要はありません。SSL単方向認証のフローは次の図のとおりです。
1. クライアントがHTTPS接続確立リクエストを送信し、クライアントがサポートするSSLプロトコルバージョン番号、暗号化アルゴリズムの種類、生成する乱数などの情報をサーバーに送信します。
2. サーバーはSSLプロトコルバージョン番号、暗号化アルゴリズムの種類、生成する乱数などの情報、サーバーの証明書(server.crt)をクライアントに返します。
3. クライアントは証明書(server.crt)の有効性を検証し、この証明書からサーバーの公開鍵を取得します。
証明書が期限切れになっていないかを確認します。
証明書が取り消されていないかを確認します。
証明書が信頼できるかどうかを確認します。
受信した証明書内のドメイン名とリクエストのドメイン名が一致しているかどうかを確認します。
4. 証明書が検証に合格すると、クライアントは乱数(キーK)を生成し、通信のプロセスで共通鍵暗号化のキーとして用います。さらにサーバー証明書の公開鍵を使用して暗号化した後、サーバーに送信します。
5. サーバーはクライアントから送信された暗号化情報を受信した後、秘密鍵(server.key)を使用して復号し、共通暗号化鍵(キーK)を取得します。
それ以降のセッションでは、クライアントとサーバーはその共通暗号化鍵(キーK)を使用して通信を行うことで、通信プロセスにおける情報のセキュリティを保証します。
SSL双方向認証
SSL双方向認証ではクライアントとサーバーのIDを検証する必要があります。SSL双方向認証のフローは次の図のとおりです。
1. クライアントがHTTPS接続確立リクエストを送信し、クライアントがサポートするSSLプロトコルバージョン番号、暗号化アルゴリズムの種類、生成する乱数などの情報をサーバーに送信します。
2. サーバーはSSLプロトコルバージョン番号、暗号化アルゴリズムの種類、生成する乱数などの情報、サーバーの証明書(server.crt)をクライアントに返します。
3. クライアントは証明書(server.crt)の有効性を検証し、この証明書からサーバーの公開鍵を取得します。
証明書が期限切れになっていないかを確認します。
証明書が取り消されていないかを確認します。
証明書が信頼できるかどうかを確認します。
受信した証明書内のドメイン名とリクエストのドメイン名が一致しているかどうかを確認します。
4. サーバーがクライアントにクライアントの証明書(client.crt)を送信するよう要求し、クライアントは自身の証明書をサーバーに送信します。
5. サーバーはクライアントの証明書(client.crt)を検証し、検証に合格すると、サーバーはルート証明書(root.crt)を使用してクライアント証明書を復号し、クライアントの公開鍵を取得します。
6. クライアントはサーバーに、自身のサポートする共通鍵暗号化方式を送信します。
7. サーバーはクライアントから送信された共通鍵暗号化方式の中から、暗号化の程度が最も高い暗号化方式を選択し、クライアントの公開鍵を使用して暗号化した後、クライアントに返します。
8. クライアントはクライアントの秘密鍵(client.key)を使用して暗号化方式を復号し、乱数(キーK)を生成し、通信のプロセスで共通鍵暗号化のキーとして用います。その後、サーバー証明書の公開鍵を使用して暗号化した後、再びサーバーに送信します。
9. サーバーはクライアントから送信された暗号化情報を受信した後、サーバーの秘密鍵(server.key)を使用して復号し、共通暗号化鍵(キーK)を取得します。
それ以降のセッションでは、クライアントとサーバーはその共通暗号化鍵(キーK)を使用して通信を行うことで、通信プロセスにおける情報のセキュリティを保証します。
関連ドキュメント