Thứ sáu, 12/09/2014 | 00:00 GMT+7

Cơ bản về OpenSSL: Làm việc với Chứng chỉ SSL, Khóa riêng và CSR

OpenSSL là một công cụ dòng lệnh đa năng được dùng cho nhiều tác vụ liên quan đến Cơ sở hạ tầng public key (PKI) và HTTPS (HTTP qua TLS). Hướng dẫn kiểu cheat sheets này cung cấp một tài liệu tham khảo nhanh về các lệnh OpenSSL hữu ích trong các tình huống phổ biến hàng ngày. Điều này bao gồm các ví dụ OpenSSL về việc tạo private key , yêu cầu ký certificate và chuyển đổi định dạng certificate . Nó không bao gồm tất cả các công dụng của OpenSSL.

Cách sử dụng Hướng dẫn này:

  • Nếu bạn không quen với các yêu cầu ký certificate (CSR), hãy đọc phần đầu tiên
  • Ngoài phần đầu tiên, hướng dẫn này ở dạng ghi chú đơn giản - các đoạn mã dòng lệnh độc lập
  • Chuyển đến bất kỳ phần nào có liên quan đến nhiệm vụ bạn đang cố gắng hoàn thành (Gợi ý: sử dụng menu Nội dung ở phía dưới bên trái hoặc chức năng Tìm của trình duyệt của bạn)
  • 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 \ ) cho rõ ràng

Giới thiệu về Yêu cầu ký certificate (CSR)

Nếu bạn muốn lấy certificate SSL từ tổ chức phát hành certificate (CA), bạn phải tạo yêu cầu ký certificate (CSR). 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 đều được chèn vào certificate khi nó được ký.

Khi nào bạn tạo CSR, bạn sẽ được yêu cầu cung cấp thông tin liên quan đến certificate . Thông tin này được gọi là Tên phân biệt (DN). Một trường quan trọng trong DN là Tên chung (CN), phải là Tên domain đủ điều kiện chính xác (FQDN) của server lưu trữ mà bạn định sử dụng certificate . Cũng có thể bỏ qua các dấu nhắc tương tác khi tạo CSR bằng cách chuyển thông tin qua dòng lệnh hoặc từ một file .

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 đang mua certificate SSL từ một tổ chức phát hành certificate , thông thường các trường bổ sung này, chẳng hạn như “Tổ chức”, phải phản ánh chính xác thông tin chi tiết về tổ chức của bạn.

Dưới đây là một ví dụ về dấu nhắc thông tin CSR sẽ trông như thế nào:

--- 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 không tương tác dấu nhắc thông tin CSR, bạn có thể thực hiện bằng cách thêm tùy chọn -subj vào bất kỳ lệnh OpenSSL nào yêu cầu thông tin CSR. Đây là một ví dụ về tùy chọn, sử dụng cùng một thông tin được hiển thị trong khối mã ở trên:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com" 

Đến đây bạn đã hiểu CSR, vui lòng chuyển sang bất kỳ phần nào của hướng dẫn này đề cập đến nhu cầu OpenSSL của bạn.

Tạo CSR

Phần này bao gồm các lệnh OpenSSL có liên quan đến việc tạo CSR (và private key , nếu chúng chưa tồn tại). CSR được dùng để certificate request SSL từ cơ quan cấp certificate .

Lưu ý bạn có thể thêm thông tin CSR không tương tác với tùy chọn -subj , được đề cập trong phần trước.

Tạo Khóa cá nhân 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 web server Apache HTTP hoặc Nginx của bạn và bạn muốn sử dụng Tổ chức phát hành certificate (CA) để cấp certificate SSL. CSR được tạo có thể được gửi đến CA để yêu cầu cấp certificate SSL do CA ký. Nếu CA của bạn hỗ trợ SHA-2, hãy thêm tùy chọn -sha256 để ký CSR với SHA-2.

Lệnh này tạo private key 2048 bit ( domain.key ) và CSR ( domain.csr ) từ đầu:

openssl req \        -newkey rsa:2048 -nodes -keyout domain.key \        -out domain.csr 

Trả lời dấu nhắc thông tin CSR để hoàn tất quy trình.

Tùy chọn -newkey rsa:2048 chỉ định rằng khóa phải là 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 cụm từ password . Tùy chọn -new , không được bao gồm ở đây nhưng được ngụ ý, cho biết CSR đang được tạo.

Tạo CSR từ một private key hiện có

Sử dụng phương pháp này nếu bạn đã có private key mà bạn muốn sử dụng để certificate request từ CA.

Lệnh này tạo 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 

Trả lời dấu nhắc thông tin CSR để hoàn tất quy trình.

Tùy chọn -key chỉ định một private key hiện có ( domain.key ) sẽ được sử dụng để tạo CSR mới. Tùy chọn -new cho biết CSR đang được tạo.

Tạo CSR từ Chứng chỉ hiện có và Khóa cá nhân

Sử dụng phương pháp này nếu bạn muốn gia hạn certificate hiện có nhưng bạn hoặc CA của bạn không có CSR ban đầu vì một số lý do. Về cơ bản, nó giúp bạn tiết kiệm được rắc rối khi nhập lại thông tin CSR, vì nó extract thông tin đó từ certificate hiện có.

Lệnh này tạo CSR mới ( domain.csr ) dựa trên certificate 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 certificate X509 để tạo CSR.

Tạo certificate SSL

Nếu bạn muốn sử dụng certificate SSL để bảo mật một dịch vụ nhưng bạn không certificate request do CA ký, giải pháp hợp lệ (và miễn phí) là ký certificate của bạn .

Một loại certificate phổ biến mà bạn có thể tự cấp là chứng chỉ tự ký . Chứng chỉ tự ký là certificate được ký bằng private key của chính nó. Chứng chỉ tự ký được dùng để mã hóa dữ liệu cũng như certificate do CA ký, nhưng user của bạn sẽ được hiển thị cảnh báo cho biết rằng certificate không được máy tính hoặc trình duyệt của họ tin cậy. Do đó, chỉ nên sử dụng certificate tự ký nếu bạn không cần chứng minh danh tính dịch vụ của bạn với user (ví dụ: server không production 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 certificate tự ký.

Tạo certificate tự ký

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 web server Apache HTTP hoặc Nginx của bạn và bạn không certificate request của bạn phải được ký bởi CA.

Lệnh này tạo private key 2048 bit ( domain.key ) và certificate tự ký ( domain.crt ) từ đầu:

openssl req \        -newkey rsa:2048 -nodes -keyout domain.key \        -x509 -days 365 -out domain.crt 

Trả lời dấu nhắc thông tin CSR để hoàn tất quy trình.

Tùy chọn -x509 yêu req yêu req tạo một chuỗi tự ký. Tùy chọn -days 365 chỉ định rằng certificate sẽ có hiệu lực trong 365 ngày. CSR tạm thời được tạo để thu thập thông tin để liên kết với certificate .

Tạo certificate tự ký từ private key hiện có

Sử dụng phương pháp này nếu bạn đã có private key mà bạn muốn tạo certificate tự ký với nó.

Lệnh này tạo certificate tự ký ( domain.crt ) từ private key hiện có ( domain.key ):

openssl req \        -key domain.key \        -new \        -x509 -days 365 -out domain.crt 

Trả lời dấu nhắc thông tin CSR để hoàn tất quy trình.

Tùy chọn -x509 yêu req yêu req tạo một chuỗi tự ký. Tùy chọn -days 365 chỉ định rằng certificate sẽ có hiệu lực trong 365 ngày. Tùy chọn -new dấu nhắc thông tin CSR.

Tạo certificate tự ký từ private key hiện có và CSR

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 certificate tự ký với chúng.

Lệnh này tạo certificate tự ký ( domain.crt ) từ private key hiện có ( domain.key ) và ( domain.csr ):

openssl x509 \        -signkey domain.key \        -in domain.csr \        -req -days 365 -out domain.crt 

Tùy chọn -days 365 chỉ định rằng certificate sẽ có hiệu lực trong 365 ngày.

Xem certificate

Tệp certificate và file CSR được mã hóa ở định dạng PEM, mà con người không thể đọc được.

Phần này bao gồm các lệnh OpenSSL sẽ xuất các mục nhập thực tế của các file được mã hóa PEM.

Xem các mục CSR

Lệnh nà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 

Xem mục nhập certificate

Lệnh này cho phép bạn xem nội dung của certificate ( domain.crt ) ở dạng văn bản thuần túy:

openssl x509 -text -noout -in domain.crt 

Xác minh Chứng chỉ đã được CA ký

Sử dụng lệnh này để xác minh certificate ( domain.crt ) đã được ký bởi certificate CA cụ thể ( ca.crt ):

openssl verify -verbose -CAFile ca.crt domain.crt 

Chìa private key

Phần này bao gồm các lệnh OpenSSL cụ thể để tạo và xác minh private key .

Tạo private key

Sử dụng lệnh này để tạo private key 2048 bit, được bảo vệ bằng password ( domain.key ):

openssl genrsa -des3 -out domain.key 2048 

Nhập password khi được yêu cầu để hoàn tất quá trình.

Xác minh private key

Sử dụng lệnh này để kiểm tra xem private key ( domain.key ) có phải là khóa hợp lệ hay không:

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 cụm từ password của nó. Sau khi thành công, khóa không được mã hóa sẽ được xuất trên terminal .

Xác minh private key trùng với certificate và CSR

Sử dụng các lệnh này để xác minh xem private key ( domain.key ) có trùng với certificate ( domain.crt ) và CSR ( domain.csr ) hay không:

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 thì khả năng rất cao là private key , certificate và CSR có liên quan với nhau.

Mã hóa private key

Thao tác này lấy một private key không được mã hóa ( unencrypted.key ) và xuất ra một version được mã hóa của nó (khóa encrypted.key ):

openssl rsa -des3 \        -in unencrypted.key \        -out encrypted.key 

Nhập cụm từ password mong muốn của bạn để mã hóa private key bằng.

Giải mã private key

Thao tác này lấy một private key được mã hóa ( encrypted.key ) và xuất ra một version được giải mã của nó ( decrypted.key ):

openssl rsa \        -in encrypted.key \        -out decrypted.key 

Nhập cụm từ password cho khóa được mã hóa khi được yêu cầu .

Chuyển đổi định dạng certificate

Tất cả các certificate mà ta đang làm việc đều là certificate X.509 được mã hóa ASCII PEM. Có nhiều loại mã hóa certificate và các loại containers khác; một số ứng dụng thích các định dạng nhất định hơn những ứng dụng khác. Ngoài ra, nhiều định dạng này có thể chứa nhiều mục, chẳng hạn như private key , certificate và certificate CA, trong một file duy nhất.

OpenSSL được dùng để chuyển đổi certificate sang và từ nhiều định dạng khác nhau. Phần này sẽ trình bày một số chuyển đổi có thể xảy ra.

Chuyển đổi PEM sang DER

Sử dụng lệnh này nếu bạn muốn chuyển đổi certificate được mã hóa PEM ( domain.crt ) sang certificate được mã hóa DER ( domain.der ), định dạng binary :

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 này nếu bạn muốn chuyển đổi certificate được mã hóa DER ( domain.der ) thành certificate được 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 này nếu bạn muốn thêm certificate PEM ( domain.crtca-chain.crt ) vào file domain.p7b ( 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 tùy chọn -certfile để chỉ định certificate nào cần thêm vào file PKCS7.

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 file ASCII có thể chứa các certificate và certificate CA.

Chuyển đổi PKCS7 sang PEM

Sử dụng lệnh này nếu bạn muốn chuyển đổi file domain.p7b ( domain.p7b ) thành file PEM:

openssl pkcs7 \        -in domain.p7b \        -print_certs -out domain.crt 

Lưu ý nếu file PKCS7 của bạn có nhiều mục trong đó (ví dụ: certificate và certificate trung gian CA), thì file PEM được tạo sẽ chứa tất cả các mục trong đó.

Chuyển đổi PEM sang PKCS12

Sử dụng lệnh này nếu bạn muốn lấy một private key ( domain.key ) và một certificate ( domain.crt ) và kết hợp chúng thành một file domain.pfx ( domain.pfx ):

openssl pkcs12 \        -inkey domain.key \        -in domain.crt \        -export -out domain.pfx 

Bạn sẽ được yêu cầu nhập password xuất, bạn có thể để trống. Lưu ý bạn có thể thêm một chuỗi certificate vào file PKCS12 bằng cách nối các certificate với nhau trong một file PEM ( domain.crt ) trong trường hợp này.

Tệp PKCS12, còn gọi là file PFX, thường được sử dụng để nhập và xuất chuỗi certificate trong Micrsoft IIS (Windows).

Chuyển đổi PKCS12 sang PEM

Sử dụng lệnh này nếu bạn muốn chuyển đổi file domain.pfx ( domain.pfx ) và chuyển đổi nó sang định dạng PEM ( domain.combined.crt ):

openssl pkcs12 \        -in domain.pfx \        -nodes -out domain.combined.crt 

Lưu ý nếu file PKCS12 của bạn có nhiều mục trong đó (ví dụ: certificate và private key ), thì file PEM được tạo sẽ chứa tất cả các mục trong đó.

Phiên bản OpenSSL

Lệnh openssl version được dùng để kiểm tra version bạn đang chạy. Phiên bản OpenSSL mà bạn đang chạy và các tùy chọn mà nó được biên dịch ảnh hưởng đến các khả năng (và đôi khi là các tùy chọn dòng lệnh) có sẵn cho bạn.

Lệnh sau sẽ hiển thị version OpenSSL mà bạn đang chạy và tất cả các tùy chọn mà nó được biên dịch:

openssl version -a 

Hướng dẫn này được viết bằng mã binary OpenSSL với các chi tiết sau ( kết quả của lệnh trước):

OpenSSL 1.0.1f 6 Jan 2014 built on: Mon Apr  7 21:22:23 UTC 2014 platform: debian-amd64 options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx) compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM OPENSSLDIR: "/usr/lib/ssl" 

Kết luận

Điều đó sẽ bao gồm cách hầu hết mọi người sử dụng OpenSSL để đối phó với certificate SSL! Nó có nhiều công dụng khác mà không được đề cập ở đây, vì vậy hãy hỏi hoặc đề xuất những cách sử dụng khác trong phần comment .

Nếu bạn gặp sự cố với bất kỳ lệnh nào, hãy nhớ comment (và bao gồm kết quả version OpenSSL của bạn).


Tags:

Các tin liên quan