본문 바로가기

파이썬

파이썬 보아뱀 나홀로 사냥 7 - OpenSSL 인증서 & HTTPS 서버 구동

반응형

앞 사냥에서 설치한 Open SSL 프로그램을 이용한 인증서를 만들어 본다

 

Open SSL 설치가 필요하면 다음 스토리를 참조한다

 

파이썬 보아뱀 나홀로 사냥 6 - 윈도우즈에 Open SSL 설치

https를 위해 우선 윈도우즈10에 Open SSL을 설치한다. 파이썬과 직접 연관되는 부분은 아니다. Openssl 다운로드 https://sourceforge.net/projects/openssl/ 1) 위 링크로 들어가 PC OS 및 시스템 정보에 맞는 Z..

imaking.tistory.com

 

HTTPS 통신을 위해서는 Server에서 Client로 인증서를 내려주고, 그 인증서를 공인 CA 인증서로 확인 해야 한다.

공인 CA는 비용 지불이 필요하고, 내부 폐쇄망인 경우 외부망과의 연계가 필요하여 번거롭다.

따라서 공인 CA를 직접 만들어 써도 된다.

 

이 CA를 Self-Signed CA, 일종의 사설 인증서 인 것이다.

공인 인증서의 최상위 단계 CA를 Root CA라고 한다. 

Self-Signed CA는 인증서 자체가 최상위 단계 CA(rootCA)인것이다.

 

따라서 인증서는 3 단계로 구분되어 있다

  - 참조 (https://coffeewhale.com/kubernetes/authentication/x509/2020/05/02/auth01/)

 

1) 최상위 Root CA Certificate: 클라이언트와 서버 인증서를 발급하는 주체
  - rootCA.pem: root CA의 인증서
  - rootCA-key.pem: root CA의 키 (private key)

2) Server Certificate: 서버의 신원을 확인하는 인증서와 서버 자체 key
   - server.pem: 서버의 인증서
   - server-key.pem: 서버의 키

3) Client Certificate: 클라이언트의 신원을 확인하는 인증서와 클라이언트 자체 key
   - client.pem: 클라이언트의 인증서
   - client-key.pem: 클라이언트의 키

(모두 pem확장자일 필요는 없다)
PEM (Privacy Enhanced Mail)은  파일 구분 확장자(.pem)를 주로 사용한다.  개인키, 서버인증서, 루트인증서 및  SSL 발급 요청서(CSR) 등에 사용되는 가장 광범위하고 거의 99% 대부분 호환되는 산업 표준 포맷이다

 

인증서 저장용 폴더 생산

1. 우선 인증서 파일이 저장될 폴더를 만든다

  - openssl\bin 디렉토리 아래 'myTestCA'로 폴더 이름을 만들었다

  - 아무래도 앞 장에서 정의한 openssl/bin 패스 설정을 활용할 수 있을것 같아서다


 C:\OpenSSL\bin 디렉터리
2021-05-22  오전 09:15    <DIR>          .
2021-05-22  오전 09:15    <DIR>          ..
2021-05-21  오후 11:09             5,688 CA.pl
.....
2016-09-27  오후 12:24            64,866 fips_standalone_sha1.exe
2021-05-22  오전 09:15    <DIR>          myTestCa
2021-05-21  오후 11:09            10,835 openssl.cnf
2016-09-27  오후 05:54         4,058,465 openssl.exe
2021-05-21  오후 11:10             6,419 tsget

 

인증서 발급

인증서는 3단계로 만들어진다

 1) 서버 개인키 생성

 2) 인증요청서(CSR) 생성

 3) 서버 인증서 생성

 

서버 개인키 파일 생성

서버용 개인키는 앞 사냥5 SSL 개념 공부에서(https://imaking.tistory.com/9) 먼저 키값 교류용으로 비대칭 키 방식으로 암호화하는 RSA를 사용한다고 배웠다.

 

2-1. (비밀번호가 있는 방식) 비대칭 개인키 생성 

      비밀번호가 담긴 개인 키는 공인 인증서와 같이 암호가 필요할 경우 생성한다

 

   생성될 키 위치는 위에서 만든 폴더로 한다

   - openssl genrsa -aes256 -out ./myTestCA/private-ca.key 2048

      (openssl genrsa -암호화방식 -out 비밀키화일명 키길이)

 

   2048비트 사이즈의 AES128 암호화 방식으로  현재 폴더./myTestCA 폴더 아래 키를 생성하라는 의미이다.

    (주의) 비트 길이가 짧으면 암호화 보안성이 낮아지기 때문에 2048비트 이상의 비트 길이를 권한다.

            값을 명시하지 않으면 512비트가 디폴트이다

   

    (다른 가능 cmd 예) openssl genrsa -ㅇes3 -out private.pem 2048

 

   비밀번호를 두번 입력요구한다.   개인키 값임으로 잊어먹지 말고, 유출하지 말자. 

       - 테스트이니 기억하기 쉽게  년도 숫자 (헐~ 유출) 등을 입력하고 나중에 지워버리자

C:\OpenSSL\bin>openssl genrsa -aes256 -out ./myTestCA/private-ca.key 2048
Generating RSA private key, 2048 bit long modulus
.........++++++
.....++++++
unable to write 'random state'
e is 65537 (0x10001)
Enter pass phrase for ./myTestCA/private-ca.key:
Verifying - Enter pass phrase for ./myTestCA/private-ca.key:

정상수행된것을 확인한다.
 C:\OpenSSL\bin\myTestCa 디렉터리

2021-05-22  오전 09:59    <DIR>          .
2021-05-22  오전 09:59    <DIR>          ..
2021-05-22  오전 10:00               1,811 private-ca.key
               1개 파일                 1,811 바이트

최초의 나의 인증서를 직접 만들었다. 내가 인증기관이 된 셈이다.  (●'◡'●)

인증서가 어떻게 생겼을까?  호기심 발동으로 ca.key 화일을 메모장으로 열어본다.

 

개인키 종류는 RSA (비대칭키 방식)이고, 암호화는 AES-256(대칭킹) 방식 등이 명시되어 있고,  비밀 키값들이 있다.

모두 이해할 필요는 없는 것같다 

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B54................................
JDhC..................................
-----END RSA PRIVATE KEY-----

 

그러나, https용 ssl 인증서는 서비스 이용시마다 비밀번호를 입력하는 불편 때문에 비밀번호가 없는 private키를 만들어 주는 것이 좋다

 

2-2. (비밀번호가 없는 방식) 개인키 생성 

   생성될 키 위치는 위에서 만든 폴더로 한다

   - openssl genrsa  -out ./myTestCA/private-nops-ca.key 2048

      (genrsa  -out 비밀키파일명 2048)

C:\OpenSSL\bin>openssl genrsa  -out ./myTestCA/private-nops-ca.key 2048
Generating RSA private key, 2048 bit long modulus
.............+++
...........................................................+++
unable to write 'random state'
e is 65537 (0x10001)
C:\OpenSSL\bin>

성공적으로 키화일이 생성되었는지 확인한다
C:\OpenSSL\bin\myTestCA>dir
2021-05-23  오전 09:17    <DIR>          .
2021-05-23  오전 09:17    <DIR>          ..
2021-05-22  오후 12:34             1,098 private-ca.csr
2021-05-22  오후 12:03             1,811 private-ca.key
2021-05-23  오전 09:15             1,675 private-nops-ca.key          
3개 파일               8,271 바이트

 

(참고)

https://m.blog.naver.com/PostView.naver?blogId=tosemfaos&logNo=221508327481&proxyReferer=https:%2F%2Fwww.google.com%2F 

 

https://namjackson.tistory.com/24

 

 

(참고)   인증서 파일 형식 및 확장자 설명은  이 분이 잘 정리하신것 같습니다

https://www.letmecompile.com/certificate-file-format-extensions-comparison/


서버용 인증 요청서(CSR) 파일 생성

CSR(Certificate Signing Request)은  말 그대로 '인증서 서명 요청' 파일이다. 

 

SSL 인증의 정보를 암호화하여 상위 CA로 보내 공식적인 인증서를 받기 위한 신청서이다

요청 내용은 '키값(위에서 생성합 개인키)' 및 '인증서에 적용된 도메인 정보'가 포함된 인증서를 발급해주세요 라는 의미이며, 그 외 국가코드, 도시, 회사명, 부서명, 이메일 등의 정보가 들어간다.

 

3. CSR 파일 생성

   위에서 만든 비밀번호 없는 개인키를 활용하여 csr화일을 생성한다

  - openssl req -new -key private-nops-ca.key -out private-nops-ca.csr -config openssl.cnf

     (openssl req -new -key 비밀키화일명 -out CSR화일명)

(\OpenSSL\bin\ 폴더에서 수행할 때)

C:\OpenSSL\bin>openssl req -new -key myTestCA\private-nops-ca.key -out myTestCA/private-nops-ca.csr -config openssl.cnf
(앞 부분에 비밀번호 입력 부분이 없다)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
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]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

C:\OpenSSL\bin>dir myTestCA
2021-05-23  오전 09:55    <DIR>          .
2021-05-23  오전 09:55    <DIR>          ..
2021-05-22  오후 12:34             1,098 private-ca.csr
2021-05-22  오후 12:03             1,811 private-ca.key
2021-05-23  오전 09:55             1,001 private-nops-ca.csr
2021-05-23  오전 09:15             1,675 private-nops-ca.key
               4개 파일               9,272 바이트

 

  !! CSR 항목 입력 시 주의사항

  (https://www.comodossl.co.kr/certificate/ssl-installation-guides/Apache-csr-crt.aspx)

  • Common Name :  인증서를 설치할 도메인의 이름을 정확히 입력,  경로명/http://  등은 제외  => 여기서는 테스트용이어서 임의로 'localserver'로 입력
  • 특수 문자 제외
  • CSR 생성 후 서버에 생성된 Private Key를 삭제 분실할 경우 인증서를 발급받아도 설치가 안된다. 따라서 키를 백업받아 놓는게 좋다.
  • A challenge password 와 An optional company name 은 입력하지 않아도 됨다. 입력될 경우 잘못된 CSR 생성될 수 있다. 

 CSR 화일 확인

- myTestCA 폴더아래 화일이 생성되어 있고, 내용은 다음과 같이 확인할 수 있다

C:\OpenSSL\bin>openssl req -noout -text -in myTestCA/private-nops-ca.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=KR, ST=SEOUL, L=Seoul, O=Internet Widgits Pty Ltd, CN=localserver
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a5:a8:70:be:02:0c:08:70:ea:2f:aa:28:23:17:
                    ......
                    1c:53
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         16:4c:16:f1:4c:c6:57:b2:db:26:a0:a8:2e:f3:b2:17:e3:2d:
         ......
         af:a5:0d:bc
C:\OpenSSL\bin>

메모장으로 private-nops-ca.csr을 열어보면 아래처럼 키값만 보인다

-----BEGIN CERTIFICATE REQUEST-----
MIIC8TCCAdMCAQAwgYkxCzAJBgNVBAYTAktSMQ4wDAYDVQQIDAVTRU9VTDELMAkG
....
V6fPyieItfQCVmXu7oMdyzVrvK4f67EHtZ2gs4X/yMBa+UUJjA==
-----END CERTIFICATE REQUEST-----

 

CSR까지 생성하고, 인증서 CRT는 공인인증기관을 이용할 시는 , 이 화일의 첫 줄 -----BEGIN …부터 마지막 -----END …까지 복사하여 지정된 SSL 접수 페이지에 복사하여 붙여넣고 전송하면 된다

 

그러나, 개발용 Test용이어서 나만의 자체 사설 인증기관 CA를 만들고, CRT 인증서를 만들어야 한다.

 

 

자체 인증기관(CA)을 통한 인증서(CRT) 만들기

CSR까지 생성했다면, CRT는 그냥 만들수 있지만,

나는 나만의 사설 CA에서 인증까지 받은 인증서를 만들어보려고한다.

 

먼저 인증서의 서명을 해줄 최상위 인증기관이(rootCA) 내 서버(개발용 PC)에 만들어져야 한다

 

4. 최상위 rootCA.key 생성

  - openssl genrsa -aes256 -out myTestCA/rootCA.key 2048

    (openssl genrsa 암호화방식 -out 최상위키화일명 2048)

    (!! 여기에서는 AES로 대칭키 암호화 방식을 사용한다)

 

   비밀번호 입력 및 확인을 요구한다.  기억하자 (내가 가장 기억하고 싶은 장소 영문 2자와 연도로...)

C:\OpenSSL\bin>openssl genrsa -aes256 -out myTestCA/rootCA.key 2048
Generating RSA private key, 2048 bit long modulus
..........................................+++
.......................................+++
unable to write 'random state'
e is 65537 (0x10001)
Enter pass phrase for myTestCA/rootCA.key:
Verifying - Enter pass phrase for myTestCA/rootCA.key:

최상위 CA가 내 pc에 생성된 것을 확인한다
C:\OpenSSL\bin>dir myTestCA
2021-05-23  오전 10:41    <DIR>          .
2021-05-23  오전 10:41    <DIR>          ..
2021-05-22  오후 12:34             1,098 private-ca.csr
2021-05-22  오후 12:03             1,811 private-ca.key
2021-05-23  오전 09:55             1,001 private-nops-ca.csr
2021-05-23  오전 09:15             1,675 private-nops-ca.key
2021-05-23  오전 10:41             1,766 rootCA.key
               6개 파일               8,665 바이트

 

5. rootCA에 인증 신청용 CSR 생성

   위에서 만든 최상위 개인키를 활용하여 최상위 csr화일(rootCA.pem)을 생성한다

 - openssl req -x509 -new -nodes -key myTestCA/rootCA.key -days 365 -out myTestCA/rootCA.csr

   rootCA.key를 사용하여 1년 짜리 rootCA.pem을 생성했다.

    (임의로 국가,도시, 회사, 도메인,메일 등을 입력)

C:\OpenSSL\bin>openssl req -x509 -new -nodes -key myTestCA/rootCA.key -days 365 -out myTestCA/rootCA.csr

Enter pass phrase for myTestCA/rootCA.key:    # 위 4번에서 입력한 rootCA.key용 비밀번호
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
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]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

최상위 CA용 csr이 생성된 것을 확인한다
C:\OpenSSL\bin>dir myTestCA
2021-05-23  오전 11:25    <DIR>          .
2021-05-23  오전 11:25    <DIR>          ..
2021-05-22  오후 12:34             1,098 private-ca.csr
2021-05-22  오후 12:03             1,811 private-ca.key
2021-05-23  오전 09:55             1,001 private-nops-ca.csr
2021-05-23  오전 09:15             1,675 private-nops-ca.key
2021-05-23  오전 10:41             1,766 rootCA.key
2021-05-23  오전 11:25             1,318 rootCA.csr
               6개 파일               9,983 바이트

 

6.  웹서버에 HTTPS를 적용하기 위한 서버용 인증서(CRT) 생성

   위 2-2번에서 만든 비밀번호 없는 개인키 /  5번의 최상위 csr / rootCA 키의 인증을 받아 root-private.crt 화일명으로 1년짜리웹서버에 등록할 CA 인증서를 생성한다.

 - openssl x509 -req -in private-nops-ca.csr -CA rootCA.csr -CAkey rootCA.key -CAcreateserial -out server-private.crt -days 365

C:\OpenSSL\bin\myTestCA>openssl x509 -req -in private-nops-ca.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server-private.crt -days 365

Signature ok
subject=/C=KR/ST=SEOUL/L=Seoul/O=Internet Widgits Pty Ltd/CN=localserver
Getting CA Private Key
Enter pass phrase for rootCA.key: # 위 4번에서 입력한 rootCA.key용 비밀번호

("unable to write 'random state' " )이 문구가 나오면 cmd창을 관리자 권한으로 다시 실행해야 한다)

최상위 CA용 crt가 생성된 것을 확인한다
C:\OpenSSL\bin\myTestCA>dir
2021-05-23  오전 11:44    <DIR>          .
2021-05-23  오전 11:44    <DIR>          ..
2021-05-22  오후 12:34             1,098 private-ca.csr
2021-05-22  오후 12:03             1,811 private-ca.key
2021-05-23  오전 09:55             1,001 private-nops-ca.csr
2021-05-23  오전 09:15             1,675 private-nops-ca.key
2021-05-23  오전 11:44             1,200 server-private.crt
2021-05-23  오전 10:41             1,766 rootCA.key
2021-05-23  오전 11:25             1,318 rootCA.csr
2021-05-23  오전 11:44                17 rootCA.srl
               8개 파일              11,200 바이트

  (참고) .srl화일은 새로운 crt용으로 가능한 최신 시리얼 넘버를 맞춰주는 화일이다 

 

발급된 CRT를 더블 클릭하여 확인할수 있다

 

OpenSSL에서 인증서를 확인 해본다.

 >openssl x509 -text -in server-private.crt

C:\OpenSSL\bin\myTestCA>openssl x509 -text -in server-private.crt
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            bxxxxxxxxxxxxxxxxx
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=KR, ST=SEOUL, L=Seoul, O=Internet Widgits Pty Ltd, CN=localserver
        Validity
            Not Before: May 23 03:14:33 2021 GMT
            Not After : May 23 03:14:33 2022 GMT
        Subject: C=KR, ST=SEOUL, L=Seoul, O=Internet Widgits Pty Ltd
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a5:a8:70:be:02:0c:08:70:ea:2f:aa:28:23:17:
                    ....
                    1c:53
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         4c:18:d3:4f:f5:7f:6c:73:c2:83:fa:18:ee:76:1c:d8:ff:9a:
          ....
         2b:02:33:a0:ef:f0:fa:4f:ba:a7:75:60:4e:40:e3:cc:61:6c:
         1d:d0:ef:ea
-----BEGIN CERTIFICATE-----
MIIDSDCCAjACCQC3XhRDAu2GUDANBgkqhkiG9w0BAQsFADBmMQswCQYDVQQGEwJL
....
luLceLbtKwIzoO/w+k+6p3VgTkDjzGFsHdDv6g==
-----END CERTIFICATE-----

 

이제 SSL 인증서 관련 화일을 가지고  https를 시도해보자

 

django-sslserver 설치

7. 장고 가상환경 실행

앞장의 장고가 설치된 디렉토리로 이동하여 가상환경을 실행한다. 

 - C:\Users\..\Django\DjangoVirtu>mydjango\Scripts\activate

 

8. django-sslserver 설치

 - pip install django-sslserver

(mydjango) C:\Users\BonoFaber\Google 드라이브\DataAnal\Django\DjangoVirtu>pip install django-sslserver
Collecting django-sslserver
  Using cached django_sslserver-0.22-py3-none-any.whl (10 kB)
   .......
Successfully installed django-sslserver-0.22

 

9. django 환경 설정 변경

 - https를 적용할 장고 프로젝트의 settings.py 열고 'sslserver'를 추가 시켜준다.

 - 지난번 생성한 REST API 프로젝트에 https를 추가해본다

 

파이썬 보아뱀 나홀로 사냥 4 - REST API 구현

REST API란? REST(Representational State Transfer) 라는 용어는 Roy Fielding이라는 사람의 2000년 박사학위 논문에 소개되었다. 웹에서 어플리케이션간 정보를 주고받기 위한 클라이언트 - 서버간 통신 방식으.

imaking.tistory.com

 

- 디렉토리 C:\Users\..\Django\DjangoVirtu\REST_proj\REST_proj  들어가서 settings.py 화일을 에디터 화일로 열어서 앱 리스트에 'sslserver'를 추가한다

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',   # 추가
    'API_app',   # 추가
    'sslserver',   # https용 추가 
]

 

10. 인증서를 프로젝트내로 복사 설치

  위 6번에 OpenSSL로 생성한 https 서버용 인증서 .crt 파일과 2-2번에서 생성한 비밀번호없는 개인키 .key 파일을 웹서서버 프로젝트의 manage.py 파일이 있는 폴더로 복사한다

 C:\Users\..\Django\DjangoVirtu\REST_proj 디렉터리
2021-05-25  오전 12:34    <DIR>          .
2021-05-25  오전 12:34    <DIR>          ..
2021-05-19  오후 12:06    <DIR>          API_app
2021-05-20  오후 03:17           135,168 db.sqlite3
2021-05-19  오전 09:32               687 manage.py
2021-05-25  오전 12:23             1,675 private-nops-ca.key
2021-05-19  오전 10:30    <DIR>          REST_proj
2021-05-25  오전 12:32             1,111 server-private.crt
               4개 파일             138,641 바이트

  (추가 파악) 인증서는 설치후에 키체인관리에서 이 인증서 사용 시 항상 신뢰로 변경한다 - 방법을 몰라서 일단 무시하고 추후 다시 파악예정이다.

 

 

11. 인증서로 SSL서버를 실행

   -  (mydjango) C:\Users\..\DjangoVirtu\REST_proj>python manage.py runsslserver --certificate server-private2.crt --key private-nops-ca2.key

(mydjango) C:\Users\..l\Django\DjangoVirtu\REST_proj>python manage.py runsslserver --certificate server-private2.crt --key private-nops-ca2.key
Watching for file changes with StatReloader
Validating models...

System check identified no issues (0 silenced).
May 25, 2021 - 00:35:59
Django version 3.2.2, using settings 'REST_proj.settings'
Starting development server at https://127.0.0.1:8000/
Using SSL certificate: server-private2.crt
Using SSL key: private-nops-ca2.key
Quit the server with CTRL-BREAK.

https로 구동되는지 브라우저에서 확인하니,  '주의요함'이 표시된다, 아마도 사설 CA를 사용한 ㅇ이유인것 같다

 

 

 

윈도우즈 기반 Django에서 https 구현 방법이 구글에 제대로 정의되지 않아있었다

S터널링 방법 등  몇가지 시행착오를 거치면서 시간이 많이 걸렸다.

 

여기까지 한 나에게 대단한 선물을 주어야 한다.

 가까운데 여해이라도 다녀와야 하지만, 일단 근사한 디너를 대접한다. ╰(*°▽°*)╯

 

 

 

반응형