Node.js v12로 TLSv1.3 테스트 서버 쉽게 구축

오프닝


Node.js는 v12에서 TLSv1.3을 지원합니다.( 릴리즈 노트 )
클라이언트 응용 프로그램의 개발 테스트를 진행할 때 때때로 TLSv1.3의 서버가 필요하지만, 단순한 요청 응답만 확인하면 Node가 필요합니다.운영체제가 어떻든지 간에 js는 쉽게 준비할 수 있고 매우 편리하다.
이 글에는 Windows 및 Mac에서 Node가 나와 있습니다.js를 사용하여 TLSv1.3을 지원하는 HTTPS 서버를 구축하는 절차를 요약합니다.

환경


Windows

  • OS: Windows 10 Version 1809 (64bit)
  • Node.js: v12.2.0
  • OpenSSL: OpenSSL 1.1.1b 26 Feb 2019
  • Mac

  • OS: Mac OS X 10.14.3 Mojave
  • Xcode: 10.2.1 (10E1001)
  • nodebrew: 1.0.1
  • Node.js: v12.2.0
  • OpenSSL: LibreSSL 2.6.5
  • Node.설치 js


    Windows


    Node.웹 페이지 정보에서 최신 설치 프로그램을 다운로드합니다.
    다운로드한 설치 프로그램을 시작하여 화면 설명에 따라 설치를 완료합니다.

    Mac


    버전 전환과 마운트 해제를 편리하게 하기 위해 공식 패키지가 아닌 버전 관리 도구를 사용합니다.js를 설치합니다.
    이번에는 nodebrew라는 도구를 사용합니다.
    nodebrew의 자술 파일에 따라 터미널을 시작하고 설정합니다.
    터미널은 응용 프로그램 폴더의 유틸리티 폴더에 있습니다.
    단말
    # nodebrewのセットアップを行うコマンド
    $ curl -L git.io/nodebrew | perl - setup
    $ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
    $ source ~/.bash_profile
    $ nodebrew help
    nodebrew 1.0.1
    # 以下略
    
    nodebrew 최신판 Node.js를 설치하고 사용하도록 지정합니다.
    단말
    $ nodebrew install latest
    $ nodebrew use latest
    $ node -v
    v12.2.0
    

    OpenSSL 설치


    Windows


    OpenSSL Windows 바이너리 파일을 게시하는 웹 사이트 다운로드.
    이번 사용ICS DownloadOpenSSL Binaries Win-64 1.1.1b requires ICS V8.57 or later.
    다운로드한 zip 파일은 압축을 풀려고 합니다.

    OpenSSL 구성 파일 준비


    사용된 바이너리 파일에 따라 OpenSSL 구성 파일을 따로 준비해야 합니다.
    위의 ICS에서 바이너리 파일을 다운로드하려면 다음과 같이 구성 파일을 준비하십시오.
  • 적당한 곳에서 오픈스슬.cnf라는 파일을 만듭니다.
  • 제작된openssl.수첩 등에서 cnf 파일을 열고 OpenSSL 공식 소스에 포함된 openssl입니다.cnf 샘플 내용을 모두 복사하여 붙여넣습니다.
  • C:\Program Files\Common Files 폴더에 SSL이라는 폴더를 만듭니다.
  • 만든 SSL 폴더에서 openssl을 엽니다.cnf 파일을 이동합니다.
  • Mac


    OS에 미리 설치된 OpenSSL(LibresSL)을 사용하기 때문에 설치할 필요가 없습니다.

    개인 키 및 서버 인증서 만들기


    Windows


    다운로드한 Windows 바이너리 폴더의 openssl입니다.exe를 시작하고 표시된 명령 프롬프트에서 다음 명령을 실행하여 개인 키와 서버 인증서를 만듭니다.
    -subj 옵션의 CN=값은 서버의 IP 주소를 지정합니다.실제 테스트 환경에 따라 값을 다시 쓰십시오.
    이번 설명에서는 127.0.1의 IP 주소로 서버 인증서를 작성합니다.
    openssl.exe
    # 秘密鍵とサーバ証明書を作成するコマンド
    OpenSSL> req -subj '/C=JP/ST=TestState/O=TestCompany/CN=127.0.0.1' \
     -x509 -nodes -days 3650 -newkey rsa:2048 \
     -keyout server-key.pem \
     -out server-cert.pem
    
    명령을 실행하면 openssl.exe가 있는 폴더에 개인 키 (서버-key.pem) 와 서버 인증서 (서버-cert.pem) 파일을 만들었는지 확인하십시오.

    Mac


    터미널에서 다음 명령을 실행하여 개인 키 및 서버 인증서를 만듭니다.
    -subj 옵션의 CN=값은 서버의 IP 주소를 지정합니다.실제 테스트 환경에 따라 값을 다시 쓰십시오.
    이번 설명에서는 127.0.1의 IP 주소로 서버 인증서를 작성합니다.
    단말
    $ openssl req -subj '/C=JP/ST=TestState/O=TestCompany/CN=127.0.0.1' \
     -x509 -nodes -days 3650 -newkey rsa:2048 \
     -keyout ~/server-key.pem \
     -out ~/server-cert.pem
    
    명령을 실행한 후, 메인 폴더에 개인 키 (서버-key.pem) 와 서버 인증서 (서버-cert.pem) 파일을 만들었는지 확인하십시오.

    서버 프로그램 만들기


    Windows

  • 모든 작업 폴더를 만듭니다.
  • 방금 만든 개인 키 (서버-key.pem) 와 서버 인증서 (서버-cert.pem) 파일을 작업 폴더로 이동합니다.
  • 작업 폴더에test-server가 있습니다.js라는 파일을 만듭니다.(파일 이름은 임의)
  • 로 제작된test-server.수첩 등으로 js 파일을 열고 후술서버 프로그램의 내용을 복사하여 붙여넣습니다.
  • Mac


    작업 폴더를 만듭니다.(폴더 이름은 임의)
    단말
    $ mkdir ~/test-server
    
    방금 만든 개인 키 (서버-key.pem) 와 서버 인증서 (서버-cert.pem) 파일을 작업 폴더로 이동합니다.
    단말
    $ mv ~/server-key.pem ~/test-server/
    $ mv ~/server-cert.pem ~/test-server/
    
    test-server.js 파일을 만들고 뒷부분서버 프로그램의 내용을 복사하고 붙여넣습니다.(파일 이름은 임의)
    단말
    $ vi ~/test-server/test-server.js
    
    vi 명령으로 파일 편집 화면을 표시한 후 서버 프로그램 내용의 복사와 붙여넣기 → esc 키 → :wq 를 입력하면 파일을 저장하고 끝냅니다.

    서버 프로그램


    다음 프로그램에서 지정한 서버 포트 번호와 IP 주소 값을 실제 테스트 환경에 따라 다시 작성하십시오.
    이번 설명에서는 포트 번호는 8443, IP 주소는 127.0.0.1을 사용합니다.
    test-server.js
    const https = require('https')
    const fs = require('fs')
    const port = 8443        // サーバのポート番号を指定
    const host = '127.0.0.1' // サーバのIPアドレスを指定
    
    const options = {
      key: fs.readFileSync('server-key.pem'),   // 秘密鍵のファイルを指定
      cert: fs.readFileSync('server-cert.pem'), // サーバ証明書のファイルを指定
      maxVersion: 'TLSv1.3',
      minVersion: 'TLSv1.3',
    }
    
    // サーバインスタンス作成
    const server = https.createServer(options)
    
    // リクエストイベントリスナー
    server.on('request', (req, res) => {
      // テスト用のリクエストログを適宜出力
      console.log('**********************')
      console.log('*   Client Request   *')
      console.log('**********************')
      console.log('HTTP Method:', req.method)
      console.log('Request URL:', req.url)
      console.log('HTTP Version:', req.httpVersion)
      console.log('HTTP Header:', req.headers)
      req.on('data', (chunk) => {
        console.log('HTTP Body:', chunk.toString('utf8'))
      })
      // レスポンス送信
      res.setHeader('Content-Type', 'text/plain; charset=utf-8')
      res.writeHead(200)
      res.write('Hello World!\n')
      res.end()
    })
    
    // サーバ起動
    server.listen(port, host, () => {
      console.log(`Starts the server at https://${host}:${port}/`)
    })
    

    서버 시작


    Windows


    Windows 메뉴 Node에서jscommandprompt를 시작하고 작업 폴더로 이동합니다.
    (Windows PowerShell 및 명령 프롬프트도 동일하게 수행할 수 있음)
    Node.js_command_prompt
    # 作業フォルダへ移動するコマンド
    > cd 作業フォルダのパス
    
    node 명령으로 서버 프로그램을 실행합니다.
    Node.js_command_prompt
    # サーバプログラムを実行するコマンド
    > node test-server.js
    Starts the server at https://127.0.0.1:8443/
    

    Mac


    터미널에서 작업 폴더로 이동하여 node 명령으로 서버 프로그램을 실행합니다.
    단말
    $ cd ~/test-server/
    $ node test-server.js
    Starts the server at https://127.0.0.1:8443/
    

    연결 확인


    TLSv1.3에서 사용할 수 있는 브라우저에서 https://서버의 IP 주소: 포트 번호/에 접근합니다.
    인증서 서명으로 인한 오류를 무시하고 계속 접근하십시오.
    액세스가 성공하면 브라우저에 "Hello World!"가 표시됩니다.서버를 시작하는 명령 프롬프트나 터미널 화면에서 요청 로그를 출력합니다.
    Node.js_command_prompt
    # WindowsのFirefoxでアクセスした場合のログ出力例
    **********************
    *   Client Request   *
    **********************
    HTTP Method: GET
    Request URL: /
    HTTP Version: 1.1
    HTTP Header: {
      host: '127.0.0.1:8443',
      'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:66.0) Gecko/20100101 Firefox/66.0',
      accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'accept-language': 'ja,en-US;q=0.7,en;q=0.3',
      'accept-encoding': 'gzip, deflate, br',
      dnt: '1',
      connection: 'keep-alive',
      'upgrade-insecure-requests': '1'
    }
    
    브라우저 개발 도구를 연 상태에서 액세스하면 TLSv1.3의 프로토콜 버전으로 연결되어 있는지 확인할 수 있습니다.

    서버를 중지하려면 시작 서버의 명령 프롬프트나 터미널 화면에서 Ctrl+C를 누릅니다.
    서버 구축이 완료되었습니다.

    후기


    아파치나nginx에서 HTTPS 서버를 만들 때 익숙하지 않으면 설정 파일을 만드는 데 시간이 걸릴 수 있습니다.
    상세한 로그와 사용자 정의가 필요 없고 테스트 서버를 먼저 준비하고 싶을 때, Node.js가 편리한 선택 중 하나가 되지 않을까요?

    웹 페이지 정보


    본 서버를 구축할 때 아래 사이트의 보도를 특별히 참고하였다.
    감사합니다.
  • HTTP | Node.js v12.2.0 Documentation
  • HTTPS | Node.js v12.2.0 Documentation
  • TLS (SSL) | Node.js v12.2.0 Documentation
  • 이해하려는 SSL/TLS라도 조금만 더 이해하면 재밌는 이야기·건자의 저택
  • TLS1.3에서 사용·사용할 수 없는 암호 알고리즘 - Qiita
  • openssl 명령을 사용하여 인증서 만들기 - Qiita
  • Mac에는 Windows 같은 프로그램의 마운트 해제 기능이 없기 때문에 공식 패키지로 설치하면 테스트 서버로 사용할 수 있습니다.js를 깨끗이 제거하는 것은 좀 번거롭다. 

    좋은 웹페이지 즐겨찾기