이 가이드에서는 Debian 11(Bullseye)의 TLS 서명에 Cloud HSM 키를 사용하도록 Apache 서버를 설정하는 방법을 설명합니다. OS 또는 Linux 배포판에서 사용하려면 명령어를 수정해야 할 수 있습니다.
이 튜토리얼의 Terraform 기반 청사진 버전은 kms-solutions GitHub 저장소에서 확인할 수 있습니다.
시작하기 전에
기본 요건으로 OpenSSL 설정에 설명된 구성을 완료합니다.
OpenSSL 설정이 완료되면 최신 버전의 Apache가 설치되어 있는지 확인합니다.
sudo apt-get update
sudo apt-get install apache2
구성
Cloud KMS 호스팅 서명 키 만들기
이전에 OpenSSL에 구성한 키링에서 Google Cloud 프로젝트에 Cloud KMS EC-P256-SHA256
서명 키를 만듭니다.
gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
--project "PROJECT_ID" --location "LOCATION" \
--purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
--protection-level "hsm"
OpenSSL로 자체 서명 인증서 만들기
Cloud KMS 호스팅 서명 키로 자체 서명 인증서를 생성합니다. OpenSSL을 사용하여 파일 경로 대신 PKCS #11 URI를 사용하고 해당 라벨로 키를 식별할 수 있습니다. Cloud KMS PKCS #11 라이브러리에서 키 라벨은 CryptoKey 이름입니다.
openssl req -new -x509 -days 3650 -subj '/CN=CERTIFICATE_NAME/' \
DIGEST_FLAG -engine pkcs11 -keyform engine \
-key PKCS_KEY_TYPE=KEY_IDENTIFIER > PATH_TO_CERTIFICATE
다음을 바꿉니다.
CERTIFICATE_NAME
: 인증서의 이름입니다.DIGEST_FLAG
: 비대칭 서명 키에 사용되는 다이제스트 알고리즘입니다. 키에 따라-sha256
,-sha384
,-sha512
를 사용합니다.PKCS_KEY_TYPE
: 키 식별에 사용되는 식별자 유형입니다. 최신 키 버전을 사용하려면 키 이름과 함께pkcs11:object
를 사용합니다. 특정 키 버전을 사용하려면 키 버전의 전체 리소스 ID와 함께pkcs11:id
를 사용합니다.KEY_IDENTIFIER
: 키의 식별자입니다.pkcs11:object
를 사용하는 경우 키 이름을 사용합니다(예:KEY_NAME
).pkcs11:id
를 사용하는 경우 키 또는 키 버전의 전체 리소스 ID를 사용합니다(예:projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
).PATH_TO_CERTIFICATE
: 인증서 파일을 저장하려는 경로입니다.
이 명령어가 실패하면 PKCS11_MODULE_PATH
가 잘못 설정되었거나 Cloud KMS 서명 키를 사용할 수 있는 올바른 권한이 없을 수 있습니다.
이제 다음과 같은 인증서가 준비되었습니다.
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Apache 서버 설정
/etc/apache2
에 자체 서명된 인증서를 저장할 디렉터리를 만듭니다.sudo mkdir /etc/apache2/ssl sudo mv ca.cert /etc/apache2/ssl
/etc/apache2/sites-available
에 있는000-default.conf
가상 호스트 구성 파일을 수정하여 인증서 파일 경로를 제공하고 SSLEngine이 사용 설정되어 있는지 확인합니다.다음은 포트 443에서 리슨하는 샘플 구성입니다.
<VirtualHost *:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl/ca.cert SSLCertificateKeyFile "PKCS_KEY_TYPE=KEY_IDENTIFIER" </VirtualHost>
원하는 텍스트 편집기를 사용해서
/etc/apache2/envvars
파일에 추가하여 Apache에서 환경 변수 내보내기가 올바르게 수행되는지 확인합니다.sudo
를 사용해서 파일을 수정해야 할 수 있습니다. 파일 끝에 다음 줄을 추가합니다.export PKCS11_MODULE_PATH="<var>PATH_TO_LIBKMSP11</var>" export KMS_PKCS11_CONFIG="<var>PATH_TO_PKCS11_CONFIG</var>" export GRPC_ENABLE_FORK_SUPPORT=1
다음을 바꿉니다.
PATH_TO_LIBKMSP11
:libkmsp11.so
의 경로입니다.PATH_TO_PKCS11_CONFIG
:pkcs11-config.yaml
의 경로입니다.
gRPC가 포크 지원을 포함하고 Cloud KMS PKCS #11 라이브러리를 Apache 서버의 일부로 올바르게 실행하도록 하려면
GRPC_ENABLE_FORK_SUPPORT
가 필요합니다.서비스 계정 키를 사용해서 인증하려면
GOOGLE_APPLICATION_CREDENTIALS
환경 변수의 값도 내보내야 합니다.
서버 실행
Apache SSL 모듈을 사용 설정하고, virtualhost 구성을 사용 설정하고, DocumentRoot 폴더에 테스트 웹페이지를 추가합니다.
sudo a2enmod ssl
sudo a2ensite 000-default.conf
echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' | \
sudo tee /var/www/html/index.html
Apache 서버를 다시 시작하고 curl
을 사용하여 구성이 예상대로 작동하는지 테스트합니다. 자체 서명 인증서 확인을 무시하려면 --insecure
플래그가 필요합니다.
sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1
오류가 발생하면 먼저 Apache 오류 로그를 확인하여 잘못된 점을 확인하는 것이 좋습니다. 인증 문제는 일반적인 오류의 원인입니다. PERMISSION_DENIED
오류가 표시되면 완전히 인증되었는지, 사용자 인증 정보 파일에 올바른 권한이 있는지 확인합니다. 완전히 인증되었는지 확인하려면 다음 명령어를 실행합니다.
gcloud auth application-default login
인증이 성공했는지 확인하려면 출력에 Credentials saved to file: [/path/to/credentials.json]
줄이 포함되어 있는지 확인합니다.