Là một công cụ dòng lệnh mã nguồn mở thường được dùng để tạo khóa riêng tư, tạo các CSR, cài đặt chứng chỉ SSL/TLS và xác định thông tin chứng chỉ.

OpenSSL Version

Kiểm tra phiên bản của OpenSSL:

openssl version -a
 
OpenSSL 3.1.5 30 Jan 2024 (Library: OpenSSL 3.1.5 30 Jan 2024)
built on: Sat Feb  3 16:11:24 2024 UTC
platform: debian-amd64
options:  bn(64,64)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -fzero-call-used-regs=used-gpr -DOPENSSL_TLS_SECURITY_LEVEL=2 -Wa,--noexecstack -g -O2 -ffile-prefix-map=/build/reproducible-path/openssl-3.1.5=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-3"
MODULESDIR: "/usr/lib/x86_64-linux-gnu/ossl-modules"
Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0xfedab2234f8bffff:0x9c27a9

Một số thông tin quan trọng trong output:

  • Version number và version release date (OpenSSL 3.1.5 30 Jan 2024).
  • Các option được xây dựng cùng với thư viện:options.
  • Thư mục chứa chứng chỉ và các khóa riêng tư: OPENSSLDIR.

Generating a Private Key

Khi tạo private key, ta cần phải lựa chọn 3 thứ:

  • Thuật toán mã hóa chẳng hạn như RSA, RSA-PSS, EC, X25519, X448, ED25519 và ED448.
  • Kích thước khóa: ít nhất 2048 bit cho RSA và 256 bit cho ECDSA.
  • Passphrase (optional): nếu sử dụng thì private key sẽ được mã hóa bởi một thuật toán chỉ định và sẽ không thể dùng được nếu như không có passphrase.

Tạo private key với thuật toán RSA 2048 bit và được mã hóa bằng 3DES:

openssl genpkey -out encrypted.private.key -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -des3 -pass pass:passphrase

Giải thích các option:

  • -out: tên file chứa private key.

  • -algorithm: tên thuật toán mã hóa. Option này cần đứng trước option -pkeyopt.

  • -pkeyopt opt:value: chỉ các option của thuật toán mã hóa. Đối với RSA thì có các option sau:

    rsa_keygen_bits:numbits
       The number of bits in the generated key. If not specified 2048 is used.
     
    rsa_keygen_primes:numprimes
       The number of primes in the generated key. If not specified 2 is used.
     
    rsa_keygen_pubexp:value
       The RSA public exponent value. This can be a large decimal or hexadecimal value if preceded by "0x". Default value is 65537.
  • -des3: thuật toán mã hóa khóa bí mật. Với des3 là thuật toán mã hóa đối xứng 3DES.

  • -pass pass:passphrase: passphrase dùng để mã hóa khóa bí mật.

Nội dung của private key được sinh ra có định dạng PEM1 như sau:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQImBAPZuhbAA0CAggA
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECPWArG+DzIQnBIIEyCCtHUq6DVsi
ta3Zs5Nq2Fm3pl9T79/sU+9bQgyrl0r3/Fq4/cvymQ/0EPY3dhM9H0v4gMANxpUk
WcUrjy6/+eYkpdc3Gc1aI+hTkmHbu0mFRfkZ4SkvVz20GcP9JY6jb7IrFvPAIfRF
xLYzKtE2+7IHCu1NWv7JQFsNQez6+CpM/YxA7hVPMnlgH9vl5ofsgXwFfo2bpwCF
LegtQ9Y+slSTKRYSbROrZghioUMZ3BhqEo1TJVC2PsmwTJtlLnxtqDgDSz/4Cbpk
oPOBI07fvOXb/Z4kVOjV2cTlUI71FoLlbmkCGBbw+41/6WX+kyHltdTS+ODbOQNQ
AS3zGvmRuDXMr+ogZHSpOyz4UVx2WxeS8q48CcNF8s12WCRO7asl1mntw0H/8v3C
e7sGgmpiAizIpPqGG0x55RYhmGF3kr3iLYXcdgbZy67tcKk3b6QRLPAssmZvrD9v
TtOU1LPyZIOwgrQByr3kj6cfJfrzzZNlaZsjy6+4I5NlocKVg0lAmO2IgUjWajbN
c8+IYrJB4OXaD4fwKmtvM3yLU+vZ5wstLCOikFxB+R+h8KxyT3E0RRfMPAji+/ar
3x/uXukmQ/6+h3mnWEMFYUMgt7W679ZAWIrNl9Z8QveaCdwAsKQEZ8gN39Bp/eOg
yD99ltztB4xhSvn2ZCr/M16U/OMY6fDn2ScIOkhS52r3oRSJYHm25cIHn9SQQrzU
pRMYHnR1skLtqhO65yUdKoROZrAKB6c9ZeXSpb3A0IAtrUaFW2bNFXqEio8TQrqc
y1brJTs1h/MGuk/t8v63nGpnyGbZt+/Te03Dof5bujQw7eQox+vzFVsrBXaF7ovD
OOE8GOjMJuhc2wC1whIvK4sl5g0WE4zKNerPUh2YvJQTMcWYgjNup2H5GWakeNKs
j1ZhkcM7lONWZP+Pyaf3c3E4PlPExXLnwIvdJx/A+lfHNHr0pIPP0C2BoHUF+oTG
gThioTH38FzMLtHGghi2+7OK/C7/36M9otH9Cg/zxxmE47K8twKI+/buyMkKvyKT
p50n+4jc1sIoL1g+yWZWMa67OpwffmTTbNHMF9IZRqLvw1Wyv4soPB7erdgh1FAE
NAGeLh3j4CAJ2zeosqttV3KjhDBHXqcAJP5vHDJ6IHo01j08c+y+p380ofjg0/l2
pxKbgnrWlqvWcXs1FSZNV+2zkdzV3+0inyv+oum/VLwnIH9170XFO5nSyWDAe2+n
wSRf8Z+/R3aW5rKnhAZEiBPHZjS6cnaNjsZOggL3jjAbydIUYF7KN+2pgr9lOA4V
3Cy7d7gBn2V5qpBf6CWYiuT9br3kQmnQBKW/fZX95/YBJ8OeY3cHtO8D4YWE0SVj
OLzdm0RnGQKMH8MeqmBG71u4YGzae2TOGmFbfgELCeCxeXONYu4Z8CGEEf68agMQ
zuSoFRe71ZgMG5hODoCwonQNnZgeTFO/qUw7WFUP9TgUpUPTWr8kP7XmBK1HKNI6
E8AUL99FxP0zLyBs6dOj89Qjd/mp23JKm8zrq9s1oOJUeMIUtqZ7xtcPBG6s50jU
ApP08D1U8fxm5jbyNWY9mLyeRTRn36LmFzRmdwdc3ffpKhI7DF1mB8ogYnsnDRQ6
PhjEszS+R6TkUdRCWpj2qA==
-----END ENCRYPTED PRIVATE KEY-----

Giải mã private key bằng subcommand rsa như sau:

openssl rsa -passin pass:passphrase -in encrypted.private.key -out private.key

Câu lệnh trên sẽ giải mã private key trong file encrypted.private.key với passphrase là passphrase và ghi ra file private.key. Private key sau khi giải mã:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDmN7wrwD/0yw75
IGqMlf5B1yu4O2td6FOEH3u8soIdCu24uRDFqVviDyIA+3O0KOBPgSLffVTsj9DT
7YpHmI3dEzcyF+X5IhzIaCE2rHdhMV84JQee8d7dh0sU3IgdNwUBRfGu06Da/kgQ
Gce+XxWfFTxCBjWIyayJ5ivHwb2AleCl8SMPUZrPeZA1migmCldNRMXvyNx2PIKJ
Kdoq2zyPMXcvizRUp5Yf9eOV0A4E15FRMgyxCK3m4hJcbammYCW2uyVP7JGaRiKA
aSmaNnonOiRcu7s/Bzx1difY9+nZbZa8gpsm95+Grjkz7WDxMkggMn426K5NSdtk
+rzKhwInAgMBAAECggEAJUlYpkNkeGrc+XeJGkz+2b4WXCfvi02iHS+WNGk7DqYi
+3yp3UHBWns1+C/BvSezsNzK/6SGeSwP2AtMjq0EKQ7ALVJWkoO2YrUO0BKd4TWE
ZQ0GT3WAMaQEgpP3TbgIDP09mCG5l06A8G6kfc5bq6DeWhk0WXvEgK8xXxCfdzBA
bNkV521q/IAigzYkwY595seohRkpkUiV3dmJkxbmKnNqDvfxQNdumvOhdPpsorJ6
kbil257GGdi/iN/3sxUEYIoKeN18bpF5itqa4HldYTg1oqVnV2h7BJ9k+KHYIW2U
BYlrVnueINIKLoE1GoZXjKr7/kuK6wAe5hBuwzu12QKBgQD/gYaaHOSadAQ+BDkV
4TSF1vvTJ2P3laYbUlVqMh66REOnkhpTtQk9vY+YXJl3WlsNuPxlE+lHLBNGNWY4
HvcnDEN22T+q2xu5INhFkIWuDwJETPuhz9FBCsfTxYqAITt09bQC+HRtCUIGNrFF
9IJJBMZZhSs2rbEzFcrj3fA+iQKBgQDmqbES6dUABYXp9XRReiqFfvpgfTnjQ0AX
7Y/S2ifKoES1Lz7419hWkPc1cT36WsYXa7TsWwMeHqXP1uvWs9qzKczakMWjoyF8
PNg54kB+2tX++/XuUOk0Ug8D2M0VIZxAjF7iFNogsT+CMQTJzOlAMG2orEz2xbCP
j1ITLVWPLwKBgQCFFJreNIRhamI3Rw3Qtp8bwxEhNxgbgcel3Wl9yaM1k47FfhTW
Wqn4jX54dmq8vsREToCvyQItPui/HdsjCgXjQcD160v9GujCsTfUa+Uk9s5QcuRx
sIOmZA4W4II2IJkOX1emYHCLxlGsWNpWvHcLvz/sqq8KaMet+wDVVOjoOQKBgBXq
m7OTWjS1UaMIOnQfanjitsGCRITOeAGOBfNf3RYIol6gzZfxUlHvVj3Ss7Pc+iNx
jXBDuYkcGl8kKaZt0mLhnuBJjy3cKytV0Km3UK989YZTxGtPbskU3u5bpCjU17be
X4mVt6ARl1o0dCMEgEkkENdM/8cWw47wbDj8PrvrAoGAOLUDKIKOZa+yfaSaAWQ/
FkFT0udd18ARjO6SsUxaco9Rb6d4SFWfMwH4HunEY7ODxcUKSBefV+xkMvh/VR98
ne+h5Y+eBJGX03MaVTMdCjp9YoqOFgURyhGRZmjdGQlrJLEYrXV01/XtbFr2TtaZ
4/sF4A8o0hvYX/rSUkLm3E8=
-----END PRIVATE KEY-----

Nếu chúng ta truyền passphrase sai thì sẽ có thông báo lỗi như sau:

Could not read private key from encrypted.private.key
40C77592BB7F0000:error:1608010C:STORE routines:ossl_store_handle_load_result:unsupported:../crypto/store/store_result.c:151:
40C77592BB7F0000:error:1C800064:Provider routines:ossl_cipher_unpadblock:bad decrypt:../providers/implementations/ciphers/ciphercommon_block.c:124:
40C77592BB7F0000:error:11800074:PKCS12 routines:PKCS12_pbe_crypt_ex:pkcs12 cipherfinal error:../crypto/pkcs12/p12_decr.c:86:maybe wrong password

Có thể decode dạng PEM bằng subcommand rsa như sau:

openssl rsa -text -in private.key --noout

Với --noout là để bỏ qua phần encoded private key ở trong output.

Output có thể có dạng như sau:

Private-Key: (2048 bit, 2 primes)
modulus:
    00:e6:37:bc:2b:c0:3f:f4:cb:0e:f9:20:6a:8c:95:
    fe:41:d7:2b:b8:3b:6b:5d:e8:53:84:1f:7b:bc:b2:
    82:1d:0a:ed:b8:b9:10:c5:a9:5b:e2:0f:22:00:fb:
    73:b4:28:e0:4f:81:22:df:7d:54:ec:8f:d0:d3:ed:
    8a:47:98:8d:dd:13:37:32:17:e5:f9:22:1c:c8:68:
    21:36:ac:77:61:31:5f:38:25:07:9e:f1:de:dd:87:
    4b:14:dc:88:1d:37:05:01:45:f1:ae:d3:a0:da:fe:
    48:10:19:c7:be:5f:15:9f:15:3c:42:06:35:88:c9:
    ac:89:e6:2b:c7:c1:bd:80:95:e0:a5:f1:23:0f:51:
    9a:cf:79:90:35:9a:28:26:0a:57:4d:44:c5:ef:c8:
    dc:76:3c:82:89:29:da:2a:db:3c:8f:31:77:2f:8b:
    34:54:a7:96:1f:f5:e3:95:d0:0e:04:d7:91:51:32:
    0c:b1:08:ad:e6:e2:12:5c:6d:a9:a6:60:25:b6:bb:
    25:4f:ec:91:9a:46:22:80:69:29:9a:36:7a:27:3a:
    24:5c:bb:bb:3f:07:3c:75:76:27:d8:f7:e9:d9:6d:
    96:bc:82:9b:26:f7:9f:86:ae:39:33:ed:60:f1:32:
    48:20:32:7e:36:e8:ae:4d:49:db:64:fa:bc:ca:87:
    02:27
publicExponent: 65537 (0x10001)
privateExponent:
    25:49:58:a6:43:64:78:6a:dc:f9:77:89:1a:4c:fe:
    d9:be:16:5c:27:ef:8b:4d:a2:1d:2f:96:34:69:3b:
    0e:a6:22:fb:7c:a9:dd:41:c1:5a:7b:35:f8:2f:c1:
    bd:27:b3:b0:dc:ca:ff:a4:86:79:2c:0f:d8:0b:4c:
    8e:ad:04:29:0e:c0:2d:52:56:92:83:b6:62:b5:0e:
    d0:12:9d:e1:35:84:65:0d:06:4f:75:80:31:a4:04:
    82:93:f7:4d:b8:08:0c:fd:3d:98:21:b9:97:4e:80:
    f0:6e:a4:7d:ce:5b:ab:a0:de:5a:19:34:59:7b:c4:
    80:af:31:5f:10:9f:77:30:40:6c:d9:15:e7:6d:6a:
    fc:80:22:83:36:24:c1:8e:7d:e6:c7:a8:85:19:29:
    91:48:95:dd:d9:89:93:16:e6:2a:73:6a:0e:f7:f1:
    40:d7:6e:9a:f3:a1:74:fa:6c:a2:b2:7a:91:b8:a5:
    db:9e:c6:19:d8:bf:88:df:f7:b3:15:04:60:8a:0a:
    78:dd:7c:6e:91:79:8a:da:9a:e0:79:5d:61:38:35:
    a2:a5:67:57:68:7b:04:9f:64:f8:a1:d8:21:6d:94:
    05:89:6b:56:7b:9e:20:d2:0a:2e:81:35:1a:86:57:
    8c:aa:fb:fe:4b:8a:eb:00:1e:e6:10:6e:c3:3b:b5:
    d9
prime1:
    00:ff:81:86:9a:1c:e4:9a:74:04:3e:04:39:15:e1:
    34:85:d6:fb:d3:27:63:f7:95:a6:1b:52:55:6a:32:
    1e:ba:44:43:a7:92:1a:53:b5:09:3d:bd:8f:98:5c:
    99:77:5a:5b:0d:b8:fc:65:13:e9:47:2c:13:46:35:
    66:38:1e:f7:27:0c:43:76:d9:3f:aa:db:1b:b9:20:
    d8:45:90:85:ae:0f:02:44:4c:fb:a1:cf:d1:41:0a:
    c7:d3:c5:8a:80:21:3b:74:f5:b4:02:f8:74:6d:09:
    42:06:36:b1:45:f4:82:49:04:c6:59:85:2b:36:ad:
    b1:33:15:ca:e3:dd:f0:3e:89
prime2:
    00:e6:a9:b1:12:e9:d5:00:05:85:e9:f5:74:51:7a:
    2a:85:7e:fa:60:7d:39:e3:43:40:17:ed:8f:d2:da:
    27:ca:a0:44:b5:2f:3e:f8:d7:d8:56:90:f7:35:71:
    3d:fa:5a:c6:17:6b:b4:ec:5b:03:1e:1e:a5:cf:d6:
    eb:d6:b3:da:b3:29:cc:da:90:c5:a3:a3:21:7c:3c:
    d8:39:e2:40:7e:da:d5:fe:fb:f5:ee:50:e9:34:52:
    0f:03:d8:cd:15:21:9c:40:8c:5e:e2:14:da:20:b1:
    3f:82:31:04:c9:cc:e9:40:30:6d:a8:ac:4c:f6:c5:
    b0:8f:8f:52:13:2d:55:8f:2f
exponent1:
    00:85:14:9a:de:34:84:61:6a:62:37:47:0d:d0:b6:
    9f:1b:c3:11:21:37:18:1b:81:c7:a5:dd:69:7d:c9:
    a3:35:93:8e:c5:7e:14:d6:5a:a9:f8:8d:7e:78:76:
    6a:bc:be:c4:44:4e:80:af:c9:02:2d:3e:e8:bf:1d:
    db:23:0a:05:e3:41:c0:f5:eb:4b:fd:1a:e8:c2:b1:
    37:d4:6b:e5:24:f6:ce:50:72:e4:71:b0:83:a6:64:
    0e:16:e0:82:36:20:99:0e:5f:57:a6:60:70:8b:c6:
    51:ac:58:da:56:bc:77:0b:bf:3f:ec:aa:af:0a:68:
    c7:ad:fb:00:d5:54:e8:e8:39
exponent2:
    15:ea:9b:b3:93:5a:34:b5:51:a3:08:3a:74:1f:6a:
    78:e2:b6:c1:82:44:84:ce:78:01:8e:05:f3:5f:dd:
    16:08:a2:5e:a0:cd:97:f1:52:51:ef:56:3d:d2:b3:
    b3:dc:fa:23:71:8d:70:43:b9:89:1c:1a:5f:24:29:
    a6:6d:d2:62:e1:9e:e0:49:8f:2d:dc:2b:2b:55:d0:
    a9:b7:50:af:7c:f5:86:53:c4:6b:4f:6e:c9:14:de:
    ee:5b:a4:28:d4:d7:b6:de:5f:89:95:b7:a0:11:97:
    5a:34:74:23:04:80:49:24:10:d7:4c:ff:c7:16:c3:
    8e:f0:6c:38:fc:3e:bb:eb
coefficient:
    38:b5:03:28:82:8e:65:af:b2:7d:a4:9a:01:64:3f:
    16:41:53:d2:e7:5d:d7:c0:11:8c:ee:92:b1:4c:5a:
    72:8f:51:6f:a7:78:48:55:9f:33:01:f8:1e:e9:c4:
    63:b3:83:c5:c5:0a:48:17:9f:57:ec:64:32:f8:7f:
    55:1f:7c:9d:ef:a1:e5:8f:9e:04:91:97:d3:73:1a:
    55:33:1d:0a:3a:7d:62:8a:8e:16:05:11:ca:11:91:
    66:68:dd:19:09:6b:24:b1:18:ad:75:74:d7:f5:ed:
    6c:5a:f6:4e:d6:99:e3:fb:05:e0:0f:28:d2:1b:d8:
    5f:fa:d2:52:42:e6:dc:4f

Tip

Cũng có thể sử dụng subcommand genrsa để tạo ra private key của RSA một cách ngắn gọn hơn:

openssl genrsa -out private.key 2048

Extracting Public Key

File chứa private key chứa cả private key và public key. Có thể trích xuất public key từ private key bằng câu lệnh sau:

openssl rsa -in private.key -pubout -out public.key

Output có thể có dạng như sau:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5je8K8A/9MsO+SBqjJX+
QdcruDtrXehThB97vLKCHQrtuLkQxalb4g8iAPtztCjgT4Ei331U7I/Q0+2KR5iN
3RM3Mhfl+SIcyGghNqx3YTFfOCUHnvHe3YdLFNyIHTcFAUXxrtOg2v5IEBnHvl8V
nxU8QgY1iMmsieYrx8G9gJXgpfEjD1Gaz3mQNZooJgpXTUTF78jcdjyCiSnaKts8
jzF3L4s0VKeWH/XjldAOBNeRUTIMsQit5uISXG2ppmAltrslT+yRmkYigGkpmjZ6
JzokXLu7Pwc8dXYn2Pfp2W2WvIKbJvefhq45M+1g8TJIIDJ+NuiuTUnbZPq8yocC
JwIDAQAB
-----END PUBLIC KEY-----

Decode như sau:

openssl rsa -text -pubin -in public.key -noout

Output:

Public-Key: (2048 bit)
Modulus:
    00:e6:37:bc:2b:c0:3f:f4:cb:0e:f9:20:6a:8c:95:
    fe:41:d7:2b:b8:3b:6b:5d:e8:53:84:1f:7b:bc:b2:
    82:1d:0a:ed:b8:b9:10:c5:a9:5b:e2:0f:22:00:fb:
    73:b4:28:e0:4f:81:22:df:7d:54:ec:8f:d0:d3:ed:
    8a:47:98:8d:dd:13:37:32:17:e5:f9:22:1c:c8:68:
    21:36:ac:77:61:31:5f:38:25:07:9e:f1:de:dd:87:
    4b:14:dc:88:1d:37:05:01:45:f1:ae:d3:a0:da:fe:
    48:10:19:c7:be:5f:15:9f:15:3c:42:06:35:88:c9:
    ac:89:e6:2b:c7:c1:bd:80:95:e0:a5:f1:23:0f:51:
    9a:cf:79:90:35:9a:28:26:0a:57:4d:44:c5:ef:c8:
    dc:76:3c:82:89:29:da:2a:db:3c:8f:31:77:2f:8b:
    34:54:a7:96:1f:f5:e3:95:d0:0e:04:d7:91:51:32:
    0c:b1:08:ad:e6:e2:12:5c:6d:a9:a6:60:25:b6:bb:
    25:4f:ec:91:9a:46:22:80:69:29:9a:36:7a:27:3a:
    24:5c:bb:bb:3f:07:3c:75:76:27:d8:f7:e9:d9:6d:
    96:bc:82:9b:26:f7:9f:86:ae:39:33:ed:60:f1:32:
    48:20:32:7e:36:e8:ae:4d:49:db:64:fa:bc:ca:87:
    02:27
Exponent: 65537 (0x10001)

Certificate Signing Request (CSR)

Được định nghĩa trong tiêu chuẩn PKCS#10, CSR chứa các thông tin về danh tính của cá nhân hoặc tổ chức mà CA cần dùng để tạo chứng chỉ SSL/TLS, bao gồm:

  • Country (C) - bắt buộc: mã quốc gia 2 ký tự của tổ chức.
  • State/County/Region (S): bang/vùng của tổ chức, không được viết tắt.
  • City/Locality (L): thành phố của tổ chức, không được viết tắt.
  • Organization (O) - bắt buộc: tên tổ chức hợp pháp, không viết tắt và không thêm các hậu tố chẳng hạn như “Inc.”, “Corp.”, …
  • Organizational unit (OU): department của tổ chức.
  • Common name (CN) - bắt buộc: tên miền của server. Ví dụ: *.example.com, www.example.com, mail.example.com.
  • Email address: địa chỉ email của tổ chức.

Ngoài ra, CSR còn chứa public key dùng để mã hóa dữ liệu trên đường truyền kèm theo các thông tin về loại khóa và độ dài khóa cũng như là chữ ký trên các

Tạo CSR từ private key như sau:

openssl req -new -key private.key -out request.csr

Giải thích câu lệnh trên:

  • req là subcommand dùng để tạo CSR và quản lý các certificate request.
  • -new: cho biết rằng ta cần tạo mới CSR.
  • -key: private key dùng để tạo CSR.
  • -out: tên file chứa CSR.

Câu lệnh sẽ đưa ra một loạt các câu hỏi về các thông tin có trong CSR:

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]:VN
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:company
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.company.com
Email Address []:company@email.com

Nếu không nhập gì mà nhấn Enter thì nó sẽ lấy giá trị từ file cấu hình của OpenSSL ở trong OPENSSLDIR. Trong trường hợp muốn để trống thì nhập ký tự . rồi nhấn Enter.

CSR được tạo ra có dạng như sau:

-----BEGIN CERTIFICATE REQUEST-----
MIICtTCCAZ0CAQAwcDELMAkGA1UEBhMCVk4xEzARBgNVBAgMClNvbWUtU3RhdGUx
EDAOBgNVBAoMB2NvbXBhbnkxGDAWBgNVBAMMD3d3dy5jb21wYW55LmNvbTEgMB4G
CSqGSIb3DQEJARYRY29tcGFueUBlbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDmN7wrwD/0yw75IGqMlf5B1yu4O2td6FOEH3u8soIdCu24
uRDFqVviDyIA+3O0KOBPgSLffVTsj9DT7YpHmI3dEzcyF+X5IhzIaCE2rHdhMV84
JQee8d7dh0sU3IgdNwUBRfGu06Da/kgQGce+XxWfFTxCBjWIyayJ5ivHwb2AleCl
8SMPUZrPeZA1migmCldNRMXvyNx2PIKJKdoq2zyPMXcvizRUp5Yf9eOV0A4E15FR
MgyxCK3m4hJcbammYCW2uyVP7JGaRiKAaSmaNnonOiRcu7s/Bzx1difY9+nZbZa8
gpsm95+Grjkz7WDxMkggMn426K5NSdtk+rzKhwInAgMBAAGgADANBgkqhkiG9w0B
AQsFAAOCAQEAln+JcVWfvsA1OzIB4rQLbtSCulIBaMIcdETVgYrc6tjoR1fCxSFU
N9cHqUr/MMViTGsScTdDt2zFyXO/1j7u6iV0zYqffoZt4XgwqjJpiQXh3cWBOxJD
ZT1NuYWPScwSJ9p+7he34eel3tuEANju96W3zyoq2BDu358XWRhkS4IF/iFr0TL/
VMMyaCZHPZbKGeGea83bA81WTN40vlIirOG81zLlwcyAjHzTIE+trFkc6JpIVQmn
P8d4L1mm0YJGj8tUiLFkaNRW6UmjP/n4qBzAgox1P65DvQLXtGU/q7C/GHM0am7a
Wx8azADPiqqjnSArdNRLzQH/C41MSMgFLA==
-----END CERTIFICATE REQUEST-----

Using the -subj Switch

Có thể cung cấp tất cả các thông tin trong một câu lệnh duy nhất bằng cách sử dụng option -subj:

openssl req -new -key private.key -out request.csr \
-subj "/C=US/ST=Utah/L=Lehi/O=Your Company/OU=IT/CN=yourdomain.com"

Creating Your CSR with One Command

Thay vì tạo private key rồi tạo CSR, chúng ta có thể gom hai bước này trong một câu lệnh như sau:

openssl req -new \
-newkey rsa:2048 -nodes -keyout private.key \
-out request.csr \
-subj "/C=US/ST=Utah/L=Lehi/O=Your Company, Inc./OU=IT/CN=yourdomain.com"

Option -nodes cho biết private key không sử dụng passphrase.

Verifying CSR Information

Kiểm tra thông tin trong CSR bằng câu lệnh sau:

openssl req -text -in request.csr -noout -verify

Option -verify giúp kiểm tra signature của file nhằm đảm bảo nó không bị chỉnh sửa.

Output có dạng như sau:

Certificate request self-signature verify OK
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = VN, ST = Some-State, O = company, CN = www.company.com, emailAddress = company@email.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:e6:37:bc:2b:c0:3f:f4:cb:0e:f9:20:6a:8c:95:
                    fe:41:d7:2b:b8:3b:6b:5d:e8:53:84:1f:7b:bc:b2:
                    82:1d:0a:ed:b8:b9:10:c5:a9:5b:e2:0f:22:00:fb:
                    73:b4:28:e0:4f:81:22:df:7d:54:ec:8f:d0:d3:ed:
                    8a:47:98:8d:dd:13:37:32:17:e5:f9:22:1c:c8:68:
                    21:36:ac:77:61:31:5f:38:25:07:9e:f1:de:dd:87:
                    4b:14:dc:88:1d:37:05:01:45:f1:ae:d3:a0:da:fe:
                    48:10:19:c7:be:5f:15:9f:15:3c:42:06:35:88:c9:
                    ac:89:e6:2b:c7:c1:bd:80:95:e0:a5:f1:23:0f:51:
                    9a:cf:79:90:35:9a:28:26:0a:57:4d:44:c5:ef:c8:
                    dc:76:3c:82:89:29:da:2a:db:3c:8f:31:77:2f:8b:
                    34:54:a7:96:1f:f5:e3:95:d0:0e:04:d7:91:51:32:
                    0c:b1:08:ad:e6:e2:12:5c:6d:a9:a6:60:25:b6:bb:
                    25:4f:ec:91:9a:46:22:80:69:29:9a:36:7a:27:3a:
                    24:5c:bb:bb:3f:07:3c:75:76:27:d8:f7:e9:d9:6d:
                    96:bc:82:9b:26:f7:9f:86:ae:39:33:ed:60:f1:32:
                    48:20:32:7e:36:e8:ae:4d:49:db:64:fa:bc:ca:87:
                    02:27
                Exponent: 65537 (0x10001)
        Attributes:
            (none)
            Requested Extensions:
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        96:7f:89:71:55:9f:be:c0:35:3b:32:01:e2:b4:0b:6e:d4:82:
        ba:52:01:68:c2:1c:74:44:d5:81:8a:dc:ea:d8:e8:47:57:c2:
        c5:21:54:37:d7:07:a9:4a:ff:30:c5:62:4c:6b:12:71:37:43:
        b7:6c:c5:c9:73:bf:d6:3e:ee:ea:25:74:cd:8a:9f:7e:86:6d:
        e1:78:30:aa:32:69:89:05:e1:dd:c5:81:3b:12:43:65:3d:4d:
        b9:85:8f:49:cc:12:27:da:7e:ee:17:b7:e1:e7:a5:de:db:84:
        00:d8:ee:f7:a5:b7:cf:2a:2a:d8:10:ee:df:9f:17:59:18:64:
        4b:82:05:fe:21:6b:d1:32:ff:54:c3:32:68:26:47:3d:96:ca:
        19:e1:9e:6b:cd:db:03:cd:56:4c:de:34:be:52:22:ac:e1:bc:
        d7:32:e5:c1:cc:80:8c:7c:d3:20:4f:ad:ac:59:1c:e8:9a:48:
        55:09:a7:3f:c7:78:2f:59:a6:d1:82:46:8f:cb:54:88:b1:64:
        68:d4:56:e9:49:a3:3f:f9:f8:a8:1c:c0:82:8c:75:3f:ae:43:
        bd:02:d7:b4:65:3f:ab:b0:bf:18:73:34:6a:6e:da:5b:1f:1a:
        cc:00:cf:8a:aa:a3:9d:20:2b:74:d4:4b:cd:01:ff:0b:8d:4c:
        48:c8:05:2c

Generating a Self-Signed Digital Cetificate

Sau khi có CSR thì chúng ta có thể gửi cho CA ký hoặc tự ký để tạo chứng chỉ.

Tạo ra chứng chỉ tự ký từ CSR và private key.

openssl x509 -req \
		-sha256 \
		-days 365 \
		-in request.csr \
		-signkey private.key \
		-out certificate.crt

Giải thích câu lệnh trên:

  • x509: là một chuẩn định dạng của chứng chỉ khóa công khai2. Subcommand này giúp xem và quản lý các loại chứng chỉ thuộc chuẩn X509.
  • -req: cho biết câu lệnh liên quan đến CSR
  • -sha256: thuật toán dùng để hash chứng chỉ
  • -days: thời hạn sử dụng của certificate (đơn vị là ngày)
  • -in: CSR
  • -signKey: private key
  • -out: tên file chứa chứng chỉ

Xem thông tin của chứng chỉ vừa tạo:

openssl x509 -text -in certificate.crt -noout

Output:

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            04:d4:c0:3a:4d:a4:21:c1:d9:75:9a:21:2b:17:70:20:a5:e5:6c:29
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = VN, ST = Some-State, O = company, CN = www.company.com, emailAddress = company@email.com
        Validity
            Not Before: Apr 20 15:50:51 2024 GMT
            Not After : Apr 20 15:50:51 2025 GMT
        Subject: C = VN, ST = Some-State, O = company, CN = www.company.com, emailAddress = company@email.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:e6:37:bc:2b:c0:3f:f4:cb:0e:f9:20:6a:8c:95:
                    fe:41:d7:2b:b8:3b:6b:5d:e8:53:84:1f:7b:bc:b2:
                    82:1d:0a:ed:b8:b9:10:c5:a9:5b:e2:0f:22:00:fb:
                    73:b4:28:e0:4f:81:22:df:7d:54:ec:8f:d0:d3:ed:
                    8a:47:98:8d:dd:13:37:32:17:e5:f9:22:1c:c8:68:
                    21:36:ac:77:61:31:5f:38:25:07:9e:f1:de:dd:87:
                    4b:14:dc:88:1d:37:05:01:45:f1:ae:d3:a0:da:fe:
                    48:10:19:c7:be:5f:15:9f:15:3c:42:06:35:88:c9:
                    ac:89:e6:2b:c7:c1:bd:80:95:e0:a5:f1:23:0f:51:
                    9a:cf:79:90:35:9a:28:26:0a:57:4d:44:c5:ef:c8:
                    dc:76:3c:82:89:29:da:2a:db:3c:8f:31:77:2f:8b:
                    34:54:a7:96:1f:f5:e3:95:d0:0e:04:d7:91:51:32:
                    0c:b1:08:ad:e6:e2:12:5c:6d:a9:a6:60:25:b6:bb:
                    25:4f:ec:91:9a:46:22:80:69:29:9a:36:7a:27:3a:
                    24:5c:bb:bb:3f:07:3c:75:76:27:d8:f7:e9:d9:6d:
                    96:bc:82:9b:26:f7:9f:86:ae:39:33:ed:60:f1:32:
                    48:20:32:7e:36:e8:ae:4d:49:db:64:fa:bc:ca:87:
                    02:27
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        79:bc:fa:e9:17:b1:57:a5:d2:2e:99:f3:17:41:41:5b:99:f1:
        99:7b:34:32:ea:42:b3:39:3a:fa:b6:68:af:f9:d3:d5:66:cb:
        34:8d:3a:0e:0b:1d:8c:d9:81:34:1b:3c:21:6b:85:06:77:32:
        0e:d1:4e:3e:6c:19:d0:27:bc:30:f2:51:51:a1:ce:65:20:6a:
        56:dc:e2:c8:f4:9d:54:fe:a7:d4:78:73:d5:08:4e:f5:f3:37:
        9b:cd:b8:e0:2b:a9:26:d8:8e:91:57:0c:88:9f:89:46:87:9b:
        2c:50:a1:e0:5b:70:27:12:3f:c9:9b:89:c6:48:a0:14:e7:e5:
        01:ee:48:47:94:71:00:92:77:cd:54:52:62:43:d9:e8:b8:aa:
        7b:95:34:d8:e7:69:65:3b:9d:9d:8b:5c:b6:57:9c:1e:f7:6e:
        a5:a3:e6:f5:13:15:61:82:a0:6f:3f:cc:a8:bd:22:60:e5:78:
        ee:7a:b3:82:63:91:fe:c1:fe:e0:05:92:47:d3:2f:f8:be:2f:
        b7:7d:f5:79:5e:43:f5:14:19:fe:1e:cb:22:37:43:d7:b9:b2:
        37:cc:48:8a:47:d7:3e:e8:7c:ed:ac:00:fe:73:d4:27:cc:e9:
        36:0c:99:98:fa:08:ee:34:90:42:93:11:33:6e:7c:e4:46:de:
        7f:66:82:c5

Có thể nói, chứng chỉ số có bản chất là chữ ký số với document được ký là các thông tin định danh trong CSR.

Tip

Có thể tạo private key và self-signed certificate trong cùng một câu lệnh:

openssl req \
		-newkey rsa:4096  \
		-x509  \
		-sha512 \
		-days 365 \
		-nodes \
		-out certificate.crt \
		-keyout private.key

Giải thích câu lệnh:

  • -newkey: tạo mới private key.
  • -x509: cho biết rằng ta không muốn tạo CSR mà muốn tạo self-signed certificate.

Viewing Certificate Information

Để kiểm tra xem public key và private key có khớp với nhau hay không thì ta cần trích xuất public key từ private key, CSR và chứng chỉ rồi so sánh giá trị băm của chúng với nhau:

openssl pkey -pubout -in private.key | openssl sha256
 
openssl req -pubkey -in request.csr -noout | openssl sha256
 
openssl x509 -pubkey -in certificate.crt -noout | openssl sha256
list
from outgoing([[Open SSL]])
sort file.ctime asc

Resources

Footnotes

  1. định dạng PEM (Privacy Enhanced Mail) sẽ bắt đầu bằng -----BEGIN <type>----- và kết thúc bằng -----END <type>-----. Ở giữa là dữ liệu của khóa/chứng chỉ được encode dưới dạng base64 (do các thông điệp gửi qua mail truyền thống chỉ có thể chứa dữ liệu dạng text thay vì binary). Tham khảo: What Is a PEM File? (lifewire.com).

  2. xem thêm X.509 Certificate.