- Published on
Hướng dẫn cấu hình mTLS cho dự án sử dụng Java Spring Boot
- Authors
- Name Neutrino
join our community
Hướng dẫn cấu hình mTLS cho dự án sử dụng Java Spring Boot
Giới thiệu về mTLS
Two-way TLS hay Mutual TLS (mTLS) là một giải pháp bảo mật cho các giao tiếp giữa các thiết bị và dịch vụ trên mạng. Trong mTLS, cả Client và Server đều được yêu cầu xác thực lẫn nhau bằng cách chia sẻ Public Key của mình cho đối phương. Trong quá trình giao tiếp, hai bên sẽ xác thực nhau bằng cách sử dụng chứng chỉ xác thực và sau đó sử dụng chứng chỉ bảo mật để mã hóa dữ liệu truyền đi.
Quy trình hoạt động của mTLS:
- Client kết nối tới Server
- Server gửi Certificate cho Client
- Client xác thực Certificate nhận được từ server
- Client gửi Certificate của mình cho Server
- Server xác thực Certificate nhận được từ Client
- Server cấp quyền truy cập
- Client và Server trao đổi thông tin đã được mã hóa mTLS được sử dụng rộng rãi trong các mô hình microservices, IoT và các dịch vụ đám mây. Nó có thể giúp bảo vệ dữ liệu truyền đi trước khi bị đánh cắp hoặc gián điệp, và giúp xác thực các thiết bị hoặc dịch vụ đang giao tiếp với nhau.
Cấu hình mTLS với Java Spring
Generate Key Store và Trust Store
Trong mTLS, keystore là một tập hợp các khóa bảo mật và chứng chỉ được sử dụng để xác thực và mã hóa dữ liệu trong quá trình giao tiếp. Keystore có thể chứa các khóa và chứng chỉ của một bên hoặc cả hai bên trong cuộc giao tiếp. Keystore có một vai trò quan trọng trong mTLS vì nó là nơi lưu trữ các khóa và chứng chỉ cần thiết để xác thực và mã hóa dữ liệu. Nó cũng cung cấp một cách để bảo vệ các khóa bảo mật khỏi việc rò rỉ hoặc truy cập trái phép. Trong phạm vi tài liệu này, công cụ keytool sẽ được sử dụng để tạo ra key pair (public/private) và lưu trữ chúng trong file keystore.p12.
keytool -genkeypair -alias testmtls -keyalg RSA -keysize 4096 \
-validity 3650 -dname "CN=localhost" -keypass mypwd -keystore keystore.p12 \
-storeType PKCS12 -storepass mypwd
Keystore file có thể được lưu trữ dưới nhiều định dạng khác nhau, trong đó 2 định dạng phổ biến nhất là Java Keystore (.jks) và PKCS#12 (.p12). Trong khi JKS là tiêu chuẩn được thiết kế cho Java thì PKCS#12 là tiêu chuẩn công nghiệp thuộc họ PKCS được định nghĩa trong Public Key Cryptography Standards (PKCS). Generate CA Certificate và CA Key (Dùng trong trường hợp không có sẵn)
openssl req -x509 -newkey rsa:2048 -keyout <ca_key_file>.key -out <ca_cert_file>.crt -days <validity_days> -subj "/CN=<CA_name>/O=<organization_name>"
Tạo Certificate Signing Request file:
keytool -keystore keystore.p12 -alias testmtls -certreq -file cert-file.csr
Tạo chứng chỉ đã được ký:
openssl x509 -req -CA <ca-cert-file> -CAkey <ca-key-file> -in cert-file -out cert-signed.crt -days 365 -CAcreateserial -passin pass:yourpass
Import các chứng chỉ vào Key Store:
keytool -keystore keystore.p12 -alias CARoot -import -file ca-cert.crt
keytool -keystore keystore.p12 -alias testmtls -import -file cert-signed.crt
Generate truststore:
keytool -keystore truststore.p12 -alias testmtls -import -file ca_cert.crt
Cấu hình mTLS trong Spring
Để cấu hình mTLS trên Spring, Các thông tin cần bổ sung trong file application.properties như sau:
- Cấu hình TLS:
# mTLS Configuration
# enable/disable https
server.ssl.enabled=true
# keystore format
server.ssl.key-store-type=PKCS12
# keystore location
server.ssl.key-store=path/to/keystore/keystore.p12
# keystore password
server.ssl.key-store-password=keystore_password
# SSL protocol to use
server.ssl.protocol=TLS
# Enabled SSL protocols
server.ssl.enabled-protocols=TLSv1.2
- Để cấu hình mTLS, việc xác thực 2 chiều là bắt buộc và điều này được thực thi khi cấu hình giá trị “need” cho “client-auth”. Khi đó cả Client và Server bắt buộc phải chia sẻ Public Certificate cho nhau.
# Client Auth (mTLS)
server.ssl.client-auth=need
- Để lưu trữ Client Certificate trong ứng dụng Springboot, cần sử dụng truststore file và cần được cấu hình như sau:
# trust store location
server.ssl.trust-store=path/to/truststore/truststore.p12
# trust store password
server.ssl.trust-store-password=truststore_password
- Trong trường hợp project chưa có sẵn embedded Tomcat, để enable mTLS trong Tomcat, file config.xml cần được thêm cấu hình như sau:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="${user.home}/.keystore" keystorePass="mypwd"
clientAuth="true" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2"/>
Hướng dẫn tạo và thêm mới Client Certificate
Do đặc điểm của mTLS cần xác thực ở cả phía Server và Client, nhằm phục vụ mục đích testing hoặc production, có thể tạo và đăng ký chứng chỉ phía client như sau: Tạo Client Certificate Private Key và Certificate Signing Request:
openssl genrsa -out my_client.key 2048
openssl req -new -key my_client.key -out my_client.csr
Thao tác này sẽ tạo ra file “my_client.csr”, gửi file này đến server để tiến hành tạo Certificate. Tại server, cần ký certificate từ Certificate Siging Request:
openssl x509 -req -in <csr_file>.csr -CA <ca_cert_file>.crt -CAkey <ca_key_file>.key -CAcreateserial -out <cert_file>.crt -days <validity_days>
Bước này sẽ tạo ra file “client.crt”, gửi file này đến client. Client sẽ sử dụng chứng chỉ này khi kết nối tới server.
Testing
Để test mTLS, có thể sử dụng Postman để gửi request tới server. Trong phần Authorization, chọn mục "Add Certificate" và nhập các thông tin về domain, port, certificate, private key và passphase của nó.
Ngoài ra có thể sử dụng curl để gửi request tới server:
curl https://localhost:8443/testapi
Troubleshooting
Warning: Self signed certificate in certificate chain
Cảnh báo này thường xảy ra trong Postman khi sử dụng chứng chỉ tự ký (Self-signed Certificate), đặc biệt là trong quá trình Development, Testing. Để bỏ qua cảnh báo này, sử dụng Chứng chỉ CA được cấp bởi bên thứ 3 uy tín hoặc có thể bỏ qua trong cài đặt của Postman trong quá trình Testing như sau: Di chuyển đến mục Setting của request hiện tại, ở mục “Enable SSL certificate verification”, chọn “OFF”.
Lỗi SSL certificate problem: self signed certificate
Lỗi này xảy ra trong curl do sử dụng chứng chỉ tự ký (Self-signed Certificate), đặc biệt là trong quá trình Development, Testing. Để bỏ qua lỗi này, sử dụng Chứng chỉ CA được cấp bởi bên thứ 3 uy tín hoặc thêm chứng chỉ trong request curl như sau:
curl --cacert baeldung.cer https://localhost:8443/baeldung
Kết luận
mTLS là một trong những phương pháp xác thực an toàn nhất hiện nay, đặc biệt là trong các trường hợp cần xác thực ở cả phía Server và Client. Trong bài viết này, chúng ta đã tìm hiểu về mTLS, cách cấu hình mTLS trong Springboot và cách tạo và thêm mới Client Certificate. Ngoài ra, chúng ta cũng đã tìm hiểu về một số lỗi phổ biến trong quá trình testing và cách khắc phục.
Đối với các mục đã trình bày trong troubershooting, tốt hơn hết là chỉ nên sử dụng trong môi trường non-production, vì nó sẽ bỏ qua các cảnh báo và lỗi an toàn. Trong môi trường production, nên sử dụng chứng chỉ CA được cấp bởi bên thứ 3 uy tín.