Share

Quay lại
Trang chủ / Kiến thức / Phát triển offshore / HTTPS with SpringBoot

HTTPS with SpringBoot

15/12/2023
23/02/2022
HTTPS with SpringBoot

Ngày nay, việc sử dụng HTTPS là điều gần như bắt buộc với mọi website. Trong bài viết này, tôi sẽ giới thiệu về HTTPS và triển khai HTTPS (self-certificate) cùng Springboot.

1. Giới thiệu về HTTPS 

Tôi sẽ bắt đầu bài viết với HTTPS. HTTPS là viết tắt của cụm từ Hypertext transfer protocol secure - giao thức truyền siêu văn bản có bảo mật. Đây là giao thức nâng cao của HTTP dùng để truyền dữ liệu qua lại giữa trình duyệt, tool và web server. Các dữ liệu sẽ được mã hoá trước khi truyền đi. Nhờ vậy, các thông tin người dùng nhập vào được bảo mật tốt hơn.

Nếu bạn sử dụng trình duyệt Chrome, trang web có HTTPS sẽ có biểu tượng khóa màu xanh trên thanh tìm kiếm. Đối với trang web không có HTTPS, thanh tìm kiếm sẽ hiển thị dòng chữ Not secure

Trang web không có HTTPS 

Vậy làm sao để trang web của bạn có HTTPS? Có một vài cách như sau:

  • Đăng ký thông qua bên thứ 3 (aws, google)

  • Tự tạo chứng chỉ riêng

Trong phạm vi bài viết này, chúng ta sẽ cùng tạo riêng cho mình 1 chứng chỉ.

2. Triển khai HTTPS cùng Spring boot

Để triển khai được HTTPS cùng Spring boot, bạn cần chuẩn bị:

  • Java 11

  • Spring boot 2

  • keytool (phục vụ sinh chứng chỉ https)

2.1 Tạo file PKCS12

Chúng ta sẽ dùng keytool để tạo chứng chỉ HTTP. Có 2 kiểu keystore phổ biến là JKS và PKCS12. PKCS12 được khuyến nghị sử dụng bắt đầu từ java 9.

Câu lệnh sinh chứng chỉ là:

keytool -genkeypair -alias vonh -keyalg RSA -keysize 4096 -storetype PKCS12 -keystore springboot.p12 -validity 3650 -storepass vo1995

Trong đó:

  • genkeypair: chỉ thị sinh key 

  • alias: định danh riêng của file, có thể chọn tên đặc thù với hệ thống của bạn 

  • keyalg: thuật toán dùng để sinh key thường dùng RSA

  • keysize: kích thước của key 

  • storetype:  kiểu lưu trữ, ở đây mình dùng PKCS12

  • keystore: tên file key 

  • validity: số ngày key đó có hiệu lực 

  • storepass: mật khẩu của key 

Sau khi thực thi lệnh trên, bạn cần nhập một số thông tin bên dưới, trong đó có trường CN cần phải mapping đúng với tên miền chúng ta sẽ sử dụng. 

Thông tin chứng chỉ

Để kiểm tra file .p12 đã thực sự được sinh ra, bạn có thể dùng câu lệnh:

keytool -list -v -keystore springboot.p12

Sau đó nhập mật khẩu lúc tạo file thì nội dung file sẽ được hiển thị.

2.2 Tạo spring boot application

Để tạo một project Spring boot, bạn dùng link ở đây. Thời gian tạo tương đối nhanh. Sau khi tạo, bạn tải về, giải nén và mở bằng IDE là hoàn thành.

Sau khi có Spring boot project, bạn cần lưu file .p12 mới tạo vào project của mình. Ở trong ví dụ này, tôi lưu file tại thư mục resource như hình minh họa.

Thư mục lưu chứa file .p12

Tiếp đến bạn cần config lại file cấu hình. Nội dung file tôi để giống như bên dưới, bạn có thể tham khảo.

​​server.port=8443

Cổng sẽ chạy application, tôi dùng cổng 8443

server.ssl.key-store=classpath:springboot.p12

Đường dẫn tuyệt đối của file .p12

server.ssl.key-store-password=vo1995

Mật khẩu của key 

server.ssl.key-store-type=pkcs12

Kiểu lưu trữ key 

server.ssl.key-alias=vonh

Định danh riêng cho key 

server.ssl.enabled=true

Enable SSL 

server.ssl.protocol=TLS

Sử dụng giao thức TLS 

server.ssl.enabled-protocols=TLSv1.2

Khi sử dụng phiên bản TLSv1.2, nên dùng từ TLS1.2 trở lên, phiên bản 1.1 trở về trước có một số vấn đề về bảo mật.

Nội dung file application.properties

Nội dung API

OK! Đến lúc này application đã khởi động xong, chúng ta bắt đầu test nào.

2.3 Tạo file chứng chỉ cho client và test SSL

Đầu tiên, tôi thử dùng command curl https://localhost:8443/testSSL để test và tất nhiên là không được. Chứng chỉ là do mình tự sinh ra không được các bên thứ 3 uy tín xác nhận, vì vậy độ tin tưởng là chưa có, chúng ta cần phân phối chứng chỉ này đến client. Client sẽ dùng chứng chỉ này và kết nối đến website.

Mình dùng câu lệnh này để chuyển file .p12 sang file .pem

openssl pkcs12 -in path.p12 -out newfile.pem

Sau khi các bạn gõ câu lệnh này, bạn cần nhập thêm mật khẩu của file .p12, quá trình sinh file .pem đã hoàn tất.

Tiếp đến, tôi sẽ thêm dòng dưới đây cho file hosts (với MacOS và linux, file này được lưu ở /etc/host)

127.0.0.1       domain.com

Trong đó 127.0.0.1 ám chỉ đường dẫn local, domain.com là địa chỉ đường dẫn tôi đã nhập ở thư mục CN khi sinh file .p12. Lưu ý, 2 giá trị này cần khớp với nhau.

Đến đây, các bước chuẩn bị đã xong. Tôi bắt đầu test lại

Sử dụng câu lệnh:

curl -v --cacert /Users/macbook/Desktop/springboot.pem https://domain.com:8443/testSSL

Trong đó:

-v mình muốn in ra các bước gọi API như thế nào (thông tin chi tiết của request)

–cacert đi kèm đường dẫn chứa file PEM (sinh từ file p12)

Cuối cùng là đường dẫn lúc này tôi trỏ sang domain domain.com rồi.

Dưới đây là kết quả:

Kết quả

Cụ thể như sau:
1. Quá trình validate file PEM dưới client
2. Quá trình tạo kết nối từ client đến server (giao thức TLS đang dùng là 1.2)
3. Thông tin chứng chỉ tôi đã đăng ký. Thông tin này được đặt dựa theo tổ chức, công ty của tôi.
5. Bước validate domain bạn dùng để request và giá trị CN đã đăng ký trong chứng chỉ. Nếu 2 giá trị này không khớp nhau thì sẽ báo lỗi bước này (trên ảnh minh họa, 2 giá trị đã khớp)
4. Kết nối thành công và đã có response.

Tài liệu tham khảo
Link github source code

3. Kết luận 

Qua bài viết này tôi đã giới thiệu cách cấu hình https trong một project spring boot. Hy vọng những chia sẻ này sẽ giúp ích cho bạn trong công việc. Nếu có thắc mắc hãy để lại bình luận bên dưới bài viết, tôi sẽ giải đáp sớm nhất có thể.

Nếu bạn đang cần tư vấn về bất kỳ điều gì về lĩnh vực công nghệ, dù chỉ là điều nhỏ nhất, đừng ngại liên hệ với đội ngũ tư vấn của Rabiloo. Chúng tôi ở đây để lắng nghe và chia sẻ cùng bạn. 

 

Share


Cập nhật bài viết mới nhất từ chuyên gia

Không được để trống
Không được để trống
Không được để trống
Không được để trống
Tìm kiếm
Tags
Website là gì? Khái niệm, cấu tạo, phân loại các Website hiện nay
Website là gì? Khái niệm, cấu tạo, phân loại các Website hiện nay
24/11/2023
21/12/2023

Gặp gỡ và lắng nghe

Không được để trống
Không được để trống
Không được để trống
Không được để trống