Ubuntu 에서 apache2 설치하기

Table of contents

  1. OpenSSL 설치하기
  2. Private Key(*.key) 생성하기 (openssl genrsa)
  3. CSR(Certificate Sinning Request) 인증요청서(*.csr) 생성하기 (openssl req)
  4. 자체서명 인증서(*.crt) 생성 (openssl x509)
  5. 인증서 확인하기 (openssl x509)
  6. Apache2 SSL 적용하기
  7. VirtualHost 설정하기
  8. SSL 적용 확인하기 (openssl s_client)

Ubuntu 에서는 apache2 에서의 SSL 적용 방법에 대해 정리해 본다.

OpenSSL 설치하기

apt install 을 이용하여 openssl 을 설치한다.

root@user1-500R5K-501R5K-500R5Q:~# sudo apt install openssl
Reading package lists... Done
Building dependency tree       
Reading state information... Done
openssl is already the newest version (1.1.1f-1ubuntu2.20).
openssl set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 20 not upgraded.
root@user1-500R5K-501R5K-500R5Q:~# 

Private Key(*.key) 생성하기 (openssl genrsa)

openssl 커맨드로 아래와 같이 개인키를 생성한다. Enter pass phrase for server.key: 부분에 개인키 암호를 입력하면 -out 에 입력한 key 파일이 생성됨을 확인할 수 있다.

root@user1-500R5K-501R5K-500R5Q:~/ssltest# openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.......................................................................................+++++
..................................+++++
e is 65537 (0x010001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
root@user1-500R5K-501R5K-500R5Q:~/ssltest# 
root@user1-500R5K-501R5K-500R5Q:~/ssltest# ls
server.key
root@user1-500R5K-501R5K-500R5Q:~/ssltest# cat server.key 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,FCD3A5456ED72869

PN0jOfBzKKzBwRkltcVfVGLSkoMYQgCMGqqWo+3RcUjvWD1EA50eugB3G53hxQDl
xgtYdJ8dzQ+QznQF/08rZk5e+hlixqaC/IFu955tINbSqriMUW4+6qKnzB6pviJz
xK7LUVyLpbbD6kE75dCt9f0GtVt0byR9CA1IfUD8K2vmDlv8j4aIsb2hKAG74RR3
MROmleiRPIP89Rbc2qTI9sM6Rmhs3DEnXeA/EOunTyEWPi4ectr+gadyxM0D2yMN
CsipfwCLNVIVWcYmHCMZwXM5Z0MmmDduHpvBuMYHkDyJK6F6Vu8WuUiIvT+01GT6
mq9BGfCvUoTCuql7ZuaJui6rtOiUAE/Vo9ouzLsKYSL++zLxYiv1b7iLyuxm2HMf
0z+im5WP60WMDyzxNEB4UMoiW+V+iPLA4jyGB/uH9bxUZmh7ndMra2at3RopU0zk
mVNlmCFDRDKeDwql200ahxWI/ioqTiA0Go08SeivwTSZFNUtUpSdy9wyDha+VrZI
qx8QZBD+K+d/62LLr7Uqgh6T0mlchTIX8W/TpCdDNPDN9u6VRd+3FUGE5FHp9sfD
053oTVsp6lQwOHm447I+d02g895U4sIHG4DGxC7oPmYy/QdQDLw8RzO93BY51pzQ
DpnlMjsSvf6FPrcb3UlE4xYFBa6xRHnCNpa1rW/2ZlT6sgNzuwzCMBN7I6bZfJ/2
HdPOSITuhv25oYgUvcEIJ7p1q6N1ZPNdv8lO56r4rBBYxiYDSt22U9FdT3BpzsPA
uUPWTgoW5pFAsIZIuNAHZ28391AHTpr4L1IrEQUOo9CSAan4TMfZzHeq5kcYh3LG
MTv1VyV10MAQAgBJnyEQaMvLXy+djjN6RpXCmdi1xj/guSnsmVhU/yavG8X/ubt7
WLyUEGgfpcnyzJdS38/rldu472A3iMbOzGVpnmgadB7bL6hBmcce9cI1JrpQ4LCh
KqVz2FlV3QWFx7Rd6TT9XrvXm4iSOMXy+njid1I4N6LYOprB6VXP0Y/XEt4sZWg9
VVYdYpZvFSBOsQjwYugP+mT8gs2R1InrAUhR3RpoI5FtM/RI7JVBodubQRjs0rUA
Al8R/z/sGuKMa/5p2KarASgSmwZ9Iiq6uldQrzwn35lFOCaEJIQmkyme9DFAxiFP
aq5KBdO76p+7fUC4s566utE4g7Oz3+mQ+kvzx7eI1lQKnCj0m+1cHW/BQmj8AdCm
B8V5xL+1+pLzyF/T6UFqLH1FU53OiFDGDaHTLJ6v9rWkY6OvIbnZNChD7mu4Ow1d
ng98Q4RxL+23vKYxVhDsOiIu+6it3Pol/8imGQO8Qc8f64MD2QSC9HYQuJJ/BTkg
4Mqa1g7NeW1V8acfYiBpadSQxhAmh65bjQuJyX7vivMs9f928wEl8D8qdNsASEKI
2EKL5a2/lNlv0zkcfNZOF3RUsNrPjEx4kDi1WWnIjFUtwI95ZYFK3uaqgCs6IlGp
zzJEzUX8sjBCHZvFpdsuP4nfxFBQxwyiJ1mgbWXaJq73jUqwVefP1vndzzM9dFRY
6aYh+cEzcYD3RYaPFQnkJ0UQAl3fWzmOt1B4JA2wqpHDTL0l3oi8TA==
-----END RSA PRIVATE KEY-----

CSR(Certificate Sinning Request) 인증요청서(*.csr) 생성하기 (openssl req)

생성했던 개인키를 이용하여 CSR 인증서를 생성한다. Enter pass phrase for server.key: 에는 개인키 암호를 입력하고 그 외에는 적절한 값을 입력한다. -out 에 설정한 파일이 생성됨을 확인할 수 있다.

root@user1-500R5K-501R5K-500R5Q:~/ssltest# openssl req -new  -key server.key -out server.csr
Enter pass phrase for server.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]:test
Organizational Unit Name (eg, section) []:test
Common Name (e.g. server FQDN or YOUR name) []:test
Email Address []:test@test.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
root@user1-500R5K-501R5K-500R5Q:~/ssltest# ls
server.csr  server.key
root@user1-500R5K-501R5K-500R5Q:~/ssltest# cat server.csr 
-----BEGIN CERTIFICATE REQUEST-----
MIICvTCCAaUCAQAweDELMAkGA1UEBhMCa3IxDjAMBgNVBAgMBXNlb3VsMQ4wDAYD
VQQHDAVzZW91bDENMAsGA1UECgwEdGVzdDENMAsGA1UECwwEdGVzdDENMAsGA1UE
AwwEdGVzdDEcMBoGCSqGSIb3DQEJARYNdGVzdEB0ZXN0LmNvbTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBALcKV1HVs6/7PBkaw+tEN2H6kMRLbqnleQo8
YQunSBeH2K50AGQRLDkQ8TFig4YmHjxwK0/o1OLD1nkkSKI4fGV4guU4mbpR9951
TJmAEmBLu7JCtOgUFla0pRO9fppJaLEs/n8PhqSjaOz1vrgFQEpsjVMe9uKxsKPA
Oh5dFVjwM06AmuRbqLn2k8udcgNOikZC+KfSpw7alzUWIgL2tFloK2O2crQ+rXP2
oWug71J38twdyJX2ifg8eTj96pvVzkGhLSjLqfD4ImJYsn3ySeIjUm4tKCXHYUZT
/iloGup7HbhlW4NR04goX/c3nchfTMX8T5Zgf1gmDPzeAidP27MCAwEAAaAAMA0G
CSqGSIb3DQEBCwUAA4IBAQB6IKef/29ePeKWjRypbF8QrrT7xtaUHhF+fkTCCtg1
jXqikT8GMqMK8+ZT7pqaYyl5UHfccQqJ/aY5jG/jkRq3kczl+LS2N/LfUZdrjGvL
6LQwnyIJ091EbG6oQ1Dhg58mBym9AEHMLQRrzKZpIEh8tfuWBpXXLMQ1G3t+Pdz2
LaHDtGlmIOCmrvC7u2xKvRj0CgA4ppaRIE9his4iLktyL9j3RT8k94dmg1ZZCf11
jJnG4BkZoavb3c5qRM8j0bfvLdt17ESCAS7/DiUvTUdgytSiJWOVyoGXMHWkyPxe
phdtUhVG6QnUCGcGsf3v+yOZXl0MIiQr4V9g86p4cGbA
-----END CERTIFICATE REQUEST-----

자체서명 인증서(*.crt) 생성 (openssl x509)

이전에 생성했던 개인키와 인증요청서를 이용하여 자체서명인증서를 생성한다.

root@user1-500R5K-501R5K-500R5Q:~/ssltest# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com
Getting Private key
Enter pass phrase for server.key:
root@user1-500R5K-501R5K-500R5Q:~/ssltest# ls
server.crt  server.csr  server.key
root@user1-500R5K-501R5K-500R5Q:~/ssltest# cat server.crt
-----BEGIN CERTIFICATE-----
MIIDdzCCAl8CFGm6Z/Eb6y1CHy7i/cqneSE/6iBnMA0GCSqGSIb3DQEBCwUAMHgx
CzAJBgNVBAYTAmtyMQ4wDAYDVQQIDAVzZW91bDEOMAwGA1UEBwwFc2VvdWwxDTAL
BgNVBAoMBHRlc3QxDTALBgNVBAsMBHRlc3QxDTALBgNVBAMMBHRlc3QxHDAaBgkq
hkiG9w0BCQEWDXRlc3RAdGVzdC5jb20wHhcNMjMxMjIyMTI1NjEzWhcNMjQxMjIx
MTI1NjEzWjB4MQswCQYDVQQGEwJrcjEOMAwGA1UECAwFc2VvdWwxDjAMBgNVBAcM
BXNlb3VsMQ0wCwYDVQQKDAR0ZXN0MQ0wCwYDVQQLDAR0ZXN0MQ0wCwYDVQQDDAR0
ZXN0MRwwGgYJKoZIhvcNAQkBFg10ZXN0QHRlc3QuY29tMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAtwpXUdWzr/s8GRrD60Q3YfqQxEtuqeV5CjxhC6dI
F4fYrnQAZBEsORDxMWKDhiYePHArT+jU4sPWeSRIojh8ZXiC5TiZulH33nVMmYAS
YEu7skK06BQWVrSlE71+mklosSz+fw+GpKNo7PW+uAVASmyNUx724rGwo8A6Hl0V
WPAzToCa5FuoufaTy51yA06KRkL4p9KnDtqXNRYiAva0WWgrY7ZytD6tc/aha6Dv
Unfy3B3IlfaJ+Dx5OP3qm9XOQaEtKMup8PgiYliyffJJ4iNSbi0oJcdhRlP+KWga
6nsduGVbg1HTiChf9zedyF9MxfxPlmB/WCYM/N4CJ0/bswIDAQABMA0GCSqGSIb3
DQEBCwUAA4IBAQCZnu4LE5cYyWTOCgQo3mShYyQIqoCK7O0kiZgQovgzF2F8cd/c
zHwJYxjiTkey84Mz6DXcZFCeyIs5XOJlYASAENmFB/e3LDRD1uKGFZofbmJPf5eN
1H4c/NrJaWV0RKtV7FrFp1Q1FxSdKgiS4ELWTNlLJrWOPfyh+8HVxChF8J7IgDS5
aIwJv8r4iRaSzCzcmqMfgnKcg2OWw46UwPDq5tYYJlAi1lNFQWFJRUsRoEHzMKwE
8Aek5ZH8/xGfpkN697u80C4LHmxMhdPhCzB8r/CJanPgsTUJ2GqIi0B1nPy6u+91
1zvLH//uOKLvG9msF9LXKKbrS14fswFC4wR9
-----END CERTIFICATE-----

인증서 확인하기 (openssl x509)

-text 옵션을 사용하며 인증서 상세 정보를 확인할 수 있다.

root@user1-500R5K-501R5K-500R5Q:~/ssltest# openssl x509 -in server.crt -text
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            69:ba:67:f1:1b:eb:2d:42:1f:2e:e2:fd:ca:a7:79:21:3f:ea:20:67
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com
        Validity
            Not Before: Dec 22 12:56:13 2023 GMT
            Not After : Dec 21 12:56:13 2024 GMT
        Subject: C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:b7:0a:57:51:d5:b3:af:fb:3c:19:1a:c3:eb:44:
                    37:61:fa:90:c4:4b:6e:a9:e5:79:0a:3c:61:0b:a7:
                    48:17:87:d8:ae:74:00:64:11:2c:39:10:f1:31:62:
                    83:86:26:1e:3c:70:2b:4f:e8:d4:e2:c3:d6:79:24:
                    48:a2:38:7c:65:78:82:e5:38:99:ba:51:f7:de:75:
                    4c:99:80:12:60:4b:bb:b2:42:b4:e8:14:16:56:b4:
                    a5:13:bd:7e:9a:49:68:b1:2c:fe:7f:0f:86:a4:a3:
                    68:ec:f5:be:b8:05:40:4a:6c:8d:53:1e:f6:e2:b1:
                    b0:a3:c0:3a:1e:5d:15:58:f0:33:4e:80:9a:e4:5b:
                    a8:b9:f6:93:cb:9d:72:03:4e:8a:46:42:f8:a7:d2:
                    a7:0e:da:97:35:16:22:02:f6:b4:59:68:2b:63:b6:
                    72:b4:3e:ad:73:f6:a1:6b:a0:ef:52:77:f2:dc:1d:
                    c8:95:f6:89:f8:3c:79:38:fd:ea:9b:d5:ce:41:a1:
                    2d:28:cb:a9:f0:f8:22:62:58:b2:7d:f2:49:e2:23:
                    52:6e:2d:28:25:c7:61:46:53:fe:29:68:1a:ea:7b:
                    1d:b8:65:5b:83:51:d3:88:28:5f:f7:37:9d:c8:5f:
                    4c:c5:fc:4f:96:60:7f:58:26:0c:fc:de:02:27:4f:
                    db:b3
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         99:9e:ee:0b:13:97:18:c9:64:ce:0a:04:28:de:64:a1:63:24:
         08:aa:80:8a:ec:ed:24:89:98:10:a2:f8:33:17:61:7c:71:df:
         dc:cc:7c:09:63:18:e2:4e:47:b2:f3:83:33:e8:35:dc:64:50:
         9e:c8:8b:39:5c:e2:65:60:04:80:10:d9:85:07:f7:b7:2c:34:
         43:d6:e2:86:15:9a:1f:6e:62:4f:7f:97:8d:d4:7e:1c:fc:da:
         c9:69:65:74:44:ab:55:ec:5a:c5:a7:54:35:17:14:9d:2a:08:
         92:e0:42:d6:4c:d9:4b:26:b5:8e:3d:fc:a1:fb:c1:d5:c4:28:
         45:f0:9e:c8:80:34:b9:68:8c:09:bf:ca:f8:89:16:92:cc:2c:
         dc:9a:a3:1f:82:72:9c:83:63:96:c3:8e:94:c0:f0:ea:e6:d6:
         18:26:50:22:d6:53:45:41:61:49:45:4b:11:a0:41:f3:30:ac:
         04:f0:07:a4:e5:91:fc:ff:11:9f:a6:43:7a:f7:bb:bc:d0:2e:
         0b:1e:6c:4c:85:d3:e1:0b:30:7c:af:f0:89:6a:73:e0:b1:35:
         09:d8:6a:88:8b:40:75:9c:fc:ba:bb:ef:75:d7:3b:cb:1f:ff:
         ee:38:a2:ef:1b:d9:ac:17:d2:d7:28:a6:eb:4b:5e:1f:b3:01:
         42:e3:04:7d
-----BEGIN CERTIFICATE-----
MIIDdzCCAl8CFGm6Z/Eb6y1CHy7i/cqneSE/6iBnMA0GCSqGSIb3DQEBCwUAMHgx
CzAJBgNVBAYTAmtyMQ4wDAYDVQQIDAVzZW91bDEOMAwGA1UEBwwFc2VvdWwxDTAL
BgNVBAoMBHRlc3QxDTALBgNVBAsMBHRlc3QxDTALBgNVBAMMBHRlc3QxHDAaBgkq
hkiG9w0BCQEWDXRlc3RAdGVzdC5jb20wHhcNMjMxMjIyMTI1NjEzWhcNMjQxMjIx
MTI1NjEzWjB4MQswCQYDVQQGEwJrcjEOMAwGA1UECAwFc2VvdWwxDjAMBgNVBAcM
BXNlb3VsMQ0wCwYDVQQKDAR0ZXN0MQ0wCwYDVQQLDAR0ZXN0MQ0wCwYDVQQDDAR0
ZXN0MRwwGgYJKoZIhvcNAQkBFg10ZXN0QHRlc3QuY29tMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAtwpXUdWzr/s8GRrD60Q3YfqQxEtuqeV5CjxhC6dI
F4fYrnQAZBEsORDxMWKDhiYePHArT+jU4sPWeSRIojh8ZXiC5TiZulH33nVMmYAS
YEu7skK06BQWVrSlE71+mklosSz+fw+GpKNo7PW+uAVASmyNUx724rGwo8A6Hl0V
WPAzToCa5FuoufaTy51yA06KRkL4p9KnDtqXNRYiAva0WWgrY7ZytD6tc/aha6Dv
Unfy3B3IlfaJ+Dx5OP3qm9XOQaEtKMup8PgiYliyffJJ4iNSbi0oJcdhRlP+KWga
6nsduGVbg1HTiChf9zedyF9MxfxPlmB/WCYM/N4CJ0/bswIDAQABMA0GCSqGSIb3
DQEBCwUAA4IBAQCZnu4LE5cYyWTOCgQo3mShYyQIqoCK7O0kiZgQovgzF2F8cd/c
zHwJYxjiTkey84Mz6DXcZFCeyIs5XOJlYASAENmFB/e3LDRD1uKGFZofbmJPf5eN
1H4c/NrJaWV0RKtV7FrFp1Q1FxSdKgiS4ELWTNlLJrWOPfyh+8HVxChF8J7IgDS5
aIwJv8r4iRaSzCzcmqMfgnKcg2OWw46UwPDq5tYYJlAi1lNFQWFJRUsRoEHzMKwE
8Aek5ZH8/xGfpkN697u80C4LHmxMhdPhCzB8r/CJanPgsTUJ2GqIi0B1nPy6u+91
1zvLH//uOKLvG9msF9LXKKbrS14fswFC4wR9
-----END CERTIFICATE-----
root@user1-500R5K-501R5K-500R5Q:~/ssltest# 

Apache2 SSL 적용하기

a2enmod ssl 명령어로 SSL 모듈을 enable 한다.

root@user1-500R5K-501R5K-500R5Q:~/ssltest# a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  systemctl restart apache2

SSL 을 위한 임의의 디렉토리를 생성하고 생성한 CA 인증서와 자체 서명인증서를 저장한다.

root@user1-500R5K-501R5K-500R5Q:~/ssltest# mkdir /etc/apache2/ssl
root@user1-500R5K-501R5K-500R5Q:~/ssltest# cp server* /etc/apache2/ssl/
root@user1-500R5K-501R5K-500R5Q:~/ssltest# 
root@user1-500R5K-501R5K-500R5Q:~/ssltest# ls -al /etc/apache2/ssl/
total 20
drwxr-xr-x 2 root root 4096 12월 22 22:09 .
drwxr-xr-x 9 root root 4096 12월 22 22:09 ..
-rw-r--r-- 1 root root 1261 12월 22 22:09 server.crt
-rw-r--r-- 1 root root 1025 12월 22 22:09 server.csr
-rw------- 1 root root 1743 12월 22 22:09 server.key

또한 소유권 및 권한 변경을 진행한다. 여기서는 root 를 기준으로 설정한다.

$ sudo chown -R root:root /etc/apache2/ssl
$ sudo chmod 700 /etc/apahce2/ssl
$ sudo chmod 600 /etc/apache2/ssl/*.*
root@user1-500R5K-501R5K-500R5Q:~/ssltest# chown -R root:root /etc/apache2/ssl/
root@user1-500R5K-501R5K-500R5Q:~/ssltest# ls -al /etc/apache2/ssl/
total 20
drwxr-xr-x 2 root root 4096 12월 22 22:09 .
drwxr-xr-x 9 root root 4096 12월 22 22:09 ..
-rw-r--r-- 1 root root 1261 12월 22 22:09 server.crt
-rw-r--r-- 1 root root 1025 12월 22 22:09 server.csr
-rw------- 1 root root 1743 12월 22 22:09 server.key
root@user1-500R5K-501R5K-500R5Q:~/ssltest# 
root@user1-500R5K-501R5K-500R5Q:~/ssltest# chmod 700 /etc/apache2/ssl
root@user1-500R5K-501R5K-500R5Q:~/ssltest# ls -al /etc/apache2/ssl/
total 20
drwx------ 2 root root 4096 12월 22 22:09 .
drwxr-xr-x 9 root root 4096 12월 22 22:09 ..
-rw-r--r-- 1 root root 1261 12월 22 22:09 server.crt
-rw-r--r-- 1 root root 1025 12월 22 22:09 server.csr
-rw------- 1 root root 1743 12월 22 22:09 server.key
root@user1-500R5K-501R5K-500R5Q:~/ssltest# ls -al /etc/apache2/
total 100
drwxr-xr-x   9 root root  4096 12월 22 22:09 .
drwxr-xr-x 150 root root 12288 12월 22 21:20 ..
-rw-r--r--   1 root root  7224 10월 26 22:54 apache2.conf
drwxr-xr-x   2 root root  4096 12월 22 21:20 conf-available
drwxr-xr-x   2 root root  4096 12월 22 21:20 conf-enabled
-rw-r--r--   1 root root  1782  2월 24  2021 envvars
-rw-r--r--   1 root root 31063  2월 24  2021 magic
drwxr-xr-x   2 root root 12288 12월 22 21:20 mods-available
drwxr-xr-x   2 root root  4096 12월 22 22:06 mods-enabled
-rw-r--r--   1 root root   320  2월 24  2021 ports.conf
drwxr-xr-x   2 root root  4096 12월 22 21:20 sites-available
drwxr-xr-x   2 root root  4096 12월 22 21:20 sites-enabled
drwx------   2 root root  4096 12월 22 22:09 ssl
root@user1-500R5K-501R5K-500R5Q:~/ssltest# 
root@user1-500R5K-501R5K-500R5Q:~/ssltest# chmod 600 /etc/apache2/ssl/*.*
root@user1-500R5K-501R5K-500R5Q:~/ssltest# ls -al /etc/apache2/ssl/
total 20
drwx------ 2 root root 4096 12월 22 22:09 .
drwxr-xr-x 9 root root 4096 12월 22 22:09 ..
-rw------- 1 root root 1261 12월 22 22:09 server.crt
-rw------- 1 root root 1025 12월 22 22:09 server.csr
-rw------- 1 root root 1743 12월 22 22:09 server.key
root@user1-500R5K-501R5K-500R5Q:~/ssltest# 
root@user1-500R5K-501R5K-500R5Q:~/ssltest# 

VirtualHost 설정하기

/etc/apache2/site-avaiale 디렉토리로 이동하여 default conf 파일을 복사하여 수정한다.

root@user1-500R5K-501R5K-500R5Q:~# cd /etc/apache2/sites-available/
root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# ls
000-default.conf  default-ssl.conf
root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# cp default-ssl.conf example-ssl.conf
root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# ls
000-default.conf  default-ssl.conf  example-ssl.conf

아래 3개 항목을 인증서 위치를 기준으로 수정한다.

root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# vim example-ssl.conf 


    SSLEngine on
    SSLCertificateFile      /etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /etc/apache2/ssl/server.key

설정 변경한 conf 파일을 enable 한다.

root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# ls
000-default.conf  default-ssl.conf  example-ssl.conf
root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# a2ensite example-ssl.conf 
Enabling site example-ssl.
To activate the new configuration, you need to run:
  systemctl reload apache2
root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# 

이후 apache 서비스를 restart 한다. 이 때 인증서 생성 시 설정했던 암호를 입력한다.

root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# service apache2 restart
Enter passphrase for SSL/TLS keys for 127.0.0.1:443 (RSA): ****                    
root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# service apache2 status
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabl>
     Active: active (running) since Fri 2023-12-22 22:21:03 KST; 8s ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 5762 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
   Main PID: 5773 (apache2)
      Tasks: 55 (limit: 9323)
     Memory: 5.8M
     CGroup: /system.slice/apache2.service
             ├─5773 /usr/sbin/apache2 -k start
             ├─5774 /usr/sbin/apache2 -k start
             └─5775 /usr/sbin/apache2 -k start

12월 22 22:20:55 user1-500R5K-501R5K-500R5Q systemd[1]: Starting The Apache HTTP Serve>
12월 22 22:20:55 user1-500R5K-501R5K-500R5Q apachectl[5765]: AH00558: apache2: Could n>
12월 22 22:21:03 user1-500R5K-501R5K-500R5Q systemd[1]: Started The Apache HTTP Server.
lines 1-16/16 (END)

SSL 적용 확인하기 (openssl s_client)

아래와 같이 명령어를 이용하여 생성했던 인증서 정보와 동일함을 확인할 수 있다. 확인 시 중요한 부분은 하단 부분의 Verify return code: 18 (self signed certificate) 임을 알 수 있다.

root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# openssl s_client -connect localhost:443
CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com
verify error:num=18:self signed certificate
verify return:1
depth=0 C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com
verify return:1
---
Certificate chain
 0 s:C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com
   i:C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDdzCCAl8CFGm6Z/Eb6y1CHy7i/cqneSE/6iBnMA0GCSqGSIb3DQEBCwUAMHgx
CzAJBgNVBAYTAmtyMQ4wDAYDVQQIDAVzZW91bDEOMAwGA1UEBwwFc2VvdWwxDTAL
BgNVBAoMBHRlc3QxDTALBgNVBAsMBHRlc3QxDTALBgNVBAMMBHRlc3QxHDAaBgkq
hkiG9w0BCQEWDXRlc3RAdGVzdC5jb20wHhcNMjMxMjIyMTI1NjEzWhcNMjQxMjIx
MTI1NjEzWjB4MQswCQYDVQQGEwJrcjEOMAwGA1UECAwFc2VvdWwxDjAMBgNVBAcM
BXNlb3VsMQ0wCwYDVQQKDAR0ZXN0MQ0wCwYDVQQLDAR0ZXN0MQ0wCwYDVQQDDAR0
ZXN0MRwwGgYJKoZIhvcNAQkBFg10ZXN0QHRlc3QuY29tMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAtwpXUdWzr/s8GRrD60Q3YfqQxEtuqeV5CjxhC6dI
F4fYrnQAZBEsORDxMWKDhiYePHArT+jU4sPWeSRIojh8ZXiC5TiZulH33nVMmYAS
YEu7skK06BQWVrSlE71+mklosSz+fw+GpKNo7PW+uAVASmyNUx724rGwo8A6Hl0V
WPAzToCa5FuoufaTy51yA06KRkL4p9KnDtqXNRYiAva0WWgrY7ZytD6tc/aha6Dv
Unfy3B3IlfaJ+Dx5OP3qm9XOQaEtKMup8PgiYliyffJJ4iNSbi0oJcdhRlP+KWga
6nsduGVbg1HTiChf9zedyF9MxfxPlmB/WCYM/N4CJ0/bswIDAQABMA0GCSqGSIb3
DQEBCwUAA4IBAQCZnu4LE5cYyWTOCgQo3mShYyQIqoCK7O0kiZgQovgzF2F8cd/c
zHwJYxjiTkey84Mz6DXcZFCeyIs5XOJlYASAENmFB/e3LDRD1uKGFZofbmJPf5eN
1H4c/NrJaWV0RKtV7FrFp1Q1FxSdKgiS4ELWTNlLJrWOPfyh+8HVxChF8J7IgDS5
aIwJv8r4iRaSzCzcmqMfgnKcg2OWw46UwPDq5tYYJlAi1lNFQWFJRUsRoEHzMKwE
8Aek5ZH8/xGfpkN697u80C4LHmxMhdPhCzB8r/CJanPgsTUJ2GqIi0B1nPy6u+91
1zvLH//uOKLvG9msF9LXKKbrS14fswFC4wR9
-----END CERTIFICATE-----
subject=C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com

issuer=C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.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 1447 bytes and written 363 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: 006CB978115911FC20746754CF1834E945E8CC7188970B5B7F16684A6226BAFC
    Session-ID-ctx: 
    Resumption PSK: 023BA699D9420D33CF65745A204A8A11036D73E49551F4A97A0E758D634E5E1F338EDF6FEF8DC506C62F51F2B2B8BDD6
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - a0 78 0e 9f a2 d0 01 71-65 3b 08 89 ef 0b bf c6   .x.....qe;......
    0010 - 38 7a a8 6a cd 26 24 20-57 0d d6 97 b8 fc 56 a0   8z.j.&$ W.....V.
    0020 - 01 a7 6a c3 4f e8 be d4-ee 0c c5 75 68 af 41 9d   ..j.O......uh.A.
    0030 - 9b 5d 9c f3 76 85 3b 3d-36 33 7e 1f af cc ff 0e   .]..v.;=63~.....
    0040 - 20 32 46 29 ea c8 57 19-cf 87 1a 26 7d cc 3c e6    2F)..W....&}.<.
    0050 - 45 8e 91 1a 06 f2 66 0e-65 31 ee 0d 1e b9 f7 11   E.....f.e1......
    0060 - 58 dc c8 0e a1 02 7c ec-5b 0d 00 08 6e 90 7d 28   X.....|.[...n.}(
    0070 - 9a 10 31 ae 11 17 20 02-b6 1d f8 2f f0 ec 72 00   ..1... ..../..r.
    0080 - 6f 91 cf 94 a4 09 bc 8e-18 7b 77 cf b1 33 97 54   o........{w..3.T
    0090 - b1 4f b7 b2 df 91 4c 61-62 95 07 3e 80 8b 0d 8e   .O....Lab..>....
    00a0 - 89 13 2a 6a e6 de 9e 99-87 29 c7 0f ea 41 2f ae   ..*j.....)...A/.
    00b0 - dc 51 85 82 68 eb 48 82-c2 29 a7 89 de 6f e1 95   .Q..h.H..)...o..
    00c0 - 44 e5 f4 5e 4b a5 c2 d7-5d d1 fe 94 3e ff d0 ed   D..^K...]...>...
    00d0 - c9 c3 f0 b3 24 93 db 41-78 af d8 e9 a5 ab df 2b   ....$..Ax......+

    Start Time: 1703251583
    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: 3662E9A94DD269C167C1BCCEDD33DF8F56ACB5A40F2E885220F9F83641D36C24
    Session-ID-ctx: 
    Resumption PSK: C2AC5E0067CF6E11DE2D45C40C7851D270F67AFAC82927603A801C4C746F2EEB471BB6F221CDAEBF260A57B7BCBFA816
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - a0 78 0e 9f a2 d0 01 71-65 3b 08 89 ef 0b bf c6   .x.....qe;......
    0010 - 45 23 2f e6 e9 d2 6a 81-e2 e7 a1 ce c9 00 29 0e   E#/...j.......).
    0020 - 71 a3 b5 e1 cb 32 d1 e6-69 46 54 74 64 21 e1 64   q....2..iFTtd!.d
    0030 - 14 a9 5a 62 0d 73 ca ac-ad 2a 29 7a 46 75 01 eb   ..Zb.s...*)zFu..
    0040 - 54 58 f4 51 79 a2 45 9c-db 4c de 4d 92 67 27 d7   TX.Qy.E..L.M.g'.
    0050 - ea 51 23 66 fd da ab d9-72 7c ed 84 f7 17 36 14   .Q#f....r|....6.
    0060 - 7e 9a 0c df ed a5 41 e8-5f df 28 63 7c 31 4a e0   ~.....A._.(c|1J.
    0070 - 20 a4 a7 b5 95 31 b7 14-7d ca e1 34 05 eb f4 97    ....1..}..4....
    0080 - ad b4 b5 63 7f 72 3a 96-b3 de a0 62 72 d5 3b a8   ...c.r:....br.;.
    0090 - 40 33 f2 a7 7e dd a1 94-30 db 6e e0 4d 98 67 5d   @3..~...0.n.M.g]
    00a0 - e6 23 3f 1a b6 67 b9 cc-d7 16 a2 1e 77 e0 fb b4   .#?..g......w...
    00b0 - 96 2a 00 df be 3f 56 9d-ff 24 57 b5 89 9e 43 76   .*...?V..$W...Cv
    00c0 - 06 e1 a7 00 2f 37 57 7d-c7 be dd 20 31 61 e6 4e   ..../7W}... 1a.N
    00d0 - 5c 22 7f d9 90 af f3 41-51 7d fc 52 53 41 19 2b   \".....AQ}.RSA.+

    Start Time: 1703251583
    Timeout   : 7200 (sec)
    Verify return code: 18 (self signed certificate)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK

또한 -dates 옵션으로 시작일, 만료일을 확인할 수 있다.

root@user1-500R5K-501R5K-500R5Q:/etc/apache2/sites-available# openssl s_client -connect localhost:443 | openssl x509 -noout -dates
Can't use SSL_get_servername
depth=0 C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com
verify error:num=18:self signed certificate
verify return:1
depth=0 C = kr, ST = seoul, L = seoul, O = test, OU = test, CN = test, emailAddress = test@test.com
verify return:1
notBefore=Dec 22 12:56:13 2023 GMT
notAfter=Dec 21 12:56:13 2024 GMT