MTLの使用


MTLの使用


サーバが証明書によって認証されるのは一般的です、しかし、この場合、クライアントも1を持ちます.MTLを使用すると、クライアントが誰であるかを確認できます.

MTLS means "mutual TLS authentication" or "two-way TLS authentication".


シナリオは:クライアント(AIM)MTLを使用してサーバーにアクセスする.
以下の図は、サーバーとクライアントの証明書の作成方法を示しています.

CA(認証局)は信頼できるルート証明書で証明書に署名する第三者です.しかし、2つの党の1つに属しているCAを使うのは、一般的です.
また、Amyが1つのCAを使用し、Bobが別のものを選択することも可能である(後述).
サーバー証明書を作成する手順は、クライアント証明書と同じです.唯一の違いは、証明書対象で使用される共通名です.
  • サーバのCNは、エイミーがボブにアクセスするために使用する名前でなければなりません.
  • クライアントのCNは何かをすることができますが、サーバはいくつかの追加検証を行うことができます.
  • 自己署名根CA . 509証明書の作成


    openssl req \
      -new \
      -x509 \
      -nodes \
      -days 365 \
      -subj '/CN=my-ca' \
      -keyout ca.key \
      -out ca.crt
    

    2 .[ BOB , server side ]サーバのキーを作成する


    openssl genrsa -out bob_server.key 2048
    

    3 .[ BOB , Server Side ]サーバの証明書を要求する


    対象の一般名は、クライアントによって使用されるサーバー名を反映します.For
    テストの目的は、単にsrv.bob.comと仮定します.
    openssl req \
      -new \
      -key bob_server.key \
      -subj '/CN=localhost' \
      -out bob_server.csr
    
    このステップで生成された証明書署名要求(CSRファイル)は、CA
    証明書.

    4. [CA, on behalf of Bob] Using the CSR, the CA creates the signed server certificate:


    openssl x509 \
      -req \
      -in bob_server.csr \
      -CA ca.crt \
      -CAkey ca.key \
      -CAcreateserial \
      -days 365 \
      -out bob_server.crt
    
    証明書(CRTファイル)はボブに送られます.

    5 . [エイミー、クライアント側]クライアントのキーを作成する


    openssl genrsa -out amy_client.key 2048
    

    6 . [エイミー,クライアント側]サーバの証明書を要求する


    openssl req \
      -new \
      -key amy_client.key \
      -subj '/CN=amy-client' \
      -out amy_client.csr
    
    このステップで生成された証明書署名要求(CSRファイル)は、CA
    証明書.

    7 . [ ACEの代わりにCA ] CSRを使用して、CAは署名されたクライアント証明書を作成します。


    openssl x509 \
      -req \
      -in amy_client.csr \
      -CA ca.crt \
      -CAkey ca.key \
      -CAcreateserial \
      -days 365 \
      -out amy_client.crt
    
    証明書(CRTファイル)はエイミーに送られます.

    テスト


    Start Bob's server:


    ノードアプリケーションを起動する
    node app_bob.js
    
    より安全なTLS V 1を持つクライアントだけを許可したいなら.3
    node --tls-min-v1.3 app_bob.js
    

    エイミーのクライアントを実行する


    curl \
      --cacert ca.crt \
      --key amy_client.key \
      --cert amy_client.crt \
      https://localhost:3000
    

    異なるCASの使用


    エイミーとボブが異なったCASを使用しているなら、彼らは互いのルート証明書を知っている必要があります.
    エイミーとボブのCASがlocalhostamy_ca.crtの証明書を持っていると仮定します.
    したがって、ボブはAmyによって使用される証明書をロードしなければなりません:
    const options = {
        ca: fs.readFileSync('amy_ca.crt'),
    
    そしてエイミーのクライアントはボブによって使用される証明書を知る必要があります.
    curl \
      --cacert bob_ca.crt \
    

    これらはこのシナリオを作成する完全な手順です.
    ボブ(サーバ側):
    openssl req \
      -new \
      -x509 \
      -nodes \
      -days 365 \
      -subj '/CN=bob-ca' \
      -keyout bob_ca.key \
      -out bob_ca.crt
    
    openssl genrsa -out bob_server.key 2048
    
    openssl req \
      -new \
      -key bob_server.key \
      -subj '/CN=localhost' \
      -out bob_server.csr
    
    openssl x509 \
      -req \
      -in bob_server.csr \
      -CA bob_ca.crt \
      -CAkey bob_ca.key \
      -CAcreateserial \
      -days 365 \
      -out bob_server.crt
    
    エイミー(クライアント側):
    openssl req \
      -new \
      -x509 \
      -nodes \
      -days 365 \
      -subj '/CN=amy-ca' \
      -keyout amy_ca.key \
      -out amy_ca.crt
    
    openssl genrsa -out amy_client.key 2048
    
    openssl req \
      -new \
      -key amy_client.key \
      -subj '/CN=amy-client' \
      -out amy_client.csr
    
    openssl x509 \
      -req \
      -in amy_client.csr \
      -CA amy_ca.crt \
      -CAkey amy_ca.key \
      -CAcreateserial \
      -days 365 \
      -out amy_client.crt
    

    リファレンス


    https://github.com/adzubla/mtls-test