Cách sử dụng hướng dẫn này
- Nếu bạn chưa quen với yêu cầu ký chứng chỉ (CSR), hãy đọc phần đầu tiên.
- Ngoài phần đầu tiên, hướng dẫn này được trình bày theo dạng cheat sheet: danh sách các đoạn lệnh độc lập.
- Bạn có thể nhảy đến bất kỳ phần nào có liên quan đến tác vụ bạn cần thực hiện (Gợi ý: sử dụng menu Mục lục hoặc chức năng Tìm kiếm của trình duyệt).
- Hầu hết các lệnh là các lệnh một dòng đã được mở rộng thành nhiều dòng (sử dụng ký tự “\”) để rõ ràng hơn.
Về yêu cầu ký chứng chỉ (CSRs)
Nếu bạn muốn nhận chứng chỉ SSL từ một nhà cung cấp chứng chỉ thương mại (CA), bạn cần phải tạo một yêu cầu ký chứng chỉ (CSR). Một CSR chủ yếu bao gồm cặp khóa công khai và thông tin bổ sung. Cả hai thành phần này sẽ được chèn vào chứng chỉ khi nó được ký.
Mỗi khi tạo một CSR, bạn sẽ được yêu cầu cung cấp thông tin liên quan đến chứng chỉ. Thông tin này được gọi là Distinguished Name (DN). Một trường quan trọng trong DN là Common Name (CN), và nó phải là tên miền đầy đủ (FQDN) của máy chủ mà bạn dự định sử dụng chứng chỉ. Bạn cũng có thể bỏ qua các nhắc tương tác khi tạo CSR bằng cách truyền thông tin qua dòng lệnh hoặc từ một tập tin.
Các mục khác trong DN cung cấp thông tin bổ sung về doanh nghiệp hoặc tổ chức của bạn. Nếu bạn mua chứng chỉ SSL từ một CA, thường yêu cầu các trường bổ sung như “Organization” phản ánh chính xác thông tin của tổ chức bạn.
Dưới đây là một ví dụ về giao diện nhắc thông tin CSR:
--- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:Brooklyn Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company Organizational Unit Name (eg, section) []:Technology Division Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com Email Address []:
Nếu bạn muốn trả lời nhắc thông tin CSR một cách phi tương tác, bạn có thể sử dụng tùy chọn -subj trong bất kỳ lệnh OpenSSL nào yêu cầu thông tin CSR. Ví dụ, với thông tin như trên:
-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"
Giờ đây, khi bạn đã hiểu về CSR, hãy tự do nhảy đến phần nào của hướng dẫn phù hợp với nhu cầu sử dụng OpenSSL của bạn.
Tạo CSR
Phần này bao gồm các lệnh OpenSSL liên quan đến việc tạo CSR (và private key nếu chưa có). CSR có thể được sử dụng để yêu cầu chứng chỉ SSL từ một CA.
Hãy nhớ rằng bạn có thể thêm thông tin CSR một cách phi tương tác bằng cách dùng tùy chọn -subj như đã đề cập ở phần trước.
Tạo Private Key và CSR
Sử dụng phương pháp này nếu bạn muốn sử dụng HTTPS (HTTP qua TLS) để bảo mật máy chủ web Apache HTTP hoặc Nginx của bạn và muốn dùng một CA để cấp chứng chỉ SSL.
CSR được tạo ra có thể được gửi đến CA để yêu cầu cấp chứng chỉ SSL có chữ ký của CA. Nếu CA của bạn hỗ trợ SHA-2, hãy thêm tùy chọn -sha256 để ký CSR bằng SHA-2.
Lệnh sau tạo một private key 2048-bit (domain.key) và một CSR (domain.csr) từ đầu:
openssl req \
-newkey rsa:2048 -nodes -keyout domain.key \
-out domain.csr
Nhập các thông tin theo nhắc CSR để hoàn tất quá trình.
Tùy chọn -newkey rsa:2048 chỉ định rằng key sẽ có độ dài 2048 bit, được tạo bằng thuật toán RSA. Tùy chọn -nodes chỉ định rằng private key không được mã hóa bằng pass phrase. Tùy chọn -new (không cần chỉ định vì được ngầm định) cho biết rằng đang tạo một CSR.
Tạo CSR từ Private Key Đã Tồn Tại
Sử dụng phương pháp này nếu bạn đã có một private key mà bạn muốn dùng để yêu cầu chứng chỉ từ CA.
Lệnh sau tạo một CSR mới (domain.csr) dựa trên private key hiện có (domain.key):
openssl req \
-key domain.key \
-new -out domain.csr
Nhập thông tin CSR theo nhắc để hoàn tất quá trình.
Tùy chọn -key chỉ định private key đã tồn tại sẽ được dùng để tạo CSR. Tùy chọn -new cho biết rằng đang tạo một CSR.
Tạo CSR từ chứng chỉ và Private Key đã tồn tại
Sử dụng phương pháp này nếu bạn muốn gia hạn chứng chỉ hiện có nhưng bạn hoặc CA của bạn không có CSR gốc vì một lý do nào đó. Nó giúp bạn tiết kiệm công sức nhập lại thông tin CSR, vì thông tin đó được trích xuất từ chứng chỉ hiện có.
Lệnh sau tạo một CSR mới (domain.csr) dựa trên chứng chỉ hiện có (domain.crt) và private key (domain.key):
openssl x509 \
-in domain.crt \
-signkey domain.key \
-x509toreq -out domain.csr
Tùy chọn -x509toreq chỉ định rằng bạn đang sử dụng chứng chỉ X509 để tạo CSR.
Tạo chứng chỉ SSL
Nếu bạn muốn sử dụng chứng chỉ SSL để bảo mật một dịch vụ nhưng không cần chứng chỉ có chữ ký của CA, một giải pháp hợp lệ (và miễn phí) là tự ký chứng chỉ của mình.
Một loại chứng chỉ phổ biến mà bạn có thể tự cấp là chứng chỉ tự ký (self-signed certificate). Chứng chỉ tự ký là chứng chỉ được ký bởi chính private key của nó. Chứng chỉ tự ký có thể dùng để mã hóa dữ liệu như chứng chỉ có chữ ký của CA, nhưng trình duyệt của người dùng sẽ cảnh báo rằng chứng chỉ không được tin cậy. Do đó, chứng chỉ tự ký chỉ nên được sử dụng nếu bạn không cần chứng minh danh tính của dịch vụ với người dùng (ví dụ: các server không sản xuất hoặc không công khai).
Phần này bao gồm các lệnh OpenSSL liên quan đến việc tạo chứng chỉ tự ký.
Tạo chứng chỉ tự ký
Sử dụng phương pháp này nếu bạn muốn sử dụng HTTPS để bảo mật máy chủ web Apache HTTP hoặc Nginx, và không yêu cầu chứng chỉ được ký bởi CA.
Lệnh sau tạo một private key 2048-bit (domain.key) và một chứng chỉ tự ký (domain.crt) từ đầu:
openssl req \
-newkey rsa:2048 -nodes -keyout domain.key \
-x509 -days 365 -out domain.crt
Nhập thông tin CSR theo nhắc để hoàn tất quá trình.
Tùy chọn -x509 báo cho lệnh req tạo một chứng chỉ tự ký. Tùy chọn -days 365 chỉ định rằng chứng chỉ sẽ có hiệu lực trong 365 ngày. Một CSR tạm thời được tạo ra để thu thập thông tin liên quan đến chứng chỉ.
Tạo chứng chỉ tự ký từ Private Key đã tồn tại
Sử dụng phương pháp này nếu bạn đã có một private key mà bạn muốn dùng để tạo chứng chỉ tự ký.
Lệnh sau tạo chứng chỉ tự ký (domain.crt) từ private key hiện có (domain.key):
openssl req \
-key domain.key \
-new \
-x509 -days 365 -out domain.crt
Nhập thông tin CSR theo nhắc để hoàn tất quá trình. Tùy chọn -x509 báo cho lệnh req tạo một chứng chỉ tự ký. Tùy chọn -days 365 chỉ định thời gian hiệu lực của chứng chỉ. Tùy chọn -new kích hoạt nhắc nhập thông tin CSR.
Tạo chứng chỉ tự ký từ Private Key và CSR đã tồn tại
Sử dụng phương pháp này nếu bạn đã có private key và CSR, và bạn muốn tạo chứng chỉ tự ký với chúng.
Lệnh sau tạo chứng chỉ tự ký (domain.crt) từ private key (domain.key) và CSR (domain.csr):
openssl x509 \
-signkey domain.key \
-in domain.csr \
-req -days 365 -out domain.crt
Tùy chọn -days 365 chỉ định thời gian hiệu lực của chứng chỉ.
Xem chứng chỉ
Các tập tin chứng chỉ và CSR được mã hóa theo định dạng PEM, không dễ đọc đối với con người. Phần này bao gồm các lệnh OpenSSL xuất ra nội dung thực của các tập tin mã hóa PEM.
Xem nội dung CSR
Lệnh sau cho phép bạn xem và xác minh nội dung của một CSR (domain.csr) ở dạng văn bản:
openssl req -text -noout -verify -in domain.csr
Xem nội dung chứng chỉ
Lệnh sau cho phép bạn xem nội dung của chứng chỉ (domain.crt) ở dạng văn bản:
openssl x509 -text -noout -in domain.crt
Xác minh chứng chỉ được ký bởi CA
Sử dụng lệnh sau để xác minh rằng chứng chỉ (domain.crt) đã được ký bởi một chứng chỉ CA cụ thể (ca.crt):
openssl x509 -text -noout -in domain.crt
Private Keys
Phần này bao gồm các lệnh OpenSSL dành riêng cho việc tạo và xác minh private keys.
Tạo Private Key
Sử dụng lệnh sau để tạo một private key 2048-bit được bảo vệ bằng mật khẩu (domain.key):
openssl genrsa -des3 -out domain.key 2048
Nhập mật khẩu khi được nhắc để hoàn tất quá trình.
Xác minh Private Key
Sử dụng lệnh sau để kiểm tra rằng private key (domain.key) là hợp lệ:
openssl rsa -check -in domain.key
Nếu private key của bạn được mã hóa, bạn sẽ được yêu cầu nhập pass phrase. Nếu thành công, private key không được mã hóa sẽ được xuất ra trên terminal.
Xác minh Private Key khớp với chứng chỉ và CSR
Sử dụng các lệnh sau để xác minh nếu private key (domain.key) khớp với chứng chỉ (domain.crt) và CSR (domain.csr):
openssl rsa -noout -modulus -in domain.key | openssl md5 openssl x509 -noout -modulus -in domain.crt | openssl md5 openssl req -noout -modulus -in domain.csr | openssl md5
Nếu kết quả của mỗi lệnh giống hệt nhau, có khả năng rất cao rằng private key, chứng chỉ và CSR có liên quan với nhau.
Mã hóa Private Key
Lệnh sau nhận một private key không được mã hóa (unencrypted.key) và xuất ra phiên bản được mã hóa (encrypted.key):
openssl rsa -des3 \
-in unencrypted.key \
-out encrypted.key
Nhập pass phrase mong muốn để mã hóa private key.
OpenSSL có thể được sử dụng để chuyển đổi chứng chỉ qua lại giữa nhiều định dạng khác nhau. Phần này sẽ đề cập đến một số chuyển đổi có thể thực hiện.
Giải mã Private Key
Lệnh sau nhận một private key được mã hóa (encrypted.key) và xuất ra phiên bản được giải mã:
openssl rsa \
-in encrypted.key \
-out decrypted.key
Nhập pass phrase của private key khi được nhắc.
Chuyển đổi định dạng chứng chỉ
Tất cả các chứng chỉ chúng ta làm việc đều là chứng chỉ X.509 mã hóa theo định dạng PEM (ASCII). Có nhiều định dạng mã hóa chứng chỉ và loại container khác nhau; một số ứng dụng ưu tiên định dạng nhất định. Nhiều định dạng này có thể chứa nhiều thành phần, chẳng hạn như private key, chứng chỉ và chứng chỉ CA trong một tập tin.
OpenSSL có thể chuyển đổi chứng chỉ qua lại giữa nhiều định dạng khác nhau. Phần này sẽ đề cập đến một số chuyển đổi có thể thực hiện.
Chuyển đổi PEM sang DER
Sử dụng lệnh sau nếu bạn muốn chuyển một chứng chỉ mã hóa PEM (domain.crt) sang chứng chỉ mã hóa DER (domain.der), định dạng nhị phân:
openssl x509 \
-in domain.crt \
-outform der -out domain.der
Định dạng DER thường được sử dụng với Java.
Chuyển đổi DER sang PEM
Sử dụng lệnh sau nếu bạn muốn chuyển chứng chỉ mã hóa DER (domain.der) sang chứng chỉ mã hóa PEM (domain.crt):
openssl x509 \
-inform der -in domain.der \
-out domain.crt
Chuyển đổi PEM sang PKCS7
Sử dụng lệnh sau nếu bạn muốn thêm các chứng chỉ PEM (domain.crt và ca-chain.crt) vào một tập tin PKCS7 (domain.p7b):
openssl crl2pkcs7 -nocrl \
-certfile domain.crt \
-certfile ca-chain.crt \
-out domain.p7b
Bạn có thể sử dụng một hoặc nhiều tùy chọn -certfile để chỉ định các chứng chỉ cần thêm vào tập tin PKCS7.
Tập tin PKCS7, còn được gọi là P7B, thường được sử dụng trong Java Keystores và Microsoft IIS (Windows). Chúng là các tập tin ASCII có thể chứa các chứng chỉ và chứng chỉ CA.
Chuyển đổi PKCS7 sang PEM
Sử dụng lệnh sau nếu bạn muốn chuyển một tập tin PKCS7 (domain.p7b) sang tập tin PEM:
openssl pkcs7 \
-in domain.p7b \
-print_certs -out domain.crt
Nếu tập tin PKCS7 chứa nhiều thành phần (ví dụ: một chứng chỉ và một chứng chỉ trung gian của CA), tập tin PEM được tạo ra sẽ chứa tất cả các thành phần đó.
Chuyển đổi PEM sang PKCS12
Sử dụng lệnh sau nếu bạn muốn kết hợp private key (domain.key) và chứng chỉ (domain.crt) thành một tập tin PKCS12 (domain.pfx):
openssl pkcs12 \
-inkey domain.key \
-in domain.crt \
-export -out domain.pfx
Bạn sẽ được nhắc nhập mật khẩu xuất (export passwords), có thể để trống. Bạn cũng có thể thêm chuỗi chứng chỉ vào tập tin PKCS12 bằng cách nối các chứng chỉ lại với nhau trong một tập tin PEM (ví dụ: domain.crt).
Tập tin PKCS12, còn được gọi là PFX, thường được sử dụng để nhập và xuất chuỗi chứng chỉ trong Microsoft IIS (Windows).
Chuyển đổi PKCS12 sang PEM
Sử dụng lệnh sau nếu bạn muốn chuyển một tập tin PKCS12 (domain.pfx) sang định dạng PEM (domain.combined.crt):
openssl pkcs12 \
-in domain.pfx \
-nodes -out domain.combined.crt
Nếu tập tin PKCS12 của bạn chứa nhiều thành phần (ví dụ: chứng chỉ và private key), tập tin PEM được tạo ra sẽ chứa tất cả các thành phần đó.
Phiên bản OpenSSL
Lệnh openssl version có thể được sử dụng để kiểm tra phiên bản OpenSSL bạn đang chạy. Phiên bản OpenSSL và các tùy chọn biên dịch ảnh hưởng đến các khả năng (và đôi khi các tùy chọn dòng lệnh) mà bạn có thể sử dụng.
Lệnh sau hiển thị phiên bản OpenSSL bạn đang sử dụng cùng với tất cả các tùy chọn đã được biên dịch:
openssl version -a
Hướng dẫn này được viết dựa trên một bản OpenSSL có các thông tin sau (kết quả của lệnh trên):
OpenSSL 1.1.1 11 Sep 2018 built on: Mon Aug 23 17:02:39 2021 UTC platform: debian-amd64 options: bn(64,64) rc4(16x,int) des(int) blowfish(ptr) compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2 OPENSSLDIR: "/usr/lib/ssl" ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1" Seeding source: os-specific
Kết luận
Những nội dung trong hướng dẫn này đã đề cập đến các thao tác phổ biến nhất khi làm việc với chứng chỉ SSL bằng OpenSSL. Tuy nhiên, OpenSSL là một công cụ cực kỳ linh hoạt với nhiều ứng dụng nâng cao khác mà chúng tôi chưa thể trình bày hết tại đây. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn tìm hiểu thêm về các tình huống sử dụng cụ thể, hãy chia sẻ trong phần bình luận.
Ngoài ra, nếu bạn gặp lỗi khi thực hiện bất kỳ lệnh nào trong hướng dẫn, hãy đính kèm kết quả của lệnh openssl version -a trong bình luận. Điều này sẽ giúp xác định phiên bản OpenSSL mà bạn đang sử dụng và dễ dàng hơn trong việc hỗ trợ khắc phục sự cố.
Khi tạo CSR và quản lý khóa riêng, một VPS đáng tin cậy là yếu tố then chốt. Thuê VPS giá rẻ từ DataOnline mang đến giải pháp tiết kiệm chi phí, nhưng vẫn đảm bảo hiệu suất cao, hỗ trợ cài đặt chứng chỉ SSL mượt mà và bảo mật tối ưu.

