Ssl

mTLS:將客戶端證書限制為特定子域?

  • December 11, 2021

tldr

通過 mTLS,我試圖找到一種頒發客戶端證書的方法,該證書僅授予該客戶端訪問特定子域的權限。我懷疑這是不可能的,但我不確定。

我想要完成的事情

假設我有一個伺服器監聽任何路由到*.foo.flar.com

每個客戶都分配有自己的子域,該子域滿足伺服器地址中的萬用字元。

例如,customer1應該通過 訪問伺服器customer1.foo.flar.com,並且customer2應該通過 訪問伺服器customer2.foo.flar.com

此外,必須防止一個客戶使用不同客戶的子域訪問伺服器。所以,請求是非法的customer1customer2.foo.flar.com這樣的請求應該被拒絕。

我希望我可以通過 mTLS 和一些巧妙的 SAN 證書使用在會話層完成此操作,但我無法讓它正常工作。

我是如何設置東西的

我對使用 TLS 很陌生,所以其中很多來自這個 SO answer about SAN configurationthis 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...,並拒絕該請求。但這似乎沒有發生。

想法?

客戶端證書僅包含對使用者進行身份驗證的資訊。對經過身份驗證的使用者可以做什麼(授權)的任何限制,包括在哪個站點上接受證書,都取決於檢查證書的伺服器。

引用自:https://serverfault.com/questions/1085996