OpenSSL là một công cụ dòng lệnh đa năng có thể được sử dụng cho rất nhiều tác vụ liên quan đến Public Key Infrastructure (PKI) và HTTPS (HTTP over TLS). Hướng dẫn dạng “cheat sheet” này cung cấp tham chiếu nhanh đến các lệnh OpenSSL hữu ích trong các tình huống thường gặp hàng ngày. Nội dung bao gồm các ví dụ về cách tạo Private Keys, yêu cầu ký chứng chỉ (CSRs) và chuyển đổi định dạng chứng chỉ. (Lưu ý: hướng dẫn này không bao gồm tất cả các ứng dụng của OpenSSL.)
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, hướng dẫn này được trình bày dưới dạng “cheat sheet”: một danh sách các đoạn lệnh độc lập.
- Nhảy đến bất kỳ phần nào 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 của trình duyệt). - Hầu hết các lệnh là một dòng, được mở rộng thành nhiều dòng (sử dụng ký hiệu
\
) để dễ hiểu hơn.
Về yêu cầu ký chứng chỉ (CSR)
Nếu bạn muốn lấy chứng chỉ SSL từ một Certificate Authority (CA) thương mại, bạ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 public key của cặp khóa và một số 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 các thông tin liên quan đến chứng chỉ. Các 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), cần phải là tên miền đầy đủ (FQDN) chính xác của máy chủ mà bạn dự định sử dụng chứng chỉ. Ngoài ra, bạn cũng có thể bỏ qua các lời 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.
Các mục khác trong DN cung cấp thêm thông tin 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ải phản ánh chính xác thông tin của tổ chức.
Dưới đây là ví dụ về giao diện nhắc thông tin của 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 lời nhắc thông tin CSR một cách không tương tác, bạn có thể thêm tham số -subj
vào bất kỳ lệnh OpenSSL nào yêu cầu thông tin CSR. Ví dụ, với cùng 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 chuyển sang phần phù hợp với nhu cầu OpenSSL của bạn.
Tạo yêu cầu ký chứng chỉ (CSR)
Phần này bao gồm các lệnh OpenSSL liên quan đến việc tạo CSR (và tạo Private Keys nếu chưa có). CSR có thể được sử dụng để yêu cầu chứng chỉ SSL từ một CA.
Lưu ý: bạn có thể thêm thông tin CSR một cách không tương tác với tham số -subj
như đã đề cập ở phần trước.
1. 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 over TLS) để bảo mật máy chủ web Apache hoặc Nginx, và bạn muốn sử dụng CA để phát hành chứng chỉ SSL. CSR được tạo ra có thể được gửi đến CA để yêu cầu phát hành chứng chỉ SSL được ký bởi CA. Nếu CA của bạn hỗ trợ SHA-2, hãy thêm tham số -sha256
để ký CSR bằng SHA-2.
Lệnh dưới đây tạo ra một private key 2048-bit (tên tệp: domain.key
) và một CSR (tên tệp: domain.csr
) từ đầu:
openssl req \ -newkey rsa:2048 -nodes -keyout domain.key \ -out domain.csr
Trả lời lời nhắc thông tin CSR để hoàn tất quá trình.
- Tham số
-newkey rsa:2048
chỉ định rằng khóa sẽ có độ dài 2048-bit, được tạo bằng thuật toán RSA. - Tham số
-nodes
chỉ định rằng private key sẽ không được mã hóa bằng pass phrase. - Tham số
-new
(được ngụ ý ở đây) chỉ ra rằng một CSR đang được tạo.
2. Tạo CSR từ Private Key có sẵn
Sử dụng phương pháp này nếu bạn đã có sẵn một private key mà bạn muốn dùng để yêu cầu chứng chỉ từ CA.
Lệnh dưới đây tạo một CSR mới (domain.csr
) dựa trên private key đã có (domain.key
):
openssl req \ -key domain.key \ -new -out domain.csr
Trả lời lời nhắc thông tin CSR để hoàn tất quá trình.
- Tham số
-key
chỉ định private key hiện có sẽ được sử dụng. - Tham số
-new
chỉ ra rằng một CSR đang được tạo.
3. Tạo CSR từ chứng chỉ và Private Key có sẵn
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) không có CSR gốc. Phương pháp này giúp bạn không phải nhập lại thông tin CSR vì nó trích xuất thông tin từ chứng chỉ hiện có.
Lệnh dưới đây tạo một CSR mới (domain.csr
) dựa trên chứng chỉ có sẵn (domain.crt
) và private key (domain.key
):
openssl x509 \ -in domain.crt \ -signkey domain.key \ -x509toreq -out domain.csr
- Tham số
-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 ký bởi CA, bạn có thể tự ký chứng chỉ của mình. Một loại chứng chỉ thường được tự cấp là chứng chỉ tự ký. Chứng chỉ tự ký được ký bằng chính private key của nó.
Mặc dù chứng chỉ tự ký có thể mã hóa dữ liệu tương đương như chứng chỉ ký bởi CA, nhưng người dùng của bạn sẽ thấy cảnh báo cho biết chứng chỉ không được máy tính hoặc trình duyệt tin cậy. Vì vậy, chứng chỉ tự ký chỉ nên được sử dụng khi bạn không cần chứng minh danh tính của dịch vụ đối với người dùng (ví dụ: máy chủ 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ý.
1. 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 hoặc Nginx và không cần chứng chỉ được ký bởi CA.
Lệnh dưới đây tạo ra 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
Trả lời lời nhắc thông tin CSR để hoàn tất quá trình.
- Tham số
-x509
báo cho lệnh req tạo một chứng chỉ tự ký. - Tham số
-days 365
chỉ định chứng chỉ 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ỉ.
2. Tạo chứng chỉ tự ký từ Private Key có sẵn
Sử dụng phương pháp này nếu bạn đã có sẵn một private key và muốn tạo chứng chỉ tự ký với nó.
Lệnh dưới đây tạo ra một chứng chỉ tự ký (domain.crt
) từ private key có sẵn (domain.key
):
openssl req \ -key domain.key \ -new \ -x509 -days 365 -out domain.crtv
Trả lời lời nhắc thông tin CSR để hoàn tất quá trình.
- Tham số
-x509
báo cho lệnh req tạo chứng chỉ tự ký. - Tham số
-days 365
chỉ định chứng chỉ có hiệu lực trong 365 ngày. - Tham số
-new
kích hoạt lời nhắc thông tin CSR.
3. Tạo chứng chỉ tự ký từ Private Key và CSRcó sẵn
Sử dụng phương pháp này nếu bạn đã có private key và CSR, và muốn tạo chứng chỉ tự ký từ chúng.
Lệnh dưới đây tạo ra một 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
- Tham số
-days 365
chỉ định chứng chỉ có hiệu lực trong 365 ngày.
Xem nội dung chứng chỉ
Các tệp chứng chỉ và CSR được mã hóa theo định dạng PEM, không dễ đọc bằng mắt thường.
1. Xem nội dung CSR
Lệnh dưới đây cho phép bạn xem và xác minh nội dung của CSR (domain.csr
) ở dạng văn bản thuần túy:
openssl req -text -noout -verify -in domain.csr
2. Xem nội dung chứng chỉ
Lệnh dưới đây cho phép bạn xem nội dung của chứng chỉ (domain.crt
) ở dạng văn bản thuần túy:
openssl x509 -text -noout -in domain.crt
3. 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 verify -verbose -CAFile ca.crt domain.crt
Khóa riêng (Private Keys)
Phần này bao gồm các lệnh OpenSSL cụ thể cho việc tạo và xác minh Private Keys.
1. Tạo Private Key
Sử dụng lệnh sau để tạo một private key 2048-bit có bảo vệ mật khẩu (tên tệp: domain.key
):
openssl genrsa -des3 -out domain.key 2048
Nhập mật khẩu khi được yêu cầu để hoàn tất quá trình.
2. Xác minh Private Key
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 mã hóa sẽ được hiển thị trên terminal.
3. Xác minh Private Key phù hợp với chứng chỉ và CSR
Sử dụng các lệnh sau để xác minh rằng private key (domain.key
) phù hợ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 là giống nhau, có khả năng rất cao rằng private key, chứng chỉ và CSR có liên quan với nhau.
4. Mã hóa Private Key
Lệnh dưới đây sẽ lấy 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.
5. Giải mã Private Key
Lệnh dưới đây sẽ lấy một private key được mã hóa (encrypted.key
) và xuất ra phiên bản đã được giải mã (decrypted.key
):
openssl rsa \ -in encrypted.key \ -out decrypted.key
Nhập pass phrase của private key được mã hóa khi được yêu cầu.
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 được mã hóa theo định dạng PEM (ASCII). Có nhiều định dạng mã hóa và container khác; một số ứng dụng ưu tiên định dạng này hơn định dạng khác. Hơn nữa, nhiều định dạng có thể chứa nhiều mục, chẳng hạn như private key, chứng chỉ và chứng chỉ CA, trong một tệp duy nhất.
OpenSSL có thể được sử dụng để chuyển đổi chứng chỉ qua lại giữa nhiều định dạng. Phần này sẽ trình bày một số chuyển đổi khả thi.
1. Chuyển PEM sang DER
Sử dụng lệnh sau nếu bạn muốn chuyển một chứng chỉ được mã hóa PEM (domain.crt
) sang định dạng DER (domain.der
), 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.
2. Chuyển DER sang PEM
Sử dụng lệnh sau nếu bạn muốn chuyển một chứng chỉ được mã hóa DER (domain.der
) sang định dạng PEM (domain.crt
):
openssl x509 \ -inform der -in domain.der \ -out domain.crt
3. Chuyển PEM sang PKCS7
Sử dụng lệnh sau nếu bạn muốn thêm các chứng chỉ định dạng PEM (ví dụ: domain.crt
và ca-chain.crt
) vào một tệp PKCS7 (domain.p7b
):
openssl crl2pkcs7 -nocrl \ -certfile domain.crt \ -certfile ca-chain.crt \ -out domain.p7b
Lưu ý: Bạn có thể sử dụng một hoặc nhiều tham số -certfile
để chỉ định các chứng chỉ cần thêm vào tệp PKCS7.
Các tệp PKCS7 (còn gọi là P7B) thường được sử dụng trong Java Keystores và Microsoft IIS (Windows). Chúng là các tệp ASCII có thể chứa chứng chỉ và chứng chỉ CA.
4. Chuyển PKCS7 sang PEM
Sử dụng lệnh sau nếu bạn muốn chuyển một tệp PKCS7 (domain.p7b
) sang định dạng PEM (domain.crt
):
openssl pkcs7 \ -in domain.p7b \ -print_certs -out domain.crt
Lưu ý: Nếu tệp PKCS7 của bạn chứa nhiều mục (ví dụ: một chứng chỉ và một chứng chỉ trung gian của CA), tệp PEM tạo ra sẽ chứa tất cả các mục đó.
5. Chuyển 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 PKCS12 (domain.pfx
):
openssl pkcs12 \ -inkey domain.key \ -in domain.crt \ -export -out domain.pfx
Bạn sẽ được yêu cầu nhập mật khẩu xuất (export password), bạn có thể để trống nếu muốn. Lưu ý: bạn có thể thêm chuỗi chứng chỉ vào tệp PKCS12 bằng cách nối các chứng chỉ lại với nhau trong một tệp PEM (trong trường hợp này là domain.crt
).
Các tệp 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).
6. Chuyển PKCS12 sang PEM
Sử dụng lệnh sau nếu bạn muốn chuyển một tệp PKCS12 (domain.pfx
) sang định dạng PEM (domain.combined.crt
):
openssl pkcs12 \ -in domain.pfx \ -nodes -out domain.combined.crt
Lưu ý: Nếu tệp PKCS12 của bạn chứa nhiều mục (ví dụ: một chứng chỉ và private key), tệp PEM tạo ra sẽ chứa tất cả các mục đó.
Phiên Bản OpenSSL
Lệnh openssl version
có thể được sử dụng để kiểm tra phiên bản bạn đang chạy. Phiên bản OpenSSL và các tùy chọn được biên dịch cùng nó sẽ ảnh hưởng đến khả năng (và đôi khi các tham số 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 và tất cả các tùy chọn mà nó được biên dịch kèm theo:
openssl version -a
Lưu ý: Hướng dẫn này được viết dựa trên một bản OpenSSL với các thông tin chi tiết như 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
Điều trên đã bao quát cách hầu hết mọi người sử dụng OpenSSL để làm việc với các chứng chỉ SSL. OpenSSL có rất nhiều ứng dụng khác mà không được đề cập ở đây, vì vậy hãy thoải mái đặt câu hỏi hoặc gợi ý các ứng dụng khác trong phần bình luận.
Nếu bạn gặp vấn đề với bất kỳ lệnh nào, hãy chắc chắn bình luận (và bao gồm cả kết quả của lệnh openssl version -a
).