범용 암호화 및 보안 통신을 위한 강력한 상용 등급의 모든 기능을 갖춘 툴킷
SSL과 TSL 프로토콜을 구현한다.
SSL/TLS는 네트워크 통신 보안 위해 데이터 암호화 및 인증하는 표준 프로토콜
OpenSSL은 이 프로토콜을 사용하여 안전한 통신 채널 설정
X.509 인증서 생성, 관리, 검증 작업 지원
공개키 암호화 시스템에서 사용되는 표준 형식의 디지털 인증서
C언어 API로 암호화 작업을 프로그래밍적으로 처리할 수 있음.
보안 기능 직접 구현할 때 사용
바이너리 형태로 저장
.der / .cer 이며 텍스트 편집기도 내용 볼 수 없음.
애플리케이션에서 직접 사용됨.
base64 인코딩 방식으로 DER 형식 데이터를 인코딩
헤더와 푸터를 추가하여 구성
텍스트 형식이므로 텍스트 에디터에서 열어볼 수 있음
확장자는 .pem / .crt / .cer 등
웹 서버 구성과 같이 사람이 직접 인증서를 다루어야 하는 상황에서 유용
# Private key of the SSL certificate
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBj08sp5++4anG
cmQxJjAkBgNVBAoTHVByb2dyZXNzIFNvZnR3YXJlIENvcnBvcmF0aW9uMSAwHgYD
VQQDDBcqLmF3cy10ZXN0LnByb2dyZXNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD
...
bml6YXRpb252YWxzaGEyZzIuY3JsMIGgBggrBgEFBQcBAQSBkzCBkDBNBggrBgEF
BQcwAoZBaHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvZ3Nvcmdh
z3P668YfhUbKdRF6S42Cg6zn
-----END PRIVATE KEY-----
# Public key of the SSL certificate (the server certificate)
-----BEGIN CERTIFICATE-----
MIIFaDCCBFCgAwIBAgISESHkvZFwK9Qz0KsXD3x8p44aMA0GCSqGSIb3DQEBCwUA
VQQDDBcqLmF3cy10ZXN0LnByb2dyZXNzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAMGPTyynn77hqcYnjWsMwOZDzdhVFY93s2OJntMbuKTHn39B
...
bml6YXRpb252YWxzaGEyZzIuY3JsMIGgBggrBgEFBQcBAQSBkzCBkDBNBggrBgEF
BQcwAoZBaHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvZ3Nvcmdh
bml6YXRpb252YWxzaGEyZzJyMS5jcnQwPwYIKwYBBQUHMAGGM2h0dHA6Ly9vY3Nw
lffygD5IymCSuuDim4qB/9bh7oi37heJ4ObpBIzroPUOthbG4gv/5blW3Dc=
-----END CERTIFICATE-----
openssl genrsa -out mykey.pem 2048

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPr3vX8gYPJ/Rl
Jh6viYFavI4/GvbPbZxlVxFEExpztxdGel8NiY6SmnxEX1BwTuPlBflqCZ7Tcnd7
NdVj1w87E0SiJ98vVNJJtKDfbwgyvWqargjeJETIDwJc1pShHelSsctWYh90NQPG
6605dZbd/LwhNq2QL/AYE1tDfp2f5cjYRqQCrQL1I7Q+MDw9lYacOz3ZBzn4K/FJ
zSoExWXLfsJhFZYZGs9ICmTJtFIMw/p1M0yQMXXaIqs4Ap2yXLHyT/Db2kA03y0Q
rKZcrdpNFnKxUpK71VwGpbwwI7daPQ+4D55ogtwQ2z4wHDHjVSqHjq/7oqeuhwkQ
pBsMsuKpAgMBAAECggEABdyPDejfxj0QxxYMrFRLg/2/CgWUd7BBR2mYrCeEifAz
Rk2dMdWdt4IysFSnAYnIdtCfWcsht21gn+fvY4el/2XWJw7MXBqfFhjJ/Y8LAoZE
Dvo1zTHlhbv0C3Nm8yZ+olMwSPowpxKj+PudLPpQ+BJHq6xOY7u79qyn2RTRaroq
zH2P5ICLTXnAPnCRzJzR+9YTKxl63pdmfL7v+wnmVE+pKWjprgn6YBOCJGqlMMrK
o8iAESqZzL+ROp5TaPXnym0TvD8uglxy9Soh+1iJ9FCs6a3q47y2M9fvyaAjISjL
YiaY//1A1CxNuuCIpRjPbFnfR9JMqLOU/3GaC6lxbQKBgQD6icdvYOv/U7uHiRy2
02ILE0D28S0DY+xT09xvQ6WTuR3u9BPZIwvz37YYLeV/QsZOXK2x5etYDFkzwRsx
RAApEI5oaEVO+fobhbfd7ZoBXumK/R/ORJ/II/4x1mKAye6eLc9BmFoisjXukXpZ
jgQi7dDONFALENdQU0UOy37ULwKBgQDUNoyfs3SM4LIqvkhnfplbbUnzVQJO7Z6k
IUVgv9leVmG6sB9Ac3PhWfOSPGKZqQHbWaTzPkXj8vd3QRShoW9MuQmeaaykni6Q
DP8klyR12pLI1kTdnE93qqDDesBTCKKzwCOZlU146DNHtKXg9yOnV393hvom1akH
Eot0KLsIpwKBgQDW0Euvs+qlgaXJEEcOezAVTuzkzuVJguOe/IiE3fuaLZ78w0pB
Y0tcTvRSxwd/lkFx7wT/A6RGWlAhj/FAzI1WqFtyKfVDQhKwhnagUpk5k6erBF3A
/hYCBNpu4OKUio+OELkkBP1Dwol7hEDjiGEDkeT26OO4mTgEJ2GOzexxAQKBgG+P
ocvPFqV89o0b7Ypi9pIm2SqP9R+zMaQNTaC4GrjKZqQzNKq4RyIgHLky/47SV4SO
EvZBNZLJRyktUIBMEuvdlt3tpfIAqm/WNUdyIZvHZUUpx5hNNUWusMczP+om7wna
J5z07X5za4n1wQKMSfUOPZeDoPxLdImgSSmuw+yfAoGBAO+JbHZBAbjLz8pNPvrR
FQ9gBEweGvCerGbpNZVAukBwBVvuoCTVmVrnvmlsNiora/9E2FYtYQqztrKcuCqn
ji0QqtIi0giZV+q3olZbdz9ilRZ65/vBSLEmwQOQTwc8ff0gf82HlwyewwOcAQoE
O/GfWpvbHudUbmU7vZAtfWdO
-----END PRIVATE KEY-----
이걸 디코딩하면 다음과 같다.
이건 여전히 ASN.1(Abstract Syntax Notation One) 포맷이므로, 진짜 내용(소수, 개인지수, 역원 등)을 보려면 openssl rsa 명령어 파싱을 해야 한다.
Private Key algo RSA
Private Format PKCS#8
ASN1 Dump
RSA Private CRT Key [37:79:9c:a2:d1:66:95:ba:d9:fe:4e:68:26:aa:6a:00:c8:81:d1:3f]
modulus: cfaf7bd7f2060f27f465261eaf89815abc8e3f1af6cf6d9c65571144131a73b717467a5f0d898e929a7c445f50704ee3e505f96a099ed372777b35d563d70f3b1344a227df2f54d249b4a0df6f0832bd6a9aae08de2444c80f025cd694a11de952b1cb56621f743503c6ebad397596ddfcbc2136ad902ff018135b437e9d9fe5c8d846a402ad02f523b43e303c3d95869c3b3dd90739f82bf149cd2a04c565cb7ec2611596191acf480a64c9b4520cc3fa75334c903175da22ab38029db25cb1f24ff0dbda4034df2d10aca65cadda4d1672b15292bbd55c06a5bc3023b75a3d0fb80f9e6882dc10db3e301c31e3552a878eaffba2a7ae870910a41b0cb2e2a9
public exponent: 10001
이렇게 생성된 건 RSA 개인키임.
여기에는 다음 구성으로 이루어짐.
근데 base64로 인코딩되고 디코딩해도 ASN.1 포맷이므로 인간이 해독 가능한 형태로 보려면 openssl rsa로 파싱해야 함.
1. 모듈러스(n): 공개 키와 개인 키 모두에 사용되는 큰 정수. 두 개의 큰 소수의 곱으로 구성
2. 공개 지수(e): 공개키의 일부, 일반적으로 작은 수(예: 65537)로 설정
3. 개인 지수(d): 공개 지수 모듈로 n에 대한 역원, 실제 메시지 암호화 및 복호화에 사용
openssl rsa -in mykey.pem -text -noout
Private-Key: (2048 bit, 2 primes)
modulus:
00:cf:af:7b:d7:f2:06:0f:27:f4:65:26:1e:af:89:
81:5a:bc:8e:3f:1a:f6:cf:6d:9c:65:57:11:44:13:
1a:73:b7:17:46:7a:5f:0d:89:8e:92:9a:7c:44:5f:
50:70:4e:e3:e5:05:f9:6a:09:9e:d3:72:77:7b:35:
d5:63:d7:0f:3b:13:44:a2:27:df:2f:54:d2:49:b4:
a0:df:6f:08:32:bd:6a:9a:ae:08:de:24:44:c8:0f:
02:5c:d6:94:a1:1d:e9:52:b1:cb:56:62:1f:74:35:
03:c6:eb:ad:39:75:96:dd:fc:bc:21:36:ad:90:2f:
f0:18:13:5b:43:7e:9d:9f:e5:c8:d8:46:a4:02:ad:
02:f5:23:b4:3e:30:3c:3d:95:86:9c:3b:3d:d9:07:
39:f8:2b:f1:49:cd:2a:04:c5:65:cb:7e:c2:61:15:
96:19:1a:cf:48:0a:64:c9:b4:52:0c:c3:fa:75:33:
4c:90:31:75:da:22:ab:38:02:9d:b2:5c:b1:f2:4f:
f0:db:da:40:34:df:2d:10:ac:a6:5c:ad:da:4d:16:
72:b1:52:92:bb:d5:5c:06:a5:bc:30:23:b7:5a:3d:
0f:b8:0f:9e:68:82:dc:10:db:3e:30:1c:31:e3:55:
2a:87:8e:af:fb:a2:a7:ae:87:09:10:a4:1b:0c:b2:
e2:a9
publicExponent: 65537 (0x10001)
privateExponent:
05:dc:8f:0d:e8:df:c6:3d:10:c7:16:0c:ac:54:4b:
83:fd:bf:0a:05:94:77:b0:41:47:69:98:ac:27:84:
89:f0:33:46:4d:9d:31:d5:9d:b7:82:32:b0:54:a7:
01:89:c8:76:d0:9f:59:cb:21:b7:6d:60:9f:e7:ef:
63:87:a5:ff:65:d6:27:0e:cc:5c:1a:9f:16:18:c9:
fd:8f:0b:02:86:44:0e:fa:35:cd:31:e5:85:bb:f4:
0b:73:66:f3:26:7e:a2:53:30:48:fa:30:a7:12:a3:
f8:fb:9d:2c:fa:50:f8:12:47:ab:ac:4e:63:bb:bb:
f6:ac:a7:d9:14:d1:6a:ba:2a:cc:7d:8f:e4:80:8b:
4d:79:c0:3e:70:91:cc:9c:d1:fb:d6:13:2b:19:7a:
de:97:66:7c:be:ef:fb:09:e6:54:4f:a9:29:68:e9:
ae:09:fa:60:13:82:24:6a:a5:30:ca:ca:a3:c8:80:
11:2a:99:cc:bf:91:3a:9e:53:68:f5:e7:ca:6d:13:
bc:3f:2e:82:5c:72:f5:2a:21:fb:58:89:f4:50:ac:
e9:ad:ea:e3:bc:b6:33:d7:ef:c9:a0:23:21:28:cb:
62:26:98:ff:fd:40:d4:2c:4d:ba:e0:88:a5:18:cf:
6c:59:df:47:d2:4c:a8:b3:94:ff:71:9a:0b:a9:71:
6d
prime1:
00:fa:89:c7:6f:60:eb:ff:53:bb:87:89:1c:b6:d3:
62:0b:13:40:f6:f1:2d:03:63:ec:53:d3:dc:6f:43:
a5:93:b9:1d:ee:f4:13:d9:23:0b:f3:df:b6:18:2d:
e5:7f:42:c6:4e:5c:ad:b1:e5:eb:58:0c:59:33:c1:
1b:31:44:00:29:10:8e:68:68:45:4e:f9:fa:1b:85:
b7:dd:ed:9a:01:5e:e9:8a:fd:1f:ce:44:9f:c8:23:
fe:31:d6:62:80:c9:ee:9e:2d:cf:41:98:5a:22:b2:
35:ee:91:7a:59:8e:04:22:ed:d0:ce:34:50:0b:10:
d7:50:53:45:0e:cb:7e:d4:2f
prime2:
00:d4:36:8c:9f:b3:74:8c:e0:b2:2a:be:48:67:7e:
99:5b:6d:49:f3:55:02:4e:ed:9e:a4:21:45:60:bf:
d9:5e:56:61:ba:b0:1f:40:73:73:e1:59:f3:92:3c:
62:99:a9:01:db:59:a4:f3:3e:45:e3:f2:f7:77:41:
14:a1:a1:6f:4c:b9:09:9e:69:ac:a4:9e:2e:90:0c:
ff:24:97:24:75:da:92:c8:d6:44:dd:9c:4f:77:aa:
a0:c3:7a:c0:53:08:a2:b3:c0:23:99:95:4d:78:e8:
33:47:b4:a5:e0:f7:23:a7:57:7f:77:86:fa:26:d5:
a9:07:12:8b:74:28:bb:08:a7
exponent1:
00:d6:d0:4b:af:b3:ea:a5:81:a5:c9:10:47:0e:7b:
30:15:4e:ec:e4:ce:e5:49:82:e3:9e:fc:88:84:dd:
fb:9a:2d:9e:fc:c3:4a:41:63:4b:5c:4e:f4:52:c7:
07:7f:96:41:71:ef:04:ff:03:a4:46:5a:50:21:8f:
f1:40:cc:8d:56:a8:5b:72:29:f5:43:42:12:b0:86:
76:a0:52:99:39:93:a7:ab:04:5d:c0:fe:16:02:04:
da:6e:e0:e2:94:8a:8f:8e:10:b9:24:04:fd:43:c2:
89:7b:84:40:e3:88:61:03:91:e4:f6:e8:e3:b8:99:
38:04:27:61:8e:cd:ec:71:01
exponent2:
6f:8f:a1:cb:cf:16:a5:7c:f6:8d:1b:ed:8a:62:f6:
92:26:d9:2a:8f:f5:1f:b3:31:a4:0d:4d:a0:b8:1a:
b8:ca:66:a4:33:34:aa:b8:47:22:20:1c:b9:32:ff:
8e:d2:57:84:8e:12:f6:41:35:92:c9:47:29:2d:50:
80:4c:12:eb:dd:96:dd:ed:a5:f2:00:aa:6f:d6:35:
47:72:21:9b:c7:65:45:29:c7:98:4d:35:45:ae:b0:
c7:33:3f:ea:26:ef:09:da:27:9c:f4:ed:7e:73:6b:
89:f5:c1:02:8c:49:f5:0e:3d:97:83:a0:fc:4b:74:
89:a0:49:29:ae:c3:ec:9f
coefficient:
00:ef:89:6c:76:41:01:b8:cb:cf:ca:4d:3e:fa:d1:
15:0f:60:04:4c:1e:1a:f0:9e:ac:66:e9:35:95:40:
ba:40:70:05:5b:ee:a0:24:d5:99:5a:e7:be:69:6c:
36:2a:2b:6b:ff:44:d8:56:2d:61:0a:b3:b6:b2:9c:
b8:2a:a7:8e:2d:10:aa:d2:22:d2:08:99:57:ea:b7:
a2:56:5b:77:3f:62:95:16:7a:e7:fb:c1:48:b1:26:
c1:03:90:4f:07:3c:7d:fd:20:7f:cd:87:97:0c:9e:
c3:03:9c:01:0a:04:3b:f1:9f:5a:9b:db:1e:e7:54:
6e:65:3b:bd:90:2d:7d:67:4e
.pem 확장자는 "Privacy-Enhanced Mail"의 약자
원래 전자 메일 시스템에서 안전한 통신을 위해 설계되었음. 근데 지금은 SSL/TLS 인증서 같은 암호화 키, 공개 키, 루트 인증서 등을 저장할 때 사용됨
openssl rsa -in mykey.pem -pubout -out mypublickey.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz6971/IGDyf0ZSYer4mB
WryOPxr2z22cZVcRRBMac7cXRnpfDYmOkpp8RF9QcE7j5QX5agme03J3ezXVY9cP
OxNEoiffL1TSSbSg328IMr1qmq4I3iREyA8CXNaUoR3pUrHLVmIfdDUDxuutOXWW
3fy8ITatkC/wGBNbQ36dn+XI2EakAq0C9SO0PjA8PZWGnDs92Qc5+CvxSc0qBMVl
y37CYRWWGRrPSApkybRSDMP6dTNMkDF12iKrOAKdslyx8k/w29pANN8tEKymXK3a
TRZysVKSu9VcBqW8MCO3Wj0PuA+eaILcENs+MBwx41Uqh46v+6KnrocJEKQbDLLi
qQIDAQAB
-----END PUBLIC KEY-----
Public-Key: (2048 bit)
Modulus:
00:cf:af:7b:d7:f2:06:0f:27:f4:65:26:1e:af:89:
81:5a:bc:8e:3f:1a:f6:cf:6d:9c:65:57:11:44:13:
1a:73:b7:17:46:7a:5f:0d:89:8e:92:9a:7c:44:5f:
50:70:4e:e3:e5:05:f9:6a:09:9e:d3:72:77:7b:35:
d5:63:d7:0f:3b:13:44:a2:27:df:2f:54:d2:49:b4:
a0:df:6f:08:32:bd:6a:9a:ae:08:de:24:44:c8:0f:
02:5c:d6:94:a1:1d:e9:52:b1:cb:56:62:1f:74:35:
03:c6:eb:ad:39:75:96:dd:fc:bc:21:36:ad:90:2f:
f0:18:13:5b:43:7e:9d:9f:e5:c8:d8:46:a4:02:ad:
02:f5:23:b4:3e:30:3c:3d:95:86:9c:3b:3d:d9:07:
39:f8:2b:f1:49:cd:2a:04:c5:65:cb:7e:c2:61:15:
96:19:1a:cf:48:0a:64:c9:b4:52:0c:c3:fa:75:33:
4c:90:31:75:da:22:ab:38:02:9d:b2:5c:b1:f2:4f:
f0:db:da:40:34:df:2d:10:ac:a6:5c:ad:da:4d:16:
72:b1:52:92:bb:d5:5c:06:a5:bc:30:23:b7:5a:3d:
0f:b8:0f:9e:68:82:dc:10:db:3e:30:1c:31:e3:55:
2a:87:8e:af:fb:a2:a7:ae:87:09:10:a4:1b:0c:b2:
e2:a9
Exponent: 65537 (0x10001)
Public-Key: (2048 bit) 공개키의 비트 길이
Modulus: 모듈러스 값
Exponent: 공개 지수는 일반적으로 65537과 같은 작은 소수
핵심은 개인키와 공개키가 같은 모듈러스를 공유한다는 것(소수 p와 q의 곱)
암호화할 때는 공개키(e와 n)를 사용하고, 복화화할 때는 개인키(d와 n)을 사용
그리고 개인키는 디지털 서명 생성할 때도 사용함.
개인키로 데이터 또는 메시지의 해시를 암호화하고, 생성된 서명은 공개키를 사용하여 검증.
디지털 서명을 생성할 때는 개인키로 암호화하고, 공개키로 복호화.
즉, 이건 내용이 민감하지 않고 단지 전송 과정에서 변조되지 않음을 증명하기만 하면 될 때 사용.
정리하면
개인키: 복호화, 서명 발행
공개키: 암호화, 서명 검증

https://www.youtube.com/watch?v=O7SiDuTCysM
openssl req -new -key mykey.pem -out mycsr.csr

CSR(Certificate Signing Request)
디지털 인증서를 발급받기 위해 제출하는 요청서
SSL/TLS 인증서와 같은 공개키 인증서를 발급받고자 할 때 사용
CSR은 인증서에 포함될 정보를 담고 있으며, 공개키와 함께 개인 정보(조직 이름, 조직 단위, 국가, 도메인 이름 등)을 포함
서버 운영자가 CSR을 생성해서 인증 기관(CA)에 제출한다. CA는 CSR을 검토하고, 요청된 정보가 적절한지 확인 후 인증서를 발급한다.