1. 개요

OpenSSL은 사용자가 다양한 SSL 관련 작업을 수행할 수 있도록 하는 오픈 소스 명령줄 도구입니다.

이 사용방법(예제)에서는 OpenSSL을 사용하여 자체 서명된 인증서를 만드는 방법을 배웁니다 .

2. 개인키 생성

먼저 개인 키를 만듭니다. 개인 키는 암호화를 활성화하는 데 도움이 되며 인증서의 가장 중요한 구성 요소입니다.

openssl 명령 을 사용하여 암호로 보호된 2048비트 RSA 개인 키( domain.key )를 생성해 보겠습니다.

openssl genrsa -des3 -out domain.key 2048

메시지가 표시되면 암호를 입력합니다. 출력은 다음과 같습니다.

Generating RSA private key, 2048 bit long modulus (2 primes)
.....................+++++
.........+++++
e is 65537 (0x010001)
Enter pass phrase for domain.key:
Verifying - Enter pass phrase for domain.key:

개인 키를 암호화하지 않으려면 명령에서 -des3 옵션을 제거하기만 하면 됩니다.

3. 인증서 서명 요청 생성

인증서에 서명하려면 CSR(인증서 서명 요청)이 필요합니다 . CSR에는 공개 키와 일부 추가 정보(예: 조직 및 국가)가 포함됩니다.

기존 개인 키에서 CSR( domain.csr )을 생성해 보겠습니다.

openssl req -key domain.key -new -out domain.csr

프로세스를 완료하기 위해 개인 키 비밀번호와 일부 CSR 정보를 입력합니다. 출력은 다음과 같습니다.

Enter pass phrase for domain.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]:AU
State or Province Name (full name) [Some-State]:stateA                        
Locality Name (eg, city) []:cityA
Organization Name (eg, company) [Internet Widgits Pty Ltd]:companyA
Organizational Unit Name (eg, section) []:sectionA
Common Name (e.g. server FQDN or YOUR name) []:domain
Email Address []:email@email.com

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

중요한 필드는  도메인의 정확한 정규화된 도메인 이름(FQDN)이어야 하는 " 일반 이름" 입니다.

" 챌린지 암호 " 및 " 선택적 회사 이름 "은 비워둘 수 있습니다.

단일 명령으로 개인 키와 CSR을 모두 생성할 수도 있습니다 .

openssl req -newkey rsa:2048 -keyout domain.key -out domain.csr

개인 키를 암호화하지 않으려면 -nodes 옵션을 추가할 수 있습니다.

openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr

4. 자체 서명된 인증서 생성

자체 서명 된 인증서는 자체 개인 키로 서명된 인증서입니다 . CA 서명 인증서뿐만 아니라 데이터를 암호화하는 데 사용할 수 있지만 인증서를 신뢰할 수 없다는 경고가 사용자에게 표시됩니다.

기존 개인 키와 CSR을 사용하여 자체 서명된 인증서( domain.crt )를 생성해 보겠습니다.

openssl x509 -signkey domain.key -in domain.csr -req -days 365 -out domain.crt

-days 옵션 은 인증서가 유효한 일 수를 지정합니다.

개인 키만으로 자체 서명된 인증서를 만들 수 있습니다.

openssl req -key domain.key -new -x509 -days 365 -out domain.crt

이 명령은 임시 CSR을 생성합니다 . 물론 여전히 CSR 정보 프롬프트가 있습니다.

단 하나의 명령으로 개인 키와 자체 서명된 인증서를 만들 수도 있습니다.

openssl req -newkey rsa:2048 -keyout domain.key -x509 -days 365 -out domain.crt

5. 자체 CA로 CA 서명 인증서 생성

자체 서명된 루트 CA 인증서를 만든 다음 로컬 브라우저에 신뢰할 수 있는 인증서로 설치하여 자체 인증 기관(CA)이 될 수 있습니다.

5.1. 자체 서명된 루트 CA 생성

명령줄에서 개인 키( rootCA.key )와 자체 서명된 루트 CA 인증서( rootCA.crt )를 생성해 보겠습니다.

openssl req -x509 -sha256 -days 1825 -newkey rsa:2048 -keyout rootCA.key -out rootCA.crt

5.2. 루트 CA로 CSR에 서명

먼저 다음 내용 으로 구성 텍스트 파일( domain.ext )을 만듭니다.

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
subjectAltName = @alt_names
[alt_names]
DNS.1 = domain

" DNS.1 " 필드는 우리 웹사이트의 도메인이어야 합니다.

그런 다음 루트 CA 인증서와 해당 개인 키를 사용하여 CSR( domain.csr )에 서명할 수 있습니다 .

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in domain.csr -out domain.crt -days 365 -CAcreateserial -extfile domain.ext

결과적으로 CA 서명 인증서는 domain.crt 파일에 있게 됩니다.

6. 인증서 보기

openssl 명령을 사용하여 인증서의 내용을 일반 텍스트로 볼 수 있습니다.

openssl x509 -text -noout -in domain.crt

출력은 다음과 같습니다.

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            64:1a:ad:0f:83:0f:21:33:ff:ac:9e:e6:a5:ec:28:95:b6:e8:8a:f4
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = AU, ST = stateA, L = cityA, O = companyA, OU = sectionA, CN = domain, emailAddress = email@email.com
        Validity
            Not Before: Jul 12 07:18:18 2021 GMT
            Not After : Jul 12 07:18:18 2022 GMT
        Subject: C = AU, ST = stateA, L = cityA, O = companyA, OU = sectionA, CN = domain, emailAddress = email@email.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:a2:6a:2e:a2:17:68:bd:83:a1:17:87:d8:9c:56:
                    ab:ac:1f:1e:d3:32:b2:91:4d:8e:fe:4f:9c:bf:54:
                    aa:a2:02:8a:bc:14:7c:3d:02:15:a9:df:d5:1b:78:
                    17:ff:82:6b:af:f2:21:36:a5:ad:1b:6d:67:6a:16:
                    26:f2:a9:2f:a8:b0:9a:44:f9:72:de:7a:a0:0a:1f:
                    dc:67:b0:4d:a7:f4:ea:bd:0e:83:7e:d2:ea:15:21:
                    6d:8d:18:65:ed:f8:cc:6a:7f:83:98:e2:a4:f4:d6:
                    00:b6:ed:69:95:4e:0d:59:ee:e8:3f:e7:5a:63:24:
                    98:d1:4b:a5:c9:14:a5:7d:ef:06:78:2e:08:25:3c:
                    fd:05:0c:67:ce:70:5d:34:9b:c4:12:e6:e3:b1:04:
                    6a:db:db:e9:47:31:77:80:4f:09:5e:25:73:75:e4:
                    57:36:34:f8:c3:ed:a2:21:57:0e:e3:c1:5c:fc:d9:
                    f2:a3:b1:d9:d9:4f:e2:3e:ad:21:77:20:98:ed:15:
                    39:99:1b:7e:29:60:14:eb:76:8b:8b:72:16:b1:68:
                    5c:10:51:27:fa:41:49:c5:b7:c4:79:69:5e:28:a2:
                    c3:55:ac:e8:05:0f:4b:4a:bd:4b:2c:8b:7d:92:b0:
                    2d:b3:1a:de:9f:1a:5b:46:65:c6:33:b2:2e:7a:0c:
                    b0:2f
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         58:c0:cd:df:4f:c1:0b:5c:50:09:1b:a5:1f:6a:b9:9a:7d:07:
         51:ca:43:ec:ba:ab:67:69:c1:eb:cd:63:09:33:42:8f:16:fe:
         6f:05:ee:2c:61:15:80:85:0e:7a:e8:b2:62:ec:b7:15:10:3c:
         7d:fa:60:7f:ee:ee:f8:dc:70:6c:6d:b9:fe:ab:79:5d:1f:73:
         7a:6a:e1:1f:6e:c9:a0:ae:30:b2:a8:ee:c8:94:81:8e:9b:71:
         db:c7:8f:40:d6:2d:4d:f7:b4:d3:cf:32:04:e5:69:d7:31:9c:
         ea:a0:0a:56:79:fa:f9:a3:fe:c9:3e:ff:54:1c:ec:96:1c:88:
         e5:02:d3:d0:da:27:f6:8f:b4:97:09:10:33:32:87:a8:1f:08:
         dc:bc:4c:be:6b:cc:b9:0e:cf:18:12:55:17:44:47:2e:9c:99:
         99:3c:96:60:12:c6:fe:b0:ee:01:97:54:20:b0:13:51:4f:ee:
         1d:c0:3d:1a:30:aa:79:30:12:e2:4f:af:13:85:f8:c8:1e:f5:
         28:7c:55:66:66:10:f4:0a:69:c0:55:8a:9a:c7:eb:ec:15:f0:
         ef:bd:c1:d2:47:43:34:72:71:d2:c3:ff:f0:a3:c1:2c:63:56:
         f2:f5:cf:91:ec:a1:c0:1f:5d:af:c0:8e:7a:02:fe:08:ba:21:
         68:f2:dd:bd

7. 인증서 형식 변환

인증서( domain.crt )는 ASCII PEM으로 인코딩된 X.509 인증서입니다 . OpenSSL을 사용하여 다목적 사용을 위해 다른 형식으로 변환할 수 있습니다.

7.1. PEM을 DER로 변환

DER 형식은 일반적으로 Java와 함께 사용됩니다. PEM 인코딩 인증서를 DER 인코딩 인증서로 변환해 보겠습니다.

openssl x509 -in domain.crt -outform der -out domain.der

7.2. PEM을 PKCS12로 변환

PFX 파일이라고도 하는 PKCS12 파일은 일반적으로 Microsoft IIS에서 인증서 체인을 가져오고 내보내는 데 사용됩니다.

다음 명령을 사용하여 개인 키와 인증서를 가져온 다음 PKCS12 파일에 결합합니다.

openssl pkcs12 -inkey domain.key -in domain.crt -export -out domain.pfx

8. 결론

이 기사에서는 처음부터 OpenSSL을 사용하여 자체 서명된 인증서를 만들고  이 인증서를 보고 다른 형식으로 변환하는 방법을 배웠습니다 . 이러한 것들이 귀하의 업무에 도움이 되기를 바랍니다.

Security footer banner