🤷🏻‍♀️ 간략설명 - 요약

설치

sudo apt update
sudo apt-get install openssl

인증서 생성

    # 개인 키(mykey.key)와 공개 키가 포함된 인증서(mycert.crt) 생성
  sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
  sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem 

    # 혹은 -subj 추가해서 생성
  sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem -subj "/CN=myapp.com/O=myapp"

  # ex) 
  sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem -subj "/C=KR/ST=Seoul/L=Seoul/O={조직명}/OU={부서명}/CN={사이트주소}/emailAddress={이메일주소}"

-x509: 자체 서명된 인증서를 생성하라는 것을 명시합니다.
-nodes: 암호로 보호된 개인 키를 생성하지 않도록 합니다(No DES).
-days 365: 인증서가 유효할 일수를 설정합니다.
-newkey rsa:2048: 새로운 RSA 키를 생성하고 키의 크기를 2048 비트로 설정합니다.
-keyout: 생성된 개인 키를 저장할 파일의 이름을 지정합니다.
-out: 생성된 인증서를 저장할 파일의 이름을 지정합니다.
-subj: 인증서에 포함될 정보를 명시적으로 제공합니다. 여기서는 일반적으로 도메인 이름을 나타내는 CN(Common Name)과 조직을 나타내는 O(Organization)를 포함합니다.

여기서 각 약어는 다음과 같은 의미를 가진다.

C = Country Name
ST = State or Province Name
L = Locality Name (보통 도시 이름)
O = Organization Name
OU = Organizational Unit Name
CN = Common Name (FQDN - Fully Qualified Domain Name)
emailAddress = 이메일 주소

인증서 생성시 입력할 내용

  Country Name (2 letter code) [AU]:KR
  State or Province Name (full name) [Some-State]:Seoul
  Locality Name (eg, city) []:Seoul
  Organization Name (eg, company) [Internet Widgits Pty Ltd]:Seoul
  Organizational Unit Name (eg, section) []:Seoul
  Common Name (e.g. server FQDN or YOUR name) []:Seoul
  Email Address []:Seoul
  #설명
  Country Name (2 letter code): 국가 코드를 입력합니다. 예를 들어, 미국은 "US", 한국은 "KR"입니다.
  State or Province Name (full name): 주 또는 도 이름을 입력합니다.
  Locality Name (eg, city): 도시 이름을 입력합니다.
  Organization Name (eg, company): 조직 또는 회사의 이름을 입력합니다.
  Organizational Unit Name (eg, section): 조직의 부서나 섹션 이름을 입력합니다. 선택 사항이므로 엔터 키를 누르고 넘어갈 수 있습니다.
  Common Name (eg, fully qualified host name): 인증서를 사용할 도메인 이름이나 IP 주소를 입력합니다. 여기서는 도메인 없이 IP 주소만 사용하려고 하므로, 원하는 IP 주소를 입력합니다.
  Email Address: 이메일 주소를 입력합니다. 선택 사항이므로 엔터 키를 누르고 넘어갈 수 있습니다.

인증서 확인

```bash
openssl x509 -text -noout -in cert.crt # 혹은 cert.pem
openssl rsa -check -in key.key # 혹은 key.pem
```

nginx 설정

nginx 설정 파일 수정

  sudo apt install nginx
  sudo nano /etc/nginx/sites-available/default
  server {
      listen 443 ssl;
      ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
      ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
  }

Docker에서 -v 를 통한 인증서 사용

  docker run -d -p 443:443 -v /etc/ssl/certs/nginx-selfsigned.crt:/etc/ssl/certs/nginx-selfsigned.crt -v /etc/ssl/private/nginx-selfsigned.key:/etc/ssl/private/nginx-selfsigned.key nginx
  docker run -d -p 5001:5001 -v /path/to/cert.pem:/app/cert.pem -v /path/to/key.pem:/app/key.pem grpc-service

Example

  WORKDIR /app
  EXPOSE 5163
  EXPOSE 7101
  var certPath = "./etc/ssl/certs/server.crt";
  var keyPath = "./etc/ssl/private/server.key";

Answer

  docker run -d -p 5163:5163 -p 7101:7101 -v /path/to/cert.pem:/app/etc/ssl/certs/server.crt -v /path/to/key.pem:/app/etc/ssl/private/server.key grpc-service

🤷🏻‍♀️ 상세 설명

버전 확인

openssl version

사용법

openssl [command] [options]

명령어

  • genrsa : RSA 개인키 생성
  • req : 인증서 요청
  • x509 : 인증서 생성
  • pkcs12 : 인증서와 개인키를 하나의 파일로 생성
  • rsa : RSA 암호화
  • rsautl : RSA 암호화/복호화
  • rand : 난수 생성
  • enc : 대칭키 암호화/복호화
  • dgst : 해시값 생성
  • dhparam : DH 파라미터 생성
  • dh : DH 키 생성
  • dsaparam : DSA 파라미터 생성
  • dsaparam : DSA 키 생성
  • ecparam : EC 파라미터 생성
  • ec : EC 키 생성

명령어 옵션

  • -help : 도움말
  • -in : 입력 파일
  • -out : 출력 파일
  • -text : 인증서 내용 확인
  • -noout : 출력하지 않음
  • -pubout : 공개키 출력
  • -pubin : 공개키 입력
  • -passin : 비밀번호 입력
  • -passout : 비밀번호 출력
  • -des : DES 대칭키 암호화
  • -des3 : 3DES 대칭키 암호화
  • -aes128 : AES 128 대칭키 암호화
  • -aes192 : AES 192 대칭키 암호화
  • -aes256 : AES 256 대칭키 암호화
  • -md5 : MD5 해시값 생성
  • -sha1 : SHA1 해시값 생성
  • -sha256 : SHA256 해시값 생성
  • -sha512 : SHA512 해시값 생성
  • -engine : 암호화 엔진 지정
  • -paramfile : 파라미터 파일 지정
  • -param_enc : 파라미터 암호화 방식 지정
  • -param_out : 파라미터 출력 파일 지정
  • -param_in : 파라미터 입력 파일 지정
  • -C : 국가명
  • -ST : 주/도
  • -L : 시/군/구
  • -O : 회사명
  • -OU : 부서명
  • -CN : 도메인명
  • -emailAddress : 이메일 주소
  • -days : 인증서 유효기간
  • -newkey : 새로운 키 생성
  • -new : 새로운 인증서 생성
  • -key : 개인키 파일 지정
  • -keyform : 개인키 형식 지정
  • -keyout : 개인키 출력 파일 지정
  • -keyin : 개인키 입력 파일 지정
  • -CA : CA 인증서 파일 지정
  • -CAkey : CA 개인키 파일 지정
  • -CAcreateserial : 시리얼 파일 생성
  • -CAserial : 시리얼 파일 지정
  • -CAform : CA 인증서 형식 지정
  • -CAkeyform : CA 개인키 형식 지정
  • -CAkeyout : CA 개인키 출력 파일 지정
  • -CAkeyin : CA 개인키 입력 파일 지정
  • -CAserial : 시리얼 파일 지정
  • -CAcreateserial : 시리얼 파일 생성

명령어 예제

  • RSA 개인키 생성
openssl genrsa -out private.pem 2048
  • 인증서 요청
openssl req -new -key private.pem -out public.csr
  • 인증서 생성
openssl x509 -req -days 365 -in public.csr -signkey private.pem -out public.crt
  • 인증서와 개인키를 하나의 파일로 생성
openssl pkcs12 -export -clcerts -in public.crt -inkey private.pem -out public.pfx
  • RSA 암호화
openssl rsa -in private.pem -pubout -out public.pub
  • RSA 암호화/복호화
openssl rsautl -encrypt -inkey public.pub -pubin -in plain.txt -out cipher.txt
openssl rsautl -decrypt -inkey private.pem -in cipher.txt -out plain.txt
  • 대칭키 암호화/복호화
openssl enc -e -des3 -in plain.txt -out cipher.txt -pass pass:password
openssl enc -d -des3 -in cipher.txt -out plain.txt -pass pass:password
  • 해시값 생성
openssl dgst -md5 plain.txt
openssl dgst -sha1 plain.txt
openssl dgst -sha256 plain.txt
openssl dgst -sha512 plain.txt
  • DH 파라미터 생성
openssl dhparam -out dhparam.pem 2048
  • DH 키 생성
openssl dhparam -in dhparam.pem -text -noout
openssl dhparam -in dhparam.pem -check
  • DSA 파라미터 생성
openssl dsaparam -out dsaparam.pem 2048
  • DSA 키 생성
openssl dsaparam -in dsaparam.pem -text -noout
openssl dsaparam -in dsaparam.pem -check
  • EC 파라미터 생성
openssl ecparam -out ecparam.pem -name prime256v1
  • EC 키 생성
openssl ecparam -in ecparam.pem -text -noout
openssl ecparam -in ecparam.pem -check
  • 인증서 내용 확인
openssl x509 -in public.crt -text -noout
  • 인증서 유효기간 확인
openssl x509 -in public.crt -noout -dates
  • 인증서 유효성 확인
openssl verify -CAfile public.crt public.crt


Note: 만들고나니 내것이 아니었다.

Leave a comment