Self-Signed 인증서와 개인키 만들기

Self-Signed 인증서와 개인키 만들기

2021, Apr 27    

HTTPS 테스트를 위해 openssl로 자체서명된 인증서 및 개인키를 만들고 웹서버에 적용해본다.

duckdns.org와 같은 DDNS 서비스에서 도메인을 만들고 “letsencrypt”로 인증서를 받아서 사용하는 방법도 있으니 참고한다.

Self-Signed 인증서와 개인키 만들기

openssl로 인증서와 개인키를 한번에 생성하기 위해 “-subj” 옵션으로 발급자정보를 파라미터로 넘긴다.

-out cert.pem : 인증서
-keyout key.pem : 개인키
-nodes : PassPhrase 없이 생성
-days 3650 : 10년짜리
-subj : 발급자정보

$ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 3650 \
 -subj "/C=KR/ST=bundang/L=Seoul/O=butteryoon/OU=org/CN=butteryoon.duckdns.org" 

Generating a 4096 bit RSA private key
..................++
...................................................++
writing new private key to 'key.pem'
-----

Self-Signed 인증서 확인

만들어진 인증서(cert.pem)파일은 아래의 명령어로 확인해 보니 10년동안 유효한 인증서가 만들어졌다.

Not Before: Apr 27 13:54:26 2021 GMT
Not After : Apr 25 13:54:26 2031 GMT

[opc@instance-20210115-1556 .ssl]$ openssl x509 -text -noout -in cert.pem | more

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            ad:0c:18:67:ae:d8:c8:33
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=KR, ST=bundang, L=Seoul, O=butteryoon, OU=org, CN=butteryoon.duckdns.org
        Validity
            Not Before: Apr 27 13:54:26 2021 GMT
            Not After : Apr 25 13:54:26 2031 GMT
        Subject: C=KR, ST=bundang, L=Seoul, O=butteryoon, OU=org, CN=butteryoon.duckdns.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:d4:70:ec:e7:73:02:41:91:bf:e8:d1:03:55:12:
                    f4:4c:b2:6b:fe:34:7b:6e:48:7d:60:47:4d:eb:c9:

인증서 적용 테스트

인증서 적용 테스트를 위해 python3로 인증서가 적용된 웹서버를 띄워 본다.

[opc@instance-20210115-1556 www]$ python3
Python 3.6.8 (default, Nov 11 2020, 09:19:43)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44.0.3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from http.server import HTTPServer, SimpleHTTPRequestHandler
>>> import ssl
>>> httpd = HTTPServer(('', 5443), SimpleHTTPRequestHandler)
>>> httpd.socket = ssl.wrap_socket (httpd.socket, keyfile='/home/opc/.ssl/key.pem', certfile='/home/opc/.ssl/cert.pem', server_side=True)
>>> httpd.serve_forever()
106.240.249.74 - - [27/Apr/2021 23:40:17] "GET / HTTP/1.1" 200 -

curl https 연결 테스트

Self-Signed 인증서이기 때문에 “–insecure” 파라미터를 추가하고 “-v”로 진행과정을 보면 TLSv1.2 연결이 확인된다.

❯ curl --insecure https://butteryoon.duckdns.org:5443 -v

*   Trying 193.122.124.127:5443...
* TCP_NODELAY set
* Connected to butteryoon.duckdns.org (193.122.124.127) port 5443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: C=KR; ST=bundang; L=Seoul; O=butteryoon; OU=org; CN=butteryoon.duckdns.org
*  start date: Apr 27 13:54:26 2021 GMT
*  expire date: Apr 25 13:54:26 2031 GMT
*  issuer: C=KR; ST=bundang; L=Seoul; O=butteryoon; OU=org; CN=butteryoon.duckdns.org
*  SSL certificate verify result: self signed certificate (18), continuing anyway.

브라우저 경고

Self-Signed 인증서는 CA 인증을 받을 수 없기 때문에 브라우저에서는 아래와 같은 경고를 표시하고 사용자의 선택에 의해 접근할 수 있다.

Self-Signed Warning

인터넷 익스플로러에서는 인증서를 “신뢰할 수 있는 루트 인증 기관”으로 저장하면 경고 없이 테스트 가능하다.

Self-Signed Warning

참고