MTLS 사용

9025 단어 sslmtlshttps

MTLS 사용



서버가 인증서로 인증되는 것이 일반적이지만 이 경우 클라이언트도 인증서를 가지고 있습니다. MTLS를 사용하면 서버는 클라이언트가 누구인지 확인할 수 있습니다.

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



시나리오는 클라이언트(Amy)가 MTLS를 사용하여 서버(Bob)에 액세스하는 것입니다.

아래 다이어그램은 서버 및 클라이언트 인증서가 생성되는 방법을 보여줍니다.



CA(인증 기관)는 신뢰할 수 있는 루트 인증서로 인증서 서명을 담당하는 제3자입니다. 그러나 두 당사자(Amy 또는 Bob) 중 하나에 속한 CA를 사용하는 것이 일반적입니다.

Amy가 하나의 CA를 사용하고 Bob이 다른 CA를 선택할 수도 있습니다(나중에 설명함).

서버 인증서를 만드는 절차는 클라이언트 인증서와 동일합니다. 유일한 차이점은 인증서 제목에 사용되는 일반 이름입니다.
  • 서버의 CN은 Amy가 Bob에 액세스하기 위해 사용하는 이름이어야 합니다.
  • 클라이언트의 CN은 무엇이든 될 수 있지만 서버는 이를 사용하여 일부 추가 유효성 검사를 수행할 수 있습니다.

  • 1. [CA] 자체 서명된 루트 CA X.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] 서버의 인증서 요청



    제목의 일반 이름은 srv.bob.com 와 같이 클라이언트에서 사용할 서버 이름을 반영해야 합니다. 을 위한
    테스트 목적으로 간단하게 가정합니다 localhost .

    openssl req \
      -new \
      -key bob_server.key \
      -subj '/CN=localhost' \
      -out bob_server.csr
    


    생성을 진행하려면 이 단계에서 생성된 인증서 서명 요청(csr 파일)을 CA로 보내야 합니다.
    인증서.

    4. [CA, Bob 대신] CSR을 사용하여 CA는 서명된 서버 인증서를 생성합니다.



    openssl x509 \
      -req \
      -in bob_server.csr \
      -CA ca.crt \
      -CAkey ca.key \
      -CAcreateserial \
      -days 365 \
      -out bob_server.crt
    

    인증서(crt 파일)가 Bob에게 전송됩니다.

    5. [Amy, client side] 클라이언트 키 생성



    openssl genrsa -out amy_client.key 2048
    

    6. [Amy, client side] 서버 인증서 요청



    openssl req \
      -new \
      -key amy_client.key \
      -subj '/CN=amy-client' \
      -out amy_client.csr
    

    생성을 진행하려면 이 단계에서 생성된 인증서 서명 요청(csr 파일)을 CA로 보내야 합니다.
    인증서.

    7. [Amy 대신 CA] CSR을 사용하여 CA는 서명된 클라이언트 인증서를 생성합니다.



    openssl x509 \
      -req \
      -in amy_client.csr \
      -CA ca.crt \
      -CAkey ca.key \
      -CAcreateserial \
      -days 365 \
      -out amy_client.crt
    

    인증서(crt 파일)가 Amy에게 전송됩니다.

    테스트


    Bob의 서버를 시작합니다.



    노드 애플리케이션 시작:

    node app_bob.js
    


    보다 안전한 TLS v1.3을 사용하는 클라이언트만 허용하려는 경우:

    node --tls-min-v1.3 app_bob.js
    


    Amy의 클라이언트 실행:




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


    고유한 CA 사용



    Amy와 Bob이 서로 다른 CA를 사용하는 경우 서로의 루트 인증서를 알아야 합니다.

    Amy와 Bob의 CA에 각각 인증서amy_ca.crtbob_ca.crt가 있다고 가정합니다.

    따라서 Bob은 Amy가 사용하는 인증서를 로드해야 합니다.

    const options = {
        ca: fs.readFileSync('amy_ca.crt'),
    


    그리고 Amy의 클라이언트는 Bob이 사용하는 인증서를 알아야 합니다.

    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
    


    Amy(클라이언트 측):

    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

    좋은 웹페이지 즐겨찾기