postgresql 使用jdbc鏈接過程的分析

  本人在開發pgoneproxy的過程當中,須要實現前端登陸到pgoneproxy,pgoneproxy針對前端進行校驗,校驗經過後才能使用鏈接池中的鏈接,而鏈接池中的鏈接是pgoneproxy經過發送數據包的方式進行的鏈接。前端

    下圖是客戶端與服務端在創建鏈接過程當中,發送的數據包的狀況:sql

    因爲postgresql 9.4已經支持SSL,故jdbc會先來請求是否容許使用SSL的方式進行驗證。若是不容許使用SSL的方式進行驗證,則服務端會發送一個N字符給客戶端,客戶端再發送startupMessage包給服務端。本文只講解非SSL鏈接的狀況,由於pgoneproxy只支持非SSL鏈接。數據庫

    在startupMessage包中包含了用戶名,數據庫或者其餘的參數名以及這些參數的值。服務端在接收到這些參數時,會根據服務端配置的驗證方式向客戶端發送Authentication包。目前postgresql支持的驗證方式有:Kerberos V5,明文的方式,MD5加密, SCM 方式,GSSAPI認證方式,SSPI認證方式,GSSAPI或者SSPI方式。它們之間的區別經過Authentication包中的第5個字節開始的4個字節進行標識。目前pgoneproxy已經支持明文,trust,MD5的驗證方式。後端

     客戶端在接收到Authentication包後,根據相應的規則生成密碼,經過PasswordMessage數據包發送到服務端,服務端進行驗證。若是驗證經過,則發送AuthenticationOK包給客戶端,緊接着發送參數包,BackendKey包給客戶端。其中backendkey包中包含了服務端進程的pid以及後端的祕鑰,當前端須要取消一個鏈接時就會使用這個祕鑰和pid來進行區分後端鏈接。若是驗證失敗,則會直接關閉此鏈接。post

      更多信息,請關注平民軟件加密

相關文章
相關標籤/搜索