Thiết lập Let's Encrypt for Express

Cách thiết lập HTTPS bằng giải pháp miễn phí phổ biến Let's Encrypt

Nếu bạn chạy ứng dụng Node.js trên VPS của riêng mình, bạn sẽ cần một giải pháp để lấy chứng chỉ SSL.

Ngày nay, tiêu chuẩn để làm điều này là sử dụngHãy mã hóaCertbot, một công cụ từEFF, hay còn gọi là Electronic Frontier Foundation, tổ chức phi lợi nhuận hàng đầu tập trung vào quyền riêng tư, quyền tự do ngôn luận và quyền tự do dân sự nói chung trong thế giới kỹ thuật số.

Đây là các bước chúng tôi sẽ làm theo:

Cài đặt Certbot

Các hướng dẫn này giả sử bạn đang sử dụng Ubuntu, Debian hoặc bất kỳ bản phân phối Linux nào khác sử dụngapt-getđể quản lý các gói:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

Bạn cũng có thể cài đặt Certbot trên máy Mac, cho mục đích thử nghiệm (yêu cầuHomebrew):

brew install certbot

Tuy nhiên, bạn sẽ cần phải liên kết tên miền đó với một tên miền thực để nó trở nên hữu ích.

Tạo chứng chỉ SSL bằng Certbot

Bây giờ Certbot đã được cài đặt, bạn có thể gọi nó để tạo chứng chỉ. Bạn phải chạy cái này dưới dạng root:

certbot certonly --manual

… Hoặc gọi sudo từ người dùng không phải root:

sudo certbot certonly --manual

Đây là quy trình chi tiết:

Trình cài đặt sẽ yêu cầu bạn cung cấp miền của trang web của bạn.

… Sau đó nó yêu cầu email của bạn:

➜ sudo certbot certonly --manual
Password: XXXXXXXXXXXXXXXXXX
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]

… Và chấp nhận Điều khoản dịch vụ:

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory

(A)gree/©ancel: A

… Và để được phép chia sẻ địa chỉ email của bạn:

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

… Cuối cùng, chúng ta có thể nhập tên miền mà chúng ta muốn sử dụng chứng chỉ SSL:

Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): copesflavio.com

… Trình cài đặt hỏi bạn có đăng nhập địa chỉ IP của bạn được không:

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for copesflavio.com

NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you’re running certbot in manual mode on a machine that is not your server, please ensure you’re okay with that.

Are you OK with your IP being logged?


(Y)es/(N)o: y

… Và cuối cùng chúng ta đến giai đoạn xác minh!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c

And make it available on your web server at this URL:

http://copesflavio.com/.well-known/acme-challenge/TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E

Bây giờ, hãy để Certbot một mình trong vài phút.

Chúng tôi cần xác minh rằng chúng tôi sở hữu miền bằng cách tạo một tệp có tênTS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2Ebên trong.well-known/acme-challenge/thư mục. Chú ý! Chuỗi kỳ lạ mà tôi vừa dán sẽ thay đổi mỗi khi bạn thực hiện quá trình này.

Bạn sẽ cần tạo thư mục và tệp, vì chúng không tồn tại theo mặc định.

Trong tệp này, bạn cần đặt nội dung mà Certbot đã in:

TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c

Đối với tên tệp - chuỗi này là duy nhất mỗi khi bạn chạy Certbot.

Cho phép Express phân phối các tệp tĩnh

Để cung cấp tệp đó từ Express, bạn cần bật phân phối tệp tĩnh. Bạn có thể tạo mộtstaticvà thêm vào đó.well-knownthư mục con, sau đó cấu hình Express như sau:

const express = require('express')
const app = express()

//… app.use(express.static(__dirname + ‘/static’, { dotfiles: ‘allow’ }))

//…

Cácdotfilestùy chọn là bắt buộc nếu không.well-known, là một tệp chấm (vì nó bắt đầu bằng dấu chấm), sẽ không được hiển thị. Đây là một biện pháp bảo mật, bởi vì các tệp dotfiles có thể chứa thông tin nhạy cảm và chúng được bảo quản tốt hơn theo mặc định.

Xác nhận miền

Bây giờ hãy chạy ứng dụng và đảm bảo rằng tệp có thể truy cập được từ internet công cộng. Quay lại Certbot vẫn đang chạy và nhấn ENTER để tiếp tục với tập lệnh.

Lấy chứng chỉ

Đó là nó! Nếu mọi việc suôn sẻ, Certbot đã tạo chứng chỉ và khóa cá nhân, đồng thời cung cấp chúng trong một thư mục trên máy tính của bạn (tất nhiên là nó sẽ cho bạn biết thư mục nào).

Bây giờ, chỉ cần sao chép / dán các đường dẫn vào ứng dụng của bạn để bắt đầu sử dụng chúng để phục vụ các yêu cầu của bạn:

const fs = require('fs')
const https = require('https')
const app = express()

app.get(’/’, (req, res) => { res.send(‘Hello HTTPS!’) })

https .createServer( { key: fs.readFileSync(’/etc/letsencrypt/path/to/key.pem’), cert: fs.readFileSync(’/etc/letsencrypt/path/to/cert.pem’), ca: fs.readFileSync(’/etc/letsencrypt/path/to/chain.pem’), }, app ) .listen(443, () => { console.log(‘Listening…’) })

Lưu ý rằng tôi đã đặt máy chủ này lắng nghe trên cổng 443, vì vậy nó cần được chạy với quyền root.

Ngoài ra, máy chủ chỉ chạy trong HTTPS, vì tôi đã sử dụnghttps.createServer(). Bạn cũng có thể triển khai một máy chủ HTTP cùng với điều này, bằng cách chạy:

http.createServer(app).listen(80, () => {
  console.log('Listening...')
})

https .createServer( { key: fs.readFileSync(’/etc/letsencrypt/path/to/key.pem’), cert: fs.readFileSync(’/etc/letsencrypt/path/to/cert.pem’), ca: fs.readFileSync(’/etc/letsencrypt/path/to/chain.pem’), }, app ) .listen(443, () => { console.log(‘Listening…’) })

Thiết lập gia hạn

Chứng chỉ SSL sẽ chỉ có hiệu lực trong 90 ngày, vì vậy bạn cần thiết lập hệ thống tự động để gia hạn chứng chỉ.

Làm sao? Sử dụng một công việc cron.

Công việc cron là một cách để chạy các tác vụ trong một khoảng thời gian xác định. Nó có thể là hàng tuần, hàng phút, hàng tháng, v.v.

Trong trường hợp của chúng tôi, chúng tôi sẽ chạy tập lệnh gia hạn hai lần mỗi ngày, như được đề xuất trong tài liệu Certbot.

Trước tiên, hãy tìm ra con đường tuyệt đối củacertbottrên hệ thống của bạn. tôi sử dụngtype certbottrên macOS để có được nó và trong trường hợp của tôi, nó ở/usr/local/bin/certbot.

Đây là tập lệnh chúng ta cần chạy:

certbot renew

Đây là mục cron job:

0 */12 * * * root /usr/local/bin/certbot renew >/dev/null 2>&1

Ở trên nói rằng 'chạy nó 12 giờ một lần, mỗi ngày: lúc 00:00 và lúc 12:00'.

Mẹo: Tôi đã tạo dòng này bằng cách sử dụnghttps://crontab-generator.org/

Thêm tập lệnh mới tạo của bạn vào crontab của hệ thống bằng lệnh sau:

env EDITOR=pico crontab -e

Điều này mở rapicotrình chỉnh sửa (vui lòng thay thế bằng bất kỳ trình chỉnh sửa nào bạn thích). Chỉ cần nhập tập lệnh mới, lưu và lệnh cron được cài đặt.

Sau khi hoàn tất, bạn có thể xem danh sách các công việc cron đang hoạt động bằng cách chạy:

crontab -l

Tải xuống miễn phí của tôiSổ tay Express.js


Các hướng dẫn nhanh hơn: