수동 키 래핑을 위한 OpenSSL 구성

Cloud KMS로 키를 가져오려면 먼저 RSA-OAEP(OpenSSL 1.1에 기본적으로 포함되어 있음)와 패딩이 있는 AES 키 래핑(OpenSSL 1.1에 기본적으로 포함되어 있지 않음)을 모두 포함하는 PKCS#11 CKM_RSA_AES_KEY_WRAP 메커니즘을 사용하여 키를 래핑해야 합니다. 이 메커니즘은 OpenSSL에 포함되지 않습니다.

가져오기가 진행되는 동안 Google Cloud CLI를 사용하여 각 키를 자동으로 래핑하는 것이 좋습니다. 규정 준수 또는 규제 요구사항으로 인해 키를 수동으로 래핑해야 하는 경우 먼저 OpenSSL을 다시 컴파일하여 패딩으로 AES 키 래핑을 지원해야 합니다. OpenSSL을 다시 컴파일한 후 수동으로 키를 래핑할 수 있습니다.

시작하기 전에

이 주제의 절차에 따라 생성된 패치가 적용된 바이너리로 시스템의 기본 제공 OpenSSL 바이너리를 덮어쓰지 마세요. 예를 들어, 패치가 적용된 OpenSSL을 /usr에 직접 설치하지 마세요. 이 절차를 정확하게 따르면 패치가 적용된 OpenSSL이 $HOME/build에 내장되어 $HOME/local/bin에 설치됩니다.

${HOME}/local/bin이 이미 있는 경우 이 항목의 단계를 수행하기 전에 콘텐츠를 백업하거나 파일을 다른 위치로 옮기세요.

OpenSSL v1.1.0 패치 및 설치

OpenSSL을 사용하여 키를 Cloud KMS로 가져오기 전에 수동으로 래핑하는 경우 OpenSSL v1.1.0이 필요하며 다음 패치가 적용됩니다. OpenSSL을 컴파일하고 시스템의 기본 OpenSSL 설치와 다른 위치에 설치해야 합니다.

  1. https://www.openssl.org/source에서 OpenSSL 1.1.0l 버전의 소스를 다운로드합니다. 1.1.0 코드 행의 최신 출시 버전입니다. 이 절차에서 v1.1.1과 같은 그 이상 버전의 OpenSSL을 사용하지 마세요. 패치가 적용되지 않습니다.

  2. 다음 명령어를 사용하여 아카이브를 ${HOME}/build/openssl/에 추출합니다. 이 명령어는 OpenSSL 버전을 포함하는 기본 디렉터리를 재정의하며 자주 변경됩니다. /path/to/downloaded-openssl.tar.gz를 다운로드한 .tar.gz 아카이브의 경로로 바꿉니다.

    # Create the directory for the eventual OpenSSL binaries
    mkdir -p ${HOME}/local/ssl
    
    # Create the build directory
    mkdir -p ${HOME}/build/openssl
    
    # Extract the archive to ${HOME}/build/openssl
    tar xzvf /path/to/downloaded-openssl.tar.gz \
      -C ${HOME}/build/openssl/ \
      --strip-components 1
    
  3. 다음 명령어를 사용하여 압축을 푼 OpenSSL 소스에 커스텀 패치를 적용합니다. 패치는 EVP_CIPHER_CTX_FLAG_WRAP_ALLOW 플래그를 사용 설정합니다.

    cd ${HOME}/build
    cat <<-EOF | patch -d . -p0
    --- orig/openssl/apps/enc.c 2020-01-17 14:39:54.991708785 -0500
    +++ openssl/apps/enc.c  2020-01-17 14:41:33.215704269 -0500
    @@ -482,6 +482,7 @@
              */
    
             BIO_get_cipher_ctx(benc, &ctx);
    +   EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
    
             if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc)) {
                 BIO_printf(bio_err, "Error setting cipher %s\n",
    EOF
    

  4. 다음 명령어를 실행하여 패치가 적용된 소스에서 OpenSSL 바이너리 및 라이브러리를 빌드하고, 빌드의 유효성을 테스트하고, 바이너리 및 라이브러리를 ${HOME}/local 디렉터리에 설치합니다.

    CPUS=$(getconf _NPROCESSORS_ONLN)
    cd ${HOME}/build/openssl
    ./config --prefix=${HOME}/local --openssldir=${HOME}/local/ssl
    make -j${CPUS}
    make test
    make install
    

    --prefix 또는 --openssldir 플래그를 생략하거나 수정해서는 안됩니다. 시스템의 OpenSSL 설치를 덮어쓰지 않도록 합니다.

  5. 다음 명령어를 실행하여 새 OpenSSL 바이너리가 성공적으로 설치되었는지 확인합니다.

    test -x ${HOME}/local/bin/openssl || echo FAIL
    

    바이너리가 올바르게 설치되면 출력이 표시되지 않습니다. FAIL가 표시되면 이전에 실행한 make, make test, make install 명령어의 출력을 확인합니다.

  6. 패치가 적용된 OpenSSL 바이너리는 ${HOME}/local/ssl/lib/의 OpenSSL 라이브러리와 동적으로 연결되지만 ld 명령어는 기본적으로 이러한 라이브러리의 색인을 생성하지 않습니다. 다음 명령어를 실행하여 패치가 적용된 라이브러리를 ${LD_LIBRARY_PATH}에 추가하는 래퍼 스크립트를 생성한 다음 패치가 적용된 OpenSSL에 대해 CLI를 호출합니다.

    cat > ${HOME}/local/bin/openssl.sh <<-EOF
    #!/bin/bash
    env LD_LIBRARY_PATH=${HOME}/local/lib/ ${HOME}/local/bin/openssl "\$@"
    EOF
    chmod u+x ${HOME}/local/bin/openssl.sh
    

  7. 다음 명령어를 사용하여 스크립트가 시작하는 OpenSSL 버전이 방금 빌드하고 설치한 버전인지 확인합니다.

    ${HOME}/local/bin/openssl.sh version
    

이제 ${HOME}/local/bin/openssl.sh 래퍼 스크립트를 호출하면 수동으로 키를 래핑하여 가져오기할 수 있습니다.