Share
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.
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ỉ.
Để 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)
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ị.
Để 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.
Đầ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
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