blog

SSL&OpenSSL

sslプロトコルは、1994年にNetscape社によって作成、設計されたネットワーク通信セキュリティプロトコルのセットで、データの暗号化、整合性チェック、認証機能を備えています。ネットワークデータ伝...

Jun 21, 2020 · 14 min. read
シェア

SSL

ssl プロトコルは、1994 年に Netscape 社がデータの暗号化、整合性チェック、認証を行うために作成、設計したネットワーク通信セキュリティプロトコルのセットです。ネットワーク上のデータ転送のセキュリティを保証するために作られました。ssl プロトコルはアプリケーション層とトランスポート層の間にあり、 TCP のような信頼性のある接続に基づいたアプリケーション層のプロトコルに セキュリティを提供することができます。

SSLプロトコル自体は2つのレイヤーに分かれており、上位レイヤーはSSLハンドシェイクプロトコル、SSL暗号化プロトコル、SSL警告プロトコルで、これらはSSLロギングプロトコルの上に構築され、実際のデータ伝送が始まる前に、両者の認証、暗号化アルゴリズムのネゴシエーション、暗号化キーの交換などに使われます。

SSLハンドシェイク

SSL ハンドシェークプロセスはクライアントとサーバの間で セッションパラメータをネゴシエートし、セッションを確立します。セッションに含まれる主なパラメータは セッション ID、相手の証明書、暗号スイート、マスターキーです。SSL セッションで送信されるデータは全て、ワーキングキーと セッションのマスターキーから生成された暗号スイートを使って 暗号化され、MAC やその他の処理が計算されます。

ワーキング・キー:直接生成されません。クライアントがプレ・マスター鍵を生成し、鍵交換アルゴリズムを使ってサーバ側に送信します。両者はこのプレ・マスター鍵に基づいてマスター鍵を生成し、マスター鍵を使ってワーキング・キーを生成します。

RSAハンドシェイク

ECDHEハンドシェーク・プロセス

一方向の校正プロセス

1 SSLクライアントは、サポートしているSSLバージョン、乱数、セッションID、暗号化アルゴリズム、鍵交換アルゴリズム、MACアルゴリズムなどをClient Helloメッセージでサーバーに送信します。

2 サーバーは、この通信に使用するSSLバージョン、暗号化スイート、乱数、セッションIDを決定し、Server Helloメッセージでクライアントに通知します。

3 SSLサーバーは、自身のデジタル証明書または証明書チェーンをCertificateメッセージでクライアントに送信します。

4 サーバはクライアントに SSL バージョンと暗号スイートのネゴシエーションが完了し、鍵交換が開始されたことを通知するために Server Hello Done メッセージを送信します。

5 クライアントはサーバの証明書の正当性を確認し、ランダムに生成されたクライアントの事前マスターシークレットを証明書の公開鍵で暗号化し、クライアント鍵交換メッセージでサーバに送信します。

6 クライアントは、ネゴシエートされた鍵と暗号スイートが以降のメッセージの暗号化と MAC 計算に使用されることをサーバに通知するために、暗号仕様変更メッセージを送信します。サーバは同様にハンドシェイクメッセージのハッシュ値を計算し、Finished メッセージの復号結果と比較し、両者が一致し、MAC 値が正常に検証されれば、鍵と暗号化スイートのネゴシエーションが成功したことを証明します。キーと暗号化スイートのネゴシエーションが成功したことを証明します。

7 手順 6 と同様に、サーバはネゴシエートされた鍵と暗号スイートが以降のメッセージの暗号化と MAC 検証に使われることをクライアントに通知するために、暗号仕様の変更メッセージを送信します。

8 手順7と同じで、サーバは処理したデータを完了メッセージでクライアントに送信し、クライアントは処理を完了します。

双方向校正プロセス

クライアント認証はオプションで、クライアントを認証するかどうかは サーバが決めることです。 サーバがクライアントを認証したい場合は、SSL ハンドシェイクの間に サーバのメッセージだけを認証するだけでなく、ハンドシェイクの両側で 対話する必要があります:

1 サーバーはサーバー鍵交換メッセージを送信します。このメッセージは、サーバーの証明書に必要なデータが含まれていない場合にのみ送信され、2つの乱数とサーバー・パラメーターから成る署名を含みます。

2 サーバは、クライアントに証明書をサーバに送信するよう求める証明書要求メッセージを送信します。

3 クライアントは公開鍵情報を含む証明書を証明書メッセージでサーバに送信し、サーバは証明書の正当性を検証します。

4 クライアントは、対話したハンドシェイク情報であるマスター鍵のハッシュ値を計算し、自分の秘密鍵を使って暗号化し、証明書のベリティメッセージとしてサーバに送信します。

5 サーバ側では、インタラクティブハンドシェイク情報とマスター鍵のハッシュ値を計算し、クライアント証明書の公開鍵を用いて証明書ベリティメッセージを復号化し、復号化結果と計算したハッシュ値を比較し、両者が一致すればクライアント認証成功。

元のセッションのSSLハンドシェイクプロセスを復元します。

セッションパラメータの交渉は、セッションを確立するプロセスは、キーを暗号化するために非対称キーアルゴリズムを使用する必要性は、通信の両側の身元を確認し、計算が大きく、システムリソースの多くを占め、簡素化するために、SSLハンドシェイクプロセスは、SSLは、ネゴシエートされたセッションを再利用することができます2つの方法があります:セッションIDのセッションの再利用、セッションチケットのセッションの再利用

セッションID セッション再利用

1 クライアントは、セッションIDをビットプラン再利用のセッションIDに設定したクライアントHelloメッセージを送信します。

2 サーバーがセッションの再利用を許可している場合、サーバーは同じセッションIDをサーバーのHelloメッセージに設定して応答します。

3 クライアントはchange cipher specメッセージを送信し、それ以降のメッセージは元のセッションの鍵と暗号スイートを使用して暗号化とMAC計算を行うことをサーバーに通知します。

4 クライアントは、やり取りされたハンドシェイク・メッセージのハッシュ値を計算し、元のセッションの鍵と暗号化スイートを使ってハッシュ値を処理し、FINISHメッセージでサーバーに送信します。

5 同様に、サーバはchange cipher specメッセージを送信し、それ以降のメッセージは元のセッションの鍵と暗号スイートを使用して暗号化とMAC計算を行うことをクライアントに通知します。

6 サーバーは、やり取りされたハンドシェーク・メッセージのハッシュ値を計算し、元のセッションの鍵と暗号化スイートを使用してハッシュ値を処理し、クライアントが鍵と暗号化スイートが正しいかどうかを判断できるように、FINISHメッセージでクライアントに送信します。

セッションチケット

2 ハンドシェイクの間、もしサーバーがセッションチケットをサポートしていれば、サーバーはマスターキーを含むセッションの回復を可能にする情報を含む、新しいセッションチケットのタイプのハンドシェイクメッセージを送ります。もちろん、最も単純なのはマスター鍵だけを送ることで、仲介者を見えなくするために、このセッションチケットの部分は暗号化され、暗号化された操作

3 クライアントはセッションチケットを受け取った後、現在のマスターキーとセッションチケットをキーと値のペアのチームとして保存するので、サーバーはセッション情報を保存する必要がなく、クライアントはセッションチケットが何を表しているかを知る必要がありません。

4 クライアントはセッションの再利用を行おうとすると、クライアントhelloの拡張子にセッションチケットを追加し、サーバはセッションチケットを受信して復号化、復号化などの処理を行います。セッション情報の復元が可能であれば、セッション情報のマスターキーを抽出して以降の処理を行い、サーバはセッション多重化処理に従って、サーバhello、ccs、finishedに直接返信します。

SSLレコードプロトコル

クライアントとサーバーはハンドシェイクを完了した後、SSL記録プロトコルに入ります。

  • 機密性、SSL記録プロトコルは、SSLを介して送信されるデータを従来のデータ暗号化で暗号化するために使用される共通のキーを生成するために両当事者を支援します。
  • メッセージの完全性を確保するために、SSL記録プロトコルは、メッセージ認証コードを計算するために使用される別の共有鍵を生成するために両当事者を支援します。

アプリケーションによって送信される情報を受信した後、記録プロトコルはメッセージ内のデータを管理可能なサブブロックに切り分け、これらのサブブロックを圧縮するかどうかを選択し、このサブブロックのメッセージ認証コードを追加し、データブロックとMACを一緒に暗号化し、SSLヘッダを追加してTCPで送信します。 データを受信した後、受信者はデータを解釈し、チェックし、解凍し、再編成します。データを受信した後、受信者はデータを解釈し、チェックし、解凍し、再編成します。

  • スライス
  • コンプレッションの有無
  • 圧縮データのメッセージ認証コードの計算
  • 圧縮されたデータはMACと共に対称的に暗号化されます。
  • プラスレコーディングヘッダー

レコードヘッダには以下の情報が含まれます:

  • データ型、8ビットはこのスライスの上位層プロトコルを処理するために使用されます。
  • メジャーバージョン番号、8ビット、プロトコルのメジャーバージョン。
  • マイナーバージョン番号、8ビット、使用されるマイナーバージョンを示します。
  • 圧縮された長さ、16ビット、この平文スライスの長さ

SSL暗号変更プロトコル変更暗号仕様

パスワード変更プロトコルは、3つの高レベルプロトコルのうちの1つであり、最も単純なプロトコルです。クライアントとサーバはハンドシェイクプロトコルを完了した後、関連するメッセージを相手に送信して、後続のデータがちょうどネゴシエートされた暗号仕様アルゴリズムと関連する鍵で処理されることを通知する必要があり、ネゴシエートされたアルゴリズムと鍵に従って自分のモジュールの作業を調整する責任があります。

OpenSSLによる証明書の生成

予備的

  • opensslツールキットをダウンロードし、環境変数を設定します。

  • インストール・ディレクトリのbinパスでopenssl.cfgファイルを見つけ、dir属性の値を指定したいディレクトリに変更します。

  • 次に、次のステップで使用するために、caディレクトリに空のファイルをいくつか作成します。
  • 次に、使用するファイルのビルドを続けます。

上記の操作が完了すると、証明書の構築と発行を開始することができます。上記のコマンドは、インデックスとシリアルファイルを作成しない場合は、その後、管理者のIDを操作するために使用するかどうかを確認する必要がありますし、操作はcmdコマンドの端末を介してのみ実施することができることに注意してください、私はwidows powershellの操作を介してテストでは、手動でcaディレクトリ内の後続の操作の作成にも問題が発生します効果を持っていないことがわかりました。

ルート証明書の構築

  • ランダム・ファイルを作成するためのコマンドは以下の通りです。

    openssl rand -out private/.rand 1000
    

このコマンドを実行すると、プライベート・ディレクトリに何かが現れたことに気づくでしょう。

上記のコマンドのパラメーターの意味は、パラメーター1000が生成される擬似ランダム・バイト数

rand 乱数コマンド
-out 出力ファイルのパス、ここでは乱数ファイルはプライベートディレクトリに出力されます。
  • 以下のコマンドでルート証明書キーを構築します。
    openssl genrsa -aes256 -out private/ca.key.pem 2048
    

各パラメーターの意味は以下の通りです:

genrsa RSA鍵生成コマンド
-aes652 生成された秘密鍵を AES アルゴリズムで暗号化します。オプションのアルゴリズムには DES、DESede、IDEA、AES があります。
-out 出力パス、この場合は private/ca.key.pem
4028 ここでのパラメータは2048で、RSA鍵の長さのビット数を表します。
  • 以下のコマンドでルート証明書発行要求ファイルを生成します。

    openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C/ST=BJ/L=BJ/O=yewenjie/OU=yewenjie=*.yewenjie.org"
    

各パラメーターの意味は以下の通りです:

req 証明書発行申請オーダーの生成
-new 新しいリクエストであることを示します。
-key 鍵(この場合はprivate/ca.key.pemファイル
4028 出力パス(この場合はprivate/ca.csrファイル
-out ユーザー情報を指定します。ここでは、一般的なドメイン名 *.yewenjie.org をユーザー名として使用します。
  • ルート証明書発行申請ファイルを入手したら、CA に送付して発行してもらいます。また、自分でルート証明書を発行することもできます。ルート証明書を発行するコマンドは以下の通りです。

    openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer
    

各パラメーターの意味は以下の通りです:

x905 x.509形式の証明書発行コマンド
-req 証明書入力要求
-days 有効日数(この場合は365日
-sha1 証明書ダイジェスト・アルゴリズム(この場合はsha1アルゴリズム
-extensions openssl 設定ファイルの v3_ca エントリに従って拡張子を追加します。
-signkey 自己署名鍵、ここでは private/ca.key.pem
4028 入力ファイル(この場合はprivate/ca.csr
-out 出力ファイル、この場合は certs/ca.cer
  • opensslで生成された証明書はJava環境では直接使用できないため、証明書のエンコード形式を変換する必要があります。ルート証明書の形式を変換するコマンドは以下の通りです。

    openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12
    

この時点で、生成されたルート証明書ファイルを見ると、2つの証明書ファイルタイプが異なることがわかります。

各パラメーターの意味は以下の通りです:

pkcs12 PKCS#12 コード化形式証明書コマンド
-export 証明書のエクスポート
-clcerts CA 証明書のみのエクスポート
-clcerts private/ca.key.pemにキーを入力します。
4028 入力ファイル、この場合は certs/ca.cer
-CAkey 出力ファイル、ここでは certs/ca.p12

ルート証明書を構築したので、それを使ってサーバー証明書とクライアント証明書を構築します。

サーバ証明書の構築

  • まず、以下のコマンドで秘密鍵を作成します。

    openssl genrsa -aes256 -out private/server.key.pem 2048
    

各パラメーターの意味は以下の通りです:

-CAserial RSA鍵生成コマンド
-aes652 生成された秘密鍵をAESアルゴリズムで暗号化します。オプションにはDES、DESede、IDEA、AESがあります。
-out 出力パス(この場合は private/server.key.pem
4028 はRSA鍵長のビット数で、デフォルトは215。
  • 以下のコマンドでサーバー証明書発行要求を生成します。

    openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C/ST=BJ/L=BJ/O=yewenjie/OU=yewenjie=www.yewenjie.org"
    

各パラメータの意味は以下の通りです。

req RSA鍵生成コマンド
-new しんがん
-key 鍵(この場合はprivate/ca.key.pemファイル
4028 出力パス(この場合はprivate/ca.csrファイル
-out ユーザー情報を指定します。ここではドメイン名 www.yewenjie.org作为用户名 を使用します。
  • ルート証明書を使用してサーバー証明書を発行するには、以下のコマンドを使用します。

    openssl x509 -req -days 365 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer
    

各パラメータの意味は以下の通りです。

x905 x.509形式の証明書発行コマンド
-req 証明書入力要求
-days 有効日数(この場合は365日
-sha1 証明書のダイジェストアルゴリズム、この場合はSHA1
-extensions Openssl 設定ファイル v3_req エントリによる拡張子の追加
-signkey CA 証明書(certs/ca.cer
-CA CA証明書の鍵は、private/ca.key.pemです。
-CA CA 証明書シリアル番号ファイル、以下は ca.srl です。
-CAcreateserial CA 証明書シリアル番号の作成
-in 入力ファイル、ここでは private/server.csr
-out 出力ファイル、この場合は certs/server.cer
  • 以下のコマンドで証明書フォーマットを変換します。

    openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12
    

各パラメーターの意味は以下の通りです:

pkcs12 PKCS#12 コード化形式証明書コマンド
-export 証明書のエクスポート
-clcerts クライアント証明書のみエクスポート
-inkey 鍵ファイルへのパス(この場合はprivate/server.key.pem)を入力します。
4028 ファイルへのパス(この場合はcerts/ca.cer)を入力します。
-CAkey 出力ファイルのパス、ここでは certs/server.p12

クライアント証明書の作成

  • 以下のコマンドで秘密鍵を作成します。

    openssl genrsa -aes256 -out private/client.key.pem 2048
    

各パラメータの意味は以下の通りです。

genrsa RSA鍵生成コマンド
-aes652 生成された秘密鍵をAESアルゴリズムで暗号化します。オプションにはDES、DESede、IDEA、AESがあります。
-out 出力パス、この場合は private/client.key.pem
4028 はRSA鍵長のビット数で、デフォルトは512ビットです。
  • 以下のコマンドでクライアント証明書発行要求を生成します。

    openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C/ST=BJ/L=BJ/O=yewenjie/OU=yewenjie=yewenjie"
    

各パラメータの意味は以下の通りです。

req 証明書発行申請オーダーの生成
-new しんがん
-key 鍵(この場合はprivate/client.key.pemファイル
4028 出力パス(この場合はprivate/client.csrファイル
-subj ここではユーザー名としてyewenjieを使用します。
  • ルート証明書を使用してクライアント証明書を発行するには、以下のコマンドを使用します。

    openssl ca -days 365 -in private/client.csr -out certs/client.cer -cert certs/ca.cer -keyfile private/ca.key.pem
    

パラメータコマンドは以下の通りです。

カフェ 乱数コマンド
-日 証明書の有効期間、365日
-で 入力ファイル(この場合はprivate/client.csr
-subj 出力ファイル、この場合は certs/server.cer
pkcs12 証明書ファイル、ここでは certs/ca.cer
-CAkey ルート証明書キーファイル、以下はprivate/ca.key.pemです。
  • 証明書フォーマットの変換、コマンドは以下の通りです。

    openssl pkcs12 -export -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12
    

各パラメーターの意味は以下の通りです:

pkcs12 PKCS#12 コード化形式証明書コマンド
-export 証明書のエクスポート
-clcerts クライアント証明書のみエクスポート
-inkey private/client.key.pemにキーを入力します。
4028 入力ファイル、この場合は certs/client.cer
-CAkey 出力ファイル、ここでは certs/client.p12

ここで、双方向認証に必要なすべての証明書を完成させると、以下のようになります。

ほら

  • 表示されないフォルダは空です
  • パスワードの入力が必要な場合は、上記の手順をカスタマイズすることができます。パスワード321456

これは以下の方法で解決できます:

(b) cmdコマンドターミナルで管理者IDを使用するには、次のように設定します。

OPENSSL_CONF=D:◆OpenSSL-Win64binopenssl.cfg

echo %OPENSSL_CONF% です。

Read next

正規表現の簡単な使い方

コードを記述する過程で、しばしば特定の複雑なルールを満たす文字列を見つける必要があります。正規表現は、これらのツールのルールを記述するために使用され、その強力な構文形式を介して、文字列のマッチング問題の多数に対処するために助けることができる、以下は正規表現の一般的な構文のいくつかの簡単な要約です。 修飾子は、前の要素が入力文字列中に存在しなければならないことを指定します。

Jun 21, 2020 · 4 min read