本人在开发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
更多信息,请关注平民软件。加密