nginx ingress controller配置默認SSL證書


故障現象

線上某kubernetes集群環境,使用nginx-ingress-controller暴露了一個service,為一個API服務,其中在ingress對象中使用了TLS證書,使用瀏覽器輸入ingress對應的域名訪問這個API service,請求正常,但是某程序使用SDK調用此service,始終無法拿到結果。

ingress的yaml文件類似如下

image-20200606184834598

排查

  1. sdk調用ingress時nginx-ingress-controller的日志信息,發現有如下報錯

    2020/04/01 04:49:01 [error] 12173#12173: *6506108 [lua] cert.lua:58: no cert found for 443, context: ssl_certificate_by_lua*, client: x.x.x.x, server: 0.0.0.0:443
    2020/04/01 04:49:01 [crit] 12173#12173: *6506107 SSL_do_handshake() failed (SSL: error:1417A179:SSL routines:tls_post_process_client_hello:cert cb error) while SSL handshaking, client: x.x.x.1x6, server: 0.0.0.0:443

    google上述信息,沒有找到相關case。

     

  2. 使用tcpdump對nginx-ingress-controller抓包,分析sdk請求時候的數據流,拿到抓包文件后用wireshark打開,發現如下錯誤信息。

    image-20200606184040298

image-20200606184203738分析此數據包,可以看出SDK客戶端發出client_hello請求后,服務器端立馬返回了報錯,SSL握手未完成。

     3. 正常SSL握手過程如下圖,結合抓包結果,可以發現服務器端nginx-ingress-controller沒有返回server_hello信息給客戶端,而是直接報錯,日志信息則是提示未發現證書。

    4. 分析此ingress對應的yaml文件一切正常,同時從現象看,瀏覽器請求正常的,只是sdk調用異常,問題應該和客戶端關聯,於是對sdk請求時和瀏覽器請求時分別抓包的client_hello包進行對比,發現不同,sdk的client_hello包,extension字段未傳遞server_name.在openresty也搜到如下信息

    5. 綜上,SDK客戶端為非標准客戶端,訪問不帶sni及server_name信息,導致nginx-ingress-controller無法通過sni和server_name找到對應的證書。

 

解決

長遠看,需要SDK客戶端解決請求不帶server_name的問題。在nginx-ingress-controller無法通過sni和server_name找到對應的證書時,其會使用默認的端口證書,臨時通過配置默認端口證書解決。在nginx-ingress-controller的啟動參數,增加default-ssl-certificate指向此ingress引用的證書。

image-20200606214742276

參考:HTTPS 之 SSL/TLS 握手協議(Handshake Protocol)全過程解析


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM