서버 인증서 (자체서명 인증서) 생성 (req -new -x509)

# 개인키 생성
$ openssl genrsa -des3 -out jongpak.key 2048
Generating RSA private key, 2048 bit long modulus
..+++
....................+++
e is 65537 (0x10001)
Enter pass phrase for jongpak.key:
Verifying - Enter pass phrase for jongpak.key:
  
# 인증서 생성
$ openssl req -new -x509 -sha256 -key jongpak.key -days 365 -out jongpak.crt
Enter pass phrase for jongpak.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) []:Gyeonggi-do
Locality Name (eg, city) [Default City]:Seongnam-si
Organization Name (eg, company) [Default Company Ltd]:Jongpak
Organizational Unit Name (eg, section) []:Security
Common Name (eg, your name or your server's hostname) []:jongpak.host
Email Address []:[email protected]
  
# 개인키 확인
$ cat jongpak.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,59600A8435B44104
 
MrhCwpXsQtsTYH1S9xEx6MraRgsAUzSEtYxXNulLduvkg41HtCJWV7r08afE3vbn
UAMf9rVuZqBKh8b0pOGsjTjUui//xWSEVEwyIo/x4dvGFDOf3HUv67ZLAjNRXUZu
yqx8S+9fkGRlRueW/OXB4nbK9OpCrhKEwboyQf8ScipPFmn0I4zV/IWLNZFN8cXu
8oIQQrWdoCBtQxQNCnaMcsCzNsWfbuNe0C/Errm4qcN6LfTpuPHnhrqiK7zhGb7V
sksxOKFm3EjpK/QHUgKrVEoPpyqc4+dVng2sCyTvn0Y0IkeJROR14ScSsruBJM6b
8PpnLQIVGShWLLNNOkt8Bc6IogUcFDrjcX0Rz5kfPavrX2D4dqbkR4bi+PgR06rj
uDVMZS+kIReMkMZ6GYytM8ie/XvFoBKZMq+e8OmYsmT9MDe2ZyRwz/iDq/z1F1uX
QQl8opA0B9blWhJD6nT/Ai1RO7Z5zTPaiGNUma/u2iMh8/xAFZgwrnT8ubND6tSF
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...
-----END RSA PRIVATE KEY-----
  
# 인증서 확인
$ cat jongpak.crt
-----BEGIN CERTIFICATE-----
MIIELTCCAxWgAwIBAgIJAOUWbWlqpLSGMA0GCSqGSIb3DQEBCwUAMIGsMQswCQYD
VQQGEwJLUjEUMBIGA1UECAwLR3llb25nZ2ktZG8xFDASBgNVBAcMC1Nlb25nbmFt
LXNpMRAwDgYDVQQKDAdKb25ncGFrMREwDwYDVQQLDAhTZWN1cml0eTEhMB8GA1UE
AwwYdGVzdC1qb25ncGFrLm5jbC5uZnJhLmlvMSkwJwYJKoZIhvcNAQkBFhpqb25n
aHVuLnBhcmtAbmF2ZXJjb3JwLmNvbTAeFw0xOTAzMTMxNDE0MThaFw0yMDAzMDMx
NDE0MThaMIGsMQswCQYDVQQGEwJLUjEUMBIGA1UECAwLR3llb25nZ2ktZG8xFDAS
BgNVBAcMC1Nlb25nbmFtLXNpMRAwDgYDVQQKDAdKb25ncGFrMREwDwYDVQQLDAhT
ZWN1cml0eTEhMB8GA1UEAwwYdGVzdC1qb25ncGFrLm5jbC5uZnJhLmlvMSkwJwYJ
KoZIhvcNAQkBFhpqb25naHVuLnBhcmtAbmF2ZXJjb3JwLmNvbTCCASIwDQYJKoZI
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...
JwFUhd1/sJhipHATlpD/mGI=
-----END CERTIFICATE-----

아파치 설정

최초 설정후에 restart 가 아닌 stop → start 를 해주어야함

[Wed Mar 13 23:34:41 2019] [error] Init: Unable to read pass phrase [Hint: key introduced or changed before restart?]
LoadModule ssl_module modules/mod_ssl.so
  
Listen 80
Listen 443
<VirtualHost *:443>
    ServerName jongpak.host
    ServerAlias jongpak.host
 
    SSLEngine on
    # 취약한 SSLv2, SSLv3 사용하지 않음 (<https://access.redhat.com/ko/solutions/1258903>)
    SSLProtocol all -SSLv2 -SSLv3
    # 서버가 더 선호하는 방식을 사용
    SSLHonorCipherOrder On
    # 안전하지 않은 협상 사용하지 않음
    SSLInsecureRenegotiation off
    SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
 
    # 인증서와 개인키
    SSLCertificateFile /home/jongpak/apps/apache/conf/jongpak.crt
    SSLCertificateKeyFile /home/jongpak/apps/apache/conf/jongpak.key
  
    # 아파치 실행시 인증서 암호 자동입력
    SSLPassPhraseDialog exec:/xxxx.sh
</VirtualHost>

인증서 발급 의뢰서(CSR) 작성 (req -new)

# 인증서 발급 요청서 작성
$ openssl req -new -key jongpak.key -out jongpak.csr
Enter pass phrase for jongpak.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) []:Gyeonggi-do
Locality Name (eg, city) [Default City]:Seongnam-si
Organization Name (eg, company) [Default Company Ltd]:Jongpak
Organizational Unit Name (eg, section) []:Security
Common Name (eg, your name or your server's hostname) []:jongpak.host
Email Address []:[email protected]
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
  
# CSR 확인
$ cat jongpak.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIC8jCCAdoCAQAwgawxCzAJBgNVBAYTAktSMRQwEgYDVQQIDAtHeWVvbmdnaS1k
bzEUMBIGA1UEBwwLU2VvbmduYW0tc2kxEDAOBgNVBAoMB0pvbmdwYWsxETAPBgNV
BAsMCFNlY3VyaXR5MSEwHwYDVQQDDBh0ZXN0LWpvbmdwYWsubmNsLm5mcmEuaW8x
KTAnBgkqhkiG9w0BCQEWGmpvbmdodW4ucGFya0BuYXZlcmNvcnAuY29tMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7wbvwDxroyze4Z3/hJUqoiinoQTp
sExxbQDPQGaEUlZdSsQsCy/3rrsyUrf5Y8VdO9NERQav68agEPc6rw/7X4qZ9q7y
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
MiO+05rfbzfstlxvutPEs+iXQyMrHsGLtKCXG8UL1UDaw0mOX/M=
-----END CERTIFICATE REQUEST-----

개인키/인증서/CSR 확인 (-text)

# 개인키
$ openssl rsa -text -in jongpak.key
Enter pass phrase for jongpak.key:
Private-Key: (2048 bit)
modulus:
    00:ef:06:ef:c0:3c:6b:a3:2c:de:e1:9d:ff:84:95:
    2a:a2:28:a7:a1:04:e9:b0:4c:71:6d:00:cf:40:66:
    84:52:56:5d:4a:c4:2c:0b:2f:f7:ae:bb:32:52:b7:
    f9:63:c5:5d:3b:d3:44:45:06:af:eb:c6:a0:10:f7:
    3a:af:0f:fb:5f:8a:99:f6:ae:f2:e9:92:d0:6d:bb:
    11:ef:94:50:bc:09:ba:3e:61:63:f3:66:42:f5:bb:
...
  
# 인증서
$ openssl x509 -text -in jongpak.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            e5:16:6d:69:6a:a4:b4:86
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=KR, ST=Gyeonggi-do, L=Seongnam-si, O=Jongpak, OU=Security, CN=test-jongpak.ncl.nfra.io/[email protected]
        Validity
            Not Before: Mar 13 14:14:18 2019 GMT
            Not After : Mar  3 14:14:18 2020 GMT
        Subject: C=KR, ST=Gyeonggi-do, L=Seongnam-si, O=Jongpak, OU=Security, CN=test-jongpak.ncl.nfra.io/[email protected]
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ef:06:ef:c0:3c:6b:a3:2c:de:e1:9d:ff:84:95:
                    2a:a2:28:a7:a1:04:e9:b0:4c:71:6d:00:cf:40:66:
                    84:52:56:5d:4a:c4:2c:0b:2f:f7:ae:bb:32:52:b7:
...
  
# CSR
$ openssl req -text -in jongpak.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=KR, ST=Gyeonggi-do, L=Seongnam-si, O=Jongpak, OU=Security, CN=test-jongpak.ncl.nfra.io/[email protected]
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ef:06:ef:c0:3c:6b:a3:2c:de:e1:9d:ff:84:95:
                    2a:a2:28:a7:a1:04:e9:b0:4c:71:6d:00:cf:40:66:
                    84:52:56:5d:4a:c4:2c:0b:2f:f7:ae:bb:32:52:b7:
                    f9:63:c5:5d:3b:d3:44:45:06:af:eb:c6:a0:10:f7:
                    3a:af:0f:fb:5f:8a:99:f6:ae:f2:e9:92:d0:6d:bb:
                    11:ef:94:50:bc:09:ba:3e:61:63:f3:66:42:f5:bb:
...

개인키/인증서의 쌍 확인 (-modulus)

$ openssl rsa -in jongpak.key -modulus -noout
Enter pass phrase for jongpak.key:
Modulus=EF06EFC03C6BA32CDEE19DFF84952AA228A7A104E9B04C716D00CF40668452565D4AC42C0B2FF7AEBB3252B7F963C55D3BD3444506AFEBC6A010F73AAF0FFB5F8A99F6AEF2E992D06DBB11EF9450BC09BA3E6163F36642F5BBF2DA807D87B33E20462A565DA5C3E27405FE554D7CF9B8D28721D66CC841EDCFAC0C2A2A5B090FFC8E410642E4E6D8EABCB298526C9D182C6ED3AF3B30E66A9401FACB47C12F78180A6E0AD197761D76DB85951D5627F2CE69B3DA7CC61352B280CE51448F14E9AA16A63B992E59FB9FA6F55ED29A93A8DC728EFEDB16C58ED773DA00E096AF4F44AAACFA10FB0D4ED832465BFFCD14B3E8BC55025C06AE9FCC76CA9CEA449D39

$ openssl x509 -in jongpak.crt -modulus -noout
Modulus=EF06EFC03C6BA32CDEE19DFF84952AA228A7A104E9B04C716D00CF40668452565D4AC42C0B2FF7AEBB3252B7F963C55D3BD3444506AFEBC6A010F73AAF0FFB5F8A99F6AEF2E992D06DBB11EF9450BC09BA3E6163F36642F5BBF2DA807D87B33E20462A565DA5C3E27405FE554D7CF9B8D28721D66CC841EDCFAC0C2A2A5B090FFC8E410642E4E6D8EABCB298526C9D182C6ED3AF3B30E66A9401FACB47C12F78180A6E0AD197761D76DB85951D5627F2CE69B3DA7CC61352B280CE51448F14E9AA16A63B992E59FB9FA6F55ED29A93A8DC728EFEDB16C58ED773DA00E096AF4F44AAACFA10FB0D4ED832465BFFCD14B3E8BC55025C06AE9FCC76CA9CEA449D39

$ openssl req -in jongpak.csr -modulus -noout
Modulus=EF06EFC03C6BA32CDEE19DFF84952AA228A7A104E9B04C716D00CF40668452565D4AC42C0B2FF7AEBB3252B7F963C55D3BD3444506AFEBC6A010F73AAF0FFB5F8A99F6AEF2E992D06DBB11EF9450BC09BA3E6163F36642F5BBF2DA807D87B33E20462A565DA5C3E27405FE554D7CF9B8D28721D66CC841EDCFAC0C2A2A5B090FFC8E410642E4E6D8EABCB298526C9D182C6ED3AF3B30E66A9401FACB47C12F78180A6E0AD197761D76DB85951D5627F2CE69B3DA7CC61352B280CE51448F14E9AA16A63B992E59FB9FA6F55ED29A93A8DC728EFEDB16C58ED773DA00E096AF4F44AAACFA10FB0D4ED832465BFFCD14B3E8BC55025C06AE9FCC76CA9CEA449D39

개인키 → 공개키 생성 (-pubout)

$ openssl rsa -in jongpak.key -pubout
Enter pass phrase for jongpak.key:
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7wbvwDxroyze4Z3/hJUq
oiinoQTpsExxbQDPQGaEUlZdSsQsCy/3rrsyUrf5Y8VdO9NERQav68agEPc6rw/7
X4qZ9q7y6ZLQbbsR75RQvAm6PmFj82ZC9bvy2oB9h7M+IEYqVl2lw+J0Bf5VTXz5
uNKHIdZsyEHtz6wMKipbCQ/8jkEGQuTm2Oq8sphSbJ0YLG7Trzsw5mqUAfrLR8Ev
eBgKbgrRl3YddtuFxxxxJ/LOabPafMYTUrKAzlFEjxTpqhamO5kuWfufpvVe0pqT
qNxyjv7bFsWO13PaAOCWr09Eqqz6EPsNTtgyRlv/zRSz6LxVAlwGrp/Mdsqc6kSd
OQIDAQAB
-----END PUBLIC KEY-----

원격지 인증서 확인 (s_client)