이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Docker

14. 개인 인증서를 사용해서 Notary Service 구동

이쿠우우 2020. 11. 8. 12:27
반응형

 

 

 

 

 

 

개인 인증서를 사용해서 Notary Service 구동

 

 


[Container image 인증 관련 글 목록]

Notary Service 란?

Docker Notary : Docker Content Trust (DCT)

DCT를 사용해서 Dcoker Hub에 서명된 Trust Image Push 하기

Notary와 DCT를 사용해서 Private Registry에 서명된 Trust Image Push하기

개인 인증서를 사용해서 Notary Service 구동

kubernetes image인증 - Portieris


 

 

Notary Service Download

 

[명령어]

(1) git clone https://github.com/theupdateframework/notary.git

(2) cd notary

 

[참고]

만약 이미 Notary 가 한번이라도 진행 됐었다면

docker rm 명령으로

기존에 동작하던 notary server, signer, mariaDB

3개의 container 를 종료 후 삭제하고

docker rmi 명령으로 

기존에 pull 받은 notary 관련 3개의 

notary server, signer, mariaDB

image파일도

삭제한 뒤 진행해야함

 

 

 


 

 

인증서 생성

 

GitHub에서 내려받은 Notary에는 기본 인증서가 포함되어 있지만 

보안 위협 및 원격 제어 이슈가 있으므로, 

OpenSSL을 통해 ROOT CA와 SSL 인증서를 만듬.

 

Root CA 생성

 

[CA가 사용할 RSA 키 생성]

명령어 : 

openssl genrsa -aes256 -out ./notary_rootca.key 2048

chmod 0600 ./notary_rootca.key

 

 

[CSR 생성을 위한 conf 명세]

notary_rootca.conf 파일 생성


[ req ]
default_bits                  = 2048
default_md                   = sha256
default_keyfile               = notary_rootca.key
distinguished_name        = req_distinguished_name
extensions                    = v3_ca
req_extensions               = v3_ca

  
[ v3_ca ]
basicConstraints              = critical, CA:TRUE, pathlen:0
subjectKeyIdentifier          = hash
keyUsage                      = keyCertSign, cRLSign
nsCertType                    = sslCA, emailCA, objCA
[req_distinguished_name ]
countryName                   = Country Name (2 letter code)
countryName_default           = KR
countryName_min               = 2
countryName_max               = 2
organizationName              = Organization Name
organizationName_default      = TEST
organizationalUnitName        = Unit Name
organizationalUnitName_default= IKSOON
  
commonName                    = Common Name (e.g. user or host name)
commonName_default            = Notary
commonName_max                = 64

 

 

[CSR 생성]

명령어: openssl req -new -key ./notary_rootca.key  -out ./notary_rootca.csr -config ./notary_rootca.conf

입력하는 항목에서는 모두 엔터로 넘어감.

 

[인증서 생성]

명령어 : openssl x509 -req -days 365 -extensions v3_ca -set_serial 1 -in ./notary_rootca.csr -signkey ./notary_rootca.key -out ./root-ca.crt -extfile ./notary_rootca.conf

 

 

[생성된 인증서 확인]

3개의 파일이 생성되어있음

crt, csr, key

 

명령어 : openssl x509 -text -in ./notary_rootca.crt

 

 

 

 

SSL 인증서 생성 (Notary Server) 

 

[RSA키 생성]

명령어 : openssl genrsa -aes256 -out ./notary-server-enc.key 2048

  • genrsa : RSA방식으로 개인기 생성
  • aes256bit : 개인키를 AES128 로 암호화

 

 

[RSA키에서 passphrase를 제거]

직전에 생성한 RSA 키는 passphrase와 함께 key-derived function을 통해 암호화되어 있음.

이 경우 https 서비스를 구동할 때마다 passphrase를 입력해야 하므로 복호화된 키를 산출함.

  • aes256bit로 암호화된 개인키를 다시 복호화함.
  • 원래 애초에 aes256bit 암호화를 안해도 되는데 이런 옵션이 있다는것을 써보기 위해 해봄

명령어 : openssl rsa -in ./notary-server-enc.key -out ./notary-server.key

 

 

 

[CSR 생성을 위한 conf 명세]

notary-server.conf 파일 생성

DNS.1 : 설정되는 IP는 해당 Notary 가 설치되고 있는 IP와 연동된 dn : notary-server를 넣어줌

-vi /etc/hosts 에 notary 가 설치될 ip 와 notarysigner 를 넣어줌

[ req ]
default_bits                       = 2048
default_md                         = sha256
default_keyfile                    = notary-server.key
distinguished_name                 = req_distinguished_name
extensions                         = v3_user


[ v3_user ]
basicConstraints                   = CA:FALSE
authorityKeyIdentifier             = keyid,issuer
subjectKeyIdentifier               = hash
keyUsage                           = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage                   = serverAuth,clientAuth
subjectAltName                     = @alt_names


[ alt_names]
DNS.1                              = notary-server


[req_distinguished_name ]
countryName                        = Country Name (2 letter code)
countryName_default                = KR
countryName_min                    = 2
countryName_max                    = 2
organizationName                   = Organization Name (eg, company)
organizationName_default           = TEST
  
organizationalUnitName             = Organizational Unit Name (eg, section)
organizationalUnitName_default     = IKSOON
  
commonName                         = Common Name (eg, your name or your server's hostname)
commonName_default                 = Notary
commonName_max                     = 64

 

 

[CSR 생성]

명령어: openssl req -new -key ./notary-server.key -out ./notary-server.csr -config ./notary-server.conf

입력하는 항목에서는 모두 엔터로 넘어감.

 

 

[인증서 생성]

명령어: openssl x509 -req -days 365 -extensions v3_user -in ./notary-server.csr -CA ./root-ca.crt -CAcreateserial -CAkey ./notary_rootca.key -out ./notary-server.crt -extfile ./notary-server.conf

 

 

[생성된 인증서 확인]

3개의 파일이 생성되어있음

crt, csr, enc-key, key

 

명령어 : openssl x509 -text -in ./notary-server.crt

 

 

 

 

SSL 인증서 생성 (Notary Signer) 

 

상위 Server 인증서 생성하는 과정과 동일함.

 

openssl genrsa -aes256 -out ./notary-signer-enc.key 2048

 

openssl rsa -in ./notary-signer-enc.key -out ./notary-signer.key

 

 

[CSR 생성을 위한 conf 명세]

notary-signer.conf 파일 생성

DNS.1 : 설정되는 IP는 해당 Notary 가 설치되고 있는 IP와 연동된 dn : notarysigner 를 넣어줌

-vi /etc/hosts 에 notary 가 설치될 ip 와 notarysigner 를 넣어줌

[ req ]
default_bits                       = 2048
default_md                         = sha256
default_keyfile                    = notary-signer.key
distinguished_name                 = req_distinguished_name
extensions                         = v3_user


[ v3_user ]
basicConstraints                   = CA:FALSE
authorityKeyIdentifier             = keyid,issuer
subjectKeyIdentifier               = hash
keyUsage                           = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage                   = serverAuth,clientAuth
subjectAltName                     = @alt_names


[ alt_names]
DNS.1                              = notarysigner


[req_distinguished_name ]
countryName                        = Country Name (2 letter code)
countryName_default                = KR
countryName_min                    = 2
countryName_max                    = 2
organizationName                   = Organization Name (eg, company)
organizationName_default           = TEST
  
organizationalUnitName             = Organizational Unit Name (eg, section)
organizationalUnitName_default     = IKSOON
  
commonName                         = Common Name (eg, your name or your server's hostname)
commonName_default                 = Notary
commonName_max                     = 64

 

openssl req -new -key ./notary-signer.key -out ./notary-signer.csr -config ./notary-signer.conf

 

openssl x509 -req -days 365 -extensions v3_user -in ./notary-signer.csr -CA ./root-ca.crt -CAcreateserial -CAkey ./notary_rootca.key -out ./notary-signer.crt -extfile ./notary-signer.conf

 

 

 

 


 

 

생성한 인증서를 기존 Notary 인증서와 교체

 

상위에서 생성한 

root-ca.key

notary-server.key

notary-server.crt

notary-signer.key

notary-signer.crt

 

5개의 키를 

~/notary/fixture 

directory 로 이동.

 

 

 


 

 

결과

 

인증서 교체를 완료하고

notary directory 에서

docker-compose up 

명령 실행 시 

 

생성한 인증서로 정상동작 확인

 

 

 

 

 

 

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

 

 

반응형