mTLS:將客戶端證書限制為特定子域?
tldr
通過 mTLS,我試圖找到一種頒發客戶端證書的方法,該證書僅授予該客戶端訪問特定子域的權限。我懷疑這是不可能的,但我不確定。
我想要完成的事情
假設我有一個伺服器監聽任何路由到
*.foo.flar.com
每個客戶都分配有自己的子域,該子域滿足伺服器地址中的萬用字元。
例如,
customer1
應該通過 訪問伺服器customer1.foo.flar.com
,並且customer2
應該通過 訪問伺服器customer2.foo.flar.com
。此外,必須防止一個客戶使用不同客戶的子域訪問伺服器。所以,請求是非法的
customer1
,customer2.foo.flar.com
這樣的請求應該被拒絕。我希望我可以通過 mTLS 和一些巧妙的 SAN 證書使用在會話層完成此操作,但我無法讓它正常工作。
我是如何設置東西的
我對使用 TLS 很陌生,所以其中很多來自這個 SO answer about SAN configuration和this article about basic mTLS configuration。
我在這裡省略了一些內容,例如 CA 證書生成以及客戶端和伺服器 CSR 生成,以嘗試保持重點,但如果您願意,可以添加它。
我使用類似的東西創建了一個伺服器證書:
openssl x509 \ -req \ -extfile <(printf "subjectAltName=DNS:*.foo.flar.com") \ -days 365 \ -in server.csr \ -CA ca.crt \ -CAkey ca.key \ -CAcreateserial \ -out server.crt
然後我使用類似的東西創建了一個客戶端證書:
openssl x509 \ -req \ -extfile <(printf "subjectAltName=DNS:customer1.foo.flar.com") \ -days 365 \ -in client.csr \ -CA ca.crt \ -CAkey ca.key \ -CAcreateserial \ -out client.crt
伺服器(用 Go 編寫)配置為要求並驗證客戶端證書。
問題
問題是,當我測試此設置時,連接成功,而我預計它會失敗。
如果我有一個客戶端發出
customer1
證書呼叫伺服器customer1.foo.flar.com
,連接成功。但是,如果我有一個客戶端在 發出
customer1
證書呼叫伺服器customer2.foo.flar.com
,那麼當我預計它會失敗時,該連接也會成功。我希望,在檢查客戶端的證書後,伺服器會看到它
customer1
無權訪問customer2...
,並拒絕該請求。但這似乎沒有發生。想法?
客戶端證書僅包含對使用者進行身份驗證的資訊。對經過身份驗證的使用者可以做什麼(授權)的任何限制,包括在哪個站點上接受證書,都取決於檢查證書的伺服器。