4 phút để đọc

Đây là hướng dẫn đơn giản để tạo nhanh một RootCA, tạo khóa, cấp certificate, và export tệp tin PKCS#12. Đồng thời cũng giới thiệu một số lệnh để xem hoặc kiểm tra chúng.

Tạo CA với certificate tự ký

Chúng ta sẽ tạo hai thành phần của Root CA là khóa riêng ca_key.pem và certificate tự ký ca_cert.pem bằng câu lệnh sau:

openssl req -x509 -newkey rsa:4096 -keyout ca_key.pem -out ca_cert.pem -nodes -days 365 -subj "/CN=localhost/O=Certificate\ Demo"

Câu lệnh trên thực hiện 3 công đoạn gồm:

  1. Tạo khóa RSA 4096 bit (-newkey), lưu khóa vào file ca_key.pem (-keyout), và không sử dụng mã hóa DES (-nodes)
  2. Tạo một Certificate Signing Request (CSR) hiệu lực trong 365 ngày (subj, -days)
  3. Thực hiện ký lên CSR bằng khóa riêng vừa tạo và lưu kết quả vào file ca_cert.pem theo chuẩn X.509 (-x509, -out)

Định dạng PEM là định dạng mặc định, dữ liệu sẽ được biên mã base64 với phần header và footer trông sẽ như sau:

-----BEGIN CERTIFICATE/PRIVATE KEY-----
MIIFTTCCAzWgAwIBAgIUEluiBWNg5mBOFzEHjIfVKJ5cTPIwDQYJKoZIhvcNAQEL
BQAwNjESMBAGA1UEAwwJbG9jYWxob3N0MSAwHgYDVQQKDBdDbGllbnQgQ2VydGlm
...
-----END CERTIFICATE/PRIVATE KEY-----

Một định dạng khác là DER, được biên mã nhị phân. Một số trường hợp khác sử dụng .key, hoặc .crt để ám chỉ ý nghĩa của file, tuy nhiên định dạng bên trong của chúng vẫn là PEM hoặc DER.

Tạo khóa riêng và CSR cho user

Chúng ta sẽ tạo khóa riêng alice_key.pem và CSR alice_csr.pem cho Alice. Khóa của user nên có số bít nhỏ hơn so với CA.

openssl req -newkey rsa:2048 -keyout alice_key.pem -out alice_csr.pem -nodes -subj "/CN=Alice"

Cấp certificate cho user

CA tạo ra certificate cho user bằng cách ký lên CSR của user đó. Để thực hiện điều này ra dùng hai đối số -CA-CAkey. Thời gian hiệu lực phải nhỏ hơn thời gian hiệu lực của RootCA, ta sẽ sử dụng -days để xác định thời gian này.

openssl x509 -req -in alice_csr.pem -CA ca_cert.pem -CAkey ca_key.pem -out alice_cert.pem -set_serial 01 -days 180

Tạo tệp PKCS#12

Chúng ta có thể gói cả khóa riêng và certificate vào trong một tệp .p12 hoặc .pfx, sử dụng định dạng PKCS#12. Quá trình cũng yêu cầu nhập một mật khẩu để bảo vệ khóa.

openssl pkcs12 -export -in alice_cert.pem -inkey alice_key.pem -out alice.p12 -name "alice"

Kiểm tra/xem khóa, CSR, certificate, PKCS#12

Kiểm tra khóa:

openssl rsa -check -in alice_key.pem

Kiểm tra CSR:

openssl req -text -noout -verify -in alice_csr.pem

Xem certificate:

openssl x509 -text -noout -in alice_cert.pem

Xác minh certificate

openssl verify -CAfile ca_cert.pem alice_cert.pem

Xem tệp PKCS#12:

openssl pkcs12 -info -in alice.p12

Ký số và xác thực chữ ký

Thực hiện ký số

Alice sử dụng thuật toán băm SHA-256 và khóa riêng alice_key.pem để ký lên dữ liệu alicedata.txt. Kết quả là chữ ký số sẽ được lưu vào file alicedata.sign. Sau đó Alice sẽ gửi dữ liệu cùng chữ ký số của mình cho Bob.

openssl dgst -sha256 -sign alice_key.pem -out alicedata.sign alicedata.txt

Chữ ký số alicedata.sign là tệp tin nhị phân, nên không thể mở xem như thông thường. Để xem nội dung của alicedata.sign ta có thể sử dụng lệnh xxd hoặc thực hiện biên mã base64.

Sử dụng lệnh xxd

xxd alicedata.sign
00000000: a941 cfb0 9d9d 2ab2 0e52 7ed7 4673 18e8  .A....*..R~.Fs..
00000010: 265e 4554 450f a53c 9907 2c52 7733 7b5e  &^ETE..<..,Rw3{^
00000020: 1119 6bd8 e2f1 8448 825b 4538 1bd5 787d  ..k....H.[E8..x}
00000030: bf01 e487 cd21 55f4 97ce d503 121b dc9a  .....!U.........
00000040: 435f 5fae 68c7 b8a2 5779 696c e569 ac80  C__.h...Wyil.i..
00000050: 1745 5495 2515 e36f c4b9 0e26 e17a d0e2  .ET.%..o...&.z..
00000060: 5d43 ae07 92f2 5a94 5d9a 889d bd9d b9ee  ]C....Z.].......
00000070: c66d ac6d 0419 6cc3 2fdb f5d4 2a64 6353  .m.m..l./...*dcS
00000080: cc04 6907 b070 048e b054 4983 dbd7 8c23  ..i..p...TI....#
00000090: 6352 4bea 1355 e501 cc9d af6f 0cd3 8ad8  cRK..U.....o....
000000a0: 8603 5bf0 0305 319e b5ab 2373 3088 84df  ..[...1...#s0...
000000b0: a235 ec19 ba0e b7c6 2796 88d9 3d4b 2648  .5......'...=K&H
000000c0: da76 36f2 dde6 beb4 f88d 7d40 0fb0 0387  .v6.......}@....
000000d0: e820 21bc 8a5c 7599 dd5f 0e37 7638 d8a3  . !..\u.._.7v8..
000000e0: 739a 30d3 bdd8 3b26 f5dd 1f74 e434 35e7  s.0...;&...t.45.
000000f0: b54e a4ab bd6d 9e89 7f73 02f0 59d3 e280  .N...m...s..Y...

Hoặc thực hiện biên mã base64

openssl base64 -in alicedata.sign -out alicedata.sign.txt
qUHPsJ2dKrIOUn7XRnMY6CZeRVRFD6U8mQcsUncze14RGWvY4vGESIJbRTgb1Xh9
vwHkh80hVfSXztUDEhvcmkNfX65ox7iiV3lpbOVprIAXRVSVJRXjb8S5DibhetDi
XUOuB5LyWpRdmoidvZ257sZtrG0EGWzDL9v11CpkY1PMBGkHsHAEjrBUSYPb14wj
Y1JL6hNV5QHMna9vDNOK2IYDW/ADBTGetasjczCIhN+iNewZug63xieWiNk9SyZI
2nY28t3mvrT4jX1AD7ADh+ggIbyKXHWZ3V8ON3Y42KNzmjDTvdg7JvXdH3TkNDXn
tU6kq71tnol/cwLwWdPigA==

Thực hiện xác thực chữ ký

Ta cần thực hiện các hành động của Bob ở một thư mục khác với thư mục của Alice. Trong thư mục của Bob sẽ có certificate của Alice alice_cert.pem, dữ liệu Alice gửi alicedata.txt (ví dụ: là một file text với nội dung bất kỳ), và chữ ký số của Alice alicedata.sign dạng bị phân hoặc alicedata.sign.txt dạng base64).

Từ phía Bob, Bob đã có certificate của Alice, nên anh ta sẽ bóc lấy public key của Alice:

openssl x509 -pubkey -noout -in alice_cert.pem -out alice_publickey.pem
  • Trường hợp 1: Bob nhận được chữ ký số của Alice ở dạng nhị phân alicedata.sign thì Bob có thể sử dụng được ngay để xác thực.

  • Trường hợp 2: Bob nhận được chữ ký số ở dạng base64 alicedata.sign.txt thì Bob sẽ phải thực hiện bước giải biên mã, để chuyển chữ ký về định dạng nhị phân ban đầu:

openssl base64 -d -in alicedata.sign.txt -out alicedata.sign

Bob thực hiện xác thực chữ ký của Alice:

openssl dgst -sha256 -verify alice_publickey.pem -signature alicedata.sign alicedata.txt
Verified OK