tldr
Thông qua mTLS, tôi đang cố gắng tìm cách cấp chứng chỉ ứng dụng khách chỉ cấp cho ứng dụng khách đó quyền truy cập vào một tên miền phụ cụ thể. Tôi có một nghi ngờ rằng điều này là không thể, nhưng tôi không chắc chắn.
Những gì tôi đang cố gắng để hoàn thành
Giả sử tôi có một máy chủ lắng nghe mọi thứ được định tuyến đến *.foo.flar.com
Mỗi khách hàng được chỉ định tên miền phụ của riêng họ đáp ứng ký tự đại diện trong địa chỉ của máy chủ.
Ví dụ, khách hàng1
nên truy cập máy chủ thông qua khách hàng1.foo.flar.com
, và khách hàng2
nên truy cập máy chủ thông qua khách hàng2.foo.flar.com
.
Hơn nữa, một khách hàng phải được ngăn truy cập vào máy chủ bằng tên miền phụ của một khách hàng khác. Vì vậy, nó là bất hợp pháp cho khách hàng1
yêu cầu khách hàng2.foo.flar.com
, và một yêu cầu như vậy nên bị từ chối.
Tôi đã hy vọng rằng tôi có thể hoàn thành việc này ở lớp phiên thông qua mTLS và một số cách sử dụng chứng chỉ SAN thông minh, nhưng tôi gặp sự cố khi làm cho nó hoạt động bình thường.
Làm thế nào tôi có mọi thứ thiết lập
Tôi khá mới chơi với TLS, vì vậy rất nhiều điều này đến từ câu trả lời SO này về cấu hình SAN và bài viết này về cấu hình mTLS cơ bản.
Tôi đã bỏ qua một số thứ ở đây như tạo chứng chỉ CA và tạo CSR của máy khách và máy chủ để thử và giữ mọi thứ tập trung, nhưng có thể thêm nó nếu bạn muốn.
Tôi đã tạo chứng chỉ máy chủ bằng cách sử dụng một cái gì đó như:
openssl x509 \
-yêu cầu \
-extfile <(printf "subjectAltName=DNS:*.foo.flar.com") \
-ngày 365 \
-trong máy chủ.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-ra máy chủ.crt
Sau đó, tôi đã tạo chứng chỉ ứng dụng khách bằng cách sử dụng một cái gì đó như:
openssl x509 \
-yêu cầu \
-extfile <(printf "subjectAltName=DNS:customer1.foo.flar.com") \
-ngày 365 \
-trong client.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-ra client.crt
Máy chủ (được viết bằng Go) được định cấu hình để yêu cầu và xác minh các chứng chỉ ứng dụng khách.
Vấn đề
Vấn đề là khi tôi kiểm tra thiết lập này, kết nối thành công trong khi tôi cho rằng nó sẽ không thành công.
Nếu tôi có một khách hàng phát hành khách hàng1
cert gọi máy chủ tại khách hàng1.foo.flar.com
, kết nối thành công.
Tuy nhiên, nếu tôi có một khách hàng phát hành khách hàng1
cert gọi máy chủ tại khách hàng2.foo.flar.com
, kết nối đó cũng thành công khi tôi cho rằng nó sẽ thất bại.
Tôi đã hy vọng rằng, khi kiểm tra chứng chỉ của khách hàng, máy chủ sẽ thấy rằng khách hàng1
không có quyền truy cập vào khách hàng2...
, và sẽ từ chối yêu cầu. Nhưng điều này dường như không xảy ra.
Ý tưởng?