[Linux]자체 서명된 SSL 인증서를 가지고 https 아파치 웹 서버 구축하기

아래 사이트를 참고해서 CentOS 8 리눅스에 https를 지원하는 아파치 웹 서버를 구축해 보았습니다. SSL(Secure Socket Layer)을 사용하여 보안 웹서버를 구축하기 위해서는 웹 서버에 OpenSSL 패키지를 설치하고 개인키와 인증서 등을 생성하면 됩니다.
참고 사이트: How To Create a Self-Signed SSL Certificate for Apache on CentOS 8


  1. 설치된 httpd 및 OpenSSL 패키지의 버전 확인
    – openssl 패키지는 보통 디폴트로 설치되지만 아파치 웹서버(httpd)는 별도로 설치해야 합니다.(dnf -y install htttp)
    [root@centos8 ~]# httpd -version
    Server version: Apache/2.4.37 (CentOS Stream) Server built: Aug 17 2023 14:07:36
    [root@centos8 ~]# openssl version
    OpenSSL 1.1.1k FIPS 25 Mar 2021
    [root@centos8 ~]# systemctl enable --now httpd
  2. SSL 암호화를 지원하는 Apache 모듈(mod_ssl) 설치
    [root@centos8 ~]# dnf -y install mod_ssl
    [root@centos8 ~]# systemctl restart httpd
    
  3. SSL 인증서 생성
    – Apache가 암호화를 사용할 준비가 되었으므로 새 SSL 인증서 생성으로 넘어갈 수 있습니다.
    – 인증서는 사이트에 대한 일부 기본 정보를 저장하며 서버가 암호화된 데이터를 안전하게 처리할 수 있도록 하는 키 파일과 함께 제공됩니다.
    – 다음 명령을 사용하여 SSL 키와 인증서 파일을 생성할 수 있습니다(/etc/pki/tls/ 하위 디렉터리에 생성됨)
    [openssl 명령어의 옵션 설명]

    • req -x509
      X.509 인증서 서명 요청(CSR) 관리를 사용하도록 지정합니다. X.509는 키 및 인증서 관리를 위해 SSL 및 TLS가 준수하는 공개 키 인프라 표준입니다.
    • -nodes
      이는 OpenSSL에게 암호로 인증서를 보호하는 옵션을 건너뛰도록 지시합니다. 서버가 시작될 때 사용자 개입 없이 파일을 읽을 수 있으려면 Apache가 필요합니다. 암호를 사용하면 다시 시작할 때마다 암호를 입력해야 하므로 이런 일이 발생하는 것을 방지할 수 있습니다.
    • -days 365
      이 옵션은 인증서가 유효한 것으로 간주되는 기간을 설정합니다. 여기서는 1년으로 설정했습니다. 많은 최신 브라우저는 1년 이상 유효한 인증서를 거부합니다.
    • -newkey rsa:2048
      이는 새 인증서와 새 키를 동시에 생성하도록 지정합니다. 이전 단계에서 인증서 서명에 필요한 키를 생성하지 않았으므로 인증서와 함께 키를 생성해야 합니다. 이 rsa:2048부분은 2048비트 길이의 RSA 키를 만들라고 지시합니다.
    • -keyout
      이 줄은 OpenSSL에 생성 중인 생성된 개인 키 파일을 저장할 위치를 알려줍니다.
    • -out
      OpenSSL에 생성 중인 인증서를 배치할 위치를 알려줍니다.
    [root@centos8 ~]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/apache-selfsigned.key -out /etc/pki/tls/certs/apache-selfsigned.crt
    Generating a RSA private key .....+++++ ....................................+++++ writing new private key to '/etc/pki/tls/private/apache-selfsigned.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) [XX]:KR State or Province Name (full name) []:ProvinceName Locality Name (eg, city) [Default City]:CityName Organization Name (eg, company) [Default Company Ltd]:CompanyName Organizational Unit Name (eg, section) []:OrganizationName Common Name (eg, your name or your server's hostname) []:192.168.56.102
    Common Name : 서버에 액세스하는 데 사용할 호스트 이름이나 서버의 공용 IP를 입력해야 합니다. 이 필드는 사이트에 액세스하기 위해 브라우저의 주소 표시줄에 입력할 내용과 일치하는 것이 중요합니다. 불일치하면 더 많은 보안 오류가 발생할 수 있기 때문입니다.
    Email Address []:webmaster@company.com
    [root@centos8 ~]# find /etc/pki/tls/ -type f -name "apache-selfsigned*"
    /etc/pki/tls/certs/apache-selfsigned.crt /etc/pki/tls/private/apache-selfsigned.key
  4. SSL 접속을 위한 welcome Page 준비(DocumentRoot 지시자)
    [root@centos8 ~]# mkdir /vat/www/sslweb
    [root@centos8 ~]# echo "<h1>OpenSSL works.</h1>" >/var/www/sslweb/index.html
    
  5. SSL을 사용하도록 Apache 구성
    – 이제 자체 서명된 인증서와 키를 사용할 수 있으므로 이를 사용하려면 Apache 구성을 업데이트해야 합니다.
    [root@centos8 ~]# cd /etc/httpd/conf.d/
    [root@centos8 conf.d]# vi 192.168.56.102.conf
    <VirtualHost *:443> ServerName your_domain_or_ip DocumentRoot /var/www/sslweb SSLEngine on SSLCertificateFile /etc/pki/tls/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/pki/tls/private/apache-selfsigned.key </VirtualHost>
    [root@centos8 conf.d]# apachectl configtest
    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::a00:27ff:fe9b:9195. Set the 'ServerName' directive globally to suppress this message Syntax OK
    [root@centos8 conf.d]# systemctl reload httpd
  6. 웹 브라우저로 “https://192.168.56.102:443/” 접속 및 인증서 확인
    HPPTS welcome page 접속
    SSL 인증서 확인

  7. HTTP를 HTTPS로 리디렉션
    – HTTP로 접근해도(http://192.168.56.102/)로 접근해도 HTTPS로 리디렉션하도록 설정해 보겠습니다 .
    [root@centos8 conf.d]# vi 192.168.56.102.conf
    <VirtualHost *:443> ServerName 192.168.56.102 DocumentRoot /var/www/sslweb SSLEngine on SSLCertificateFile /etc/pki/tls/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/pki/tls/private/apache-selfsigned.key </VirtualHost> <VirtualHost *:80> ServerName 192.168.56.102 Redirect / https://192.168.56.102/ </VirtualHost>
  8. http://192.168.56.102로 접속해도 https://192.168.56.102로 리다이렉션되는 것을 확인할 수 있습니다.
  9. 호스트에서 지원하는 SSL/TLS 버전 확인
    openssl s_client -connect 호스트:443 [버전] 명령어로 확인
       호스트: 도메인명 또는 IP주소
       [버전]: -tls1, -tls1-1, -tls1-2
    [root@centos8 conf.d]# openssl s_client -connect 192.168.56.102:443
    CONNECTED(00000003) Can't use SSL_get_servername depth=0 C = KR, ST = ProvinceName, L = CityName, O = CompanyName, OU = OrganizationName, CN = 192.168.56.102, emailAddress = webmaster@company.com verify error:num=18:self signed certificate verify return:1 depth=0 C = KR, ST = ProvinceName, L = CityName, O = CompanyName, OU = OrganizationName, CN = 192.168.56.102, emailAddress = webmaster@company.com verify return:1 --- Certificate chain 0 s:C = KR, ST = ProvinceName, L = CityName, O = CompanyName, OU = OrganizationName, CN = 192.168.56.102, emailAddress = webmaster@company.com i:C = KR, ST = ProvinceName, L = CityName, O = CompanyName, OU = OrganizationName, CN = 192.168.56.102, emailAddress = webmaster@company.com --- Server certificate -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIUOTIhY02vrKeZkCqVsaPNxjGPCbkwDQYJKoZIhvcNAQEL BQAwgacxCzAJBgNVBAYTAktSMRUwEwYDVQQIDAxQcm92aW5jZU5hbWUxETAPBgNV BAcMCENpdHlOYW1lMRQwEgYDVQQKDAtDb21wYW55TmFtZTEZMBcGA1UECwwQT3Jn YW5pemF0aW9uTmFtZTEXMBUGA1UEAwwOMTkyLjE2OC41Ni4xMDIxJDAiBgkqhkiG 9w0BCQEWFXdlYm1hc3RlckBjb21wYW55LmNvbTAeFw0yMzExMjEyMzQ3MjhaFw0y NDExMjAyMzQ3MjhaMIGnMQswCQYDVQQGEwJLUjEVMBMGA1UECAwMUHJvdmluY2VO YW1lMREwDwYDVQQHDAhDaXR5TmFtZTEUMBIGA1UECgwLQ29tcGFueU5hbWUxGTAX BgNVBAsMEE9yZ2FuaXphdGlvbk5hbWUxFzAVBgNVBAMMDjE5Mi4xNjguNTYuMTAy MSQwIgYJKoZIhvcNAQkBFhV3ZWJtYXN0ZXJAY29tcGFueS5jb20wggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsZrTyNOLsRPHJTIqu0caNGySbKppc2m8B twdBAEygZ08J8oM+CcWgPth4JG6spbTIVTPHW6v2kF3u7iLJ3gZd04hNp2tobRFH CqqskcqtwqwRnNwZAlB2pP9dPSfHO3Te510ClpU2sk20wdXV0y4V35REa4kTko5e bnCBgG/wFIY/FAzG6NILxGGfK3yvJvI1HZfGv27lmgBJ5wbrs5deCJiK5svNTwQ+ WaINIy80OybHTr4FA/79nNNhrGRnUvwsMqfz3aQdL+mnzEWio2BaZb7L2Ut4jJwX tdJcXdnemVcIfp8yqVmCo11/10AcEPBQoDUqOHMBlBVs1NNjzv9TAgMBAAGjUzBR MB0GA1UdDgQWBBROKZMoDa03kHAysZRq4NZRADqi1jAfBgNVHSMEGDAWgBROKZMo Da03kHAysZRq4NZRADqi1jAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUA A4IBAQAFdpS85J2wqim6t/x/+OMdkmvJHeK3AC8fNK4OtX9XUHTJesNypvkGcFq7 nxb6IB7lrU320CE/maoNjqKgaKZ47S9vTtxwNPrHICCvWUkP7FfBLH8xsWvKBpem F6s5oHvsciLAyMmcnDmv5ucXVZUIUR3KsZcq6mW2I0LQCHROgLXU8ZMWjcz/dV8o cji4It4iwqDBTqyXIk031xNXtBxI2YIJmQoSIJMWoquYa1X5/3EfuyV1c6JNWYN4 BWIpvCVm+x8E/pRH2aPGBV3zO2iEzEM6fbeTZep32/Xs/LHaOIkMMRDIZe7dLkFS +2/IJipa+4Sd7P/W0W3X4tnS5cQT -----END CERTIFICATE----- subject=C = KR, ST = ProvinceName, L = CityName, O = CompanyName, OU = OrganizationName, CN = 192.168.56.102, emailAddress = webmaster@company.com issuer=C = KR, ST = ProvinceName, L = CityName, O = CompanyName, OU = OrganizationName, CN = 192.168.56.102, emailAddress = webmaster@company.com --- No client certificate CA names sent Peer signing digest: SHA256 Peer signature type: RSA-PSS Server Temp Key: X25519, 253 bits --- SSL handshake has read 1633 bytes and written 369 bytes Verification error: self signed certificate --- New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384 Server public key is 2048 bit Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated Early data was not sent Verify return code: 18 (self signed certificate) --- --- Post-Handshake New Session Ticket arrived: SSL-Session: Protocol : TLSv1.3 Cipher : TLS_AES_256_GCM_SHA384 Session-ID: 1C9FE0EA42EF2B3DB873B86DA510738B5ADD49232AC591560CA9F30F96CD926E Session-ID-ctx: Resumption PSK: 1D1C1B09E90AE96C385968B24E0C9F99BCE7B77150929CA53C130A985549262CAB2962FD2413503AC51086DA9BC86D7B PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: 0000 - 5e 38 5d 1c 2a 62 fa ae-ed 70 ee 62 25 db d9 cc ^8].*b...p.b%... 0010 - 28 bb eb 93 3e ff ac e6-63 c7 40 e9 48 f2 b2 84 (...>...c.@.H... 0020 - 8d f0 53 bc f2 c7 4b ab-68 e9 54 09 71 83 97 8b ..S...K.h.T.q... 0030 - ba f7 20 69 d4 ff ff 1e-54 8e 9a f2 a2 57 ed 6f .. i....T....W.o 0040 - 29 ad bb cd c3 d7 a5 67-c9 29 62 80 73 2e e1 4a )......g.)b.s..J 0050 - cc df 3b b5 d2 c6 33 8d-50 5d bf 72 c7 93 b2 0d ..;...3.P].r.... 0060 - 3e 4d 5f 94 5a aa d6 e3-a5 86 64 08 d6 c9 81 0f >M_.Z.....d..... 0070 - 99 d8 b6 1d a4 23 d7 9f-3b 26 50 6a 8a c7 04 98 .....#..;&Pj.... 0080 - 96 c6 76 d2 88 ff 0a 91-f9 a0 4b bd 19 1a c9 e4 ..v.......K..... 0090 - 34 60 6e ee 0a c1 ae 95-68 73 e1 7e f7 53 1d 44 4`n.....hs.~.S.D 00a0 - 76 33 bd 47 ca e2 77 01-d4 76 60 4a 67 b9 06 fe v3.G..w..v`Jg... 00b0 - f6 d8 2b 2a f2 38 49 89-84 c1 ea a0 38 0b 54 23 ..+*.8I.....8.T# 00c0 - a1 36 41 b9 9c 69 a2 d3-15 10 3f 73 c3 71 1d b4 .6A..i....?s.q.. 00d0 - 83 62 fb 44 1e e9 58 b6-12 60 2a 5f 4e 7b d3 d1 .b.D..X..`*_N{.. Start Time: 1700614053 Timeout : 7200 (sec) Verify return code: 18 (self signed certificate) Extended master secret: no Max Early Data: 0 --- read R BLOCK --- Post-Handshake New Session Ticket arrived: SSL-Session: Protocol : TLSv1.3 Cipher : TLS_AES_256_GCM_SHA384 Session-ID: 31D5213FF1AB70184404E3B0AB2BBA81D03646DBC0F08C31BDDC2B8FAA8E6582 Session-ID-ctx: Resumption PSK: E1A6A1AC00BF7E89452A3B8F90035890E4BC7418A9E4379682D75B0B2AE7CE81CDBA047280A82EF8FA77880C5EAE5E50 PSK identity: None PSK identity hint: None SRP username: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: 0000 - 5e 38 5d 1c 2a 62 fa ae-ed 70 ee 62 25 db d9 cc ^8].*b...p.b%... 0010 - 16 69 fc ac f8 a4 2b 48-4b 29 0c f9 4b ba 6b 22 .i....+HK)..K.k" 0020 - 06 38 dd 02 71 09 04 a8-3d 62 4f e6 a2 28 63 17 .8..q...=bO..(c. 0030 - de 7e f8 b9 04 e3 c4 ed-1e d0 1f d5 cd 01 72 3c .~............r< 0040 - df c4 3d e0 de 02 e1 3f-07 d7 4a 07 91 68 85 48 ..=....?..J..h.H 0050 - 18 21 18 44 1a 4e 35 38-2d 73 07 c6 7a 93 e0 c4 .!.D.N58-s..z... 0060 - 6a fc c8 b2 8f 8d 86 3b-89 78 c8 c1 79 49 41 37 j......;.x..yIA7 0070 - 71 1b b9 c7 48 ee 7a d1-ad 47 40 3f 65 a7 e5 47 q...H.z..G@?e..G 0080 - 9d 37 90 6f 3a de 95 e5-87 ec 7c 7a 16 b8 49 47 .7.o:.....|z..IG 0090 - fa 4b 19 81 2f 29 e9 c2-5c 79 77 52 dd 63 51 2c .K../)..\ywR.cQ, 00a0 - 92 07 39 46 cc 2f f1 cb-a8 c2 d8 9c 8d 0c 0f 88 ..9F./.......... 00b0 - cd 9f df 2f 91 0b 14 23-be 17 23 01 c9 09 16 48 .../...#..#....H 00c0 - 12 8e 5d bd ad b9 a9 ec-f5 82 0b ed 15 65 d0 ad ..]..........e.. 00d0 - c6 00 29 8f ec 8d da 1a-29 fd e3 52 e0 91 77 42 ..).....)..R..wB Start Time: 1700614053 Timeout : 7200 (sec) Verify return code: 18 (self signed certificate) Extended master secret: no Max Early Data: 0 --- read R BLOCK closed

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다