亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

pgx tls 連接拋出有效證書的客戶端證書無效錯誤

pgx tls 連接拋出有效證書的客戶端證書無效錯誤

Go
aluckdog 2023-02-14 15:37:24
我正在嘗試使用 pgx 與 postgres 10 db 建立 TLS 連接。我的連接字符串類似于:"host='my-host.com' port='5432' dbname='my-db' user='my-db-user' sslmode='verify-full' sslcert='/path/to/db_user.crt' sslkey='/path/to/db_user.key' sslrootcert='/path/to/ca_roots.pem'"當我psql在命令行上直接運行它時,它可以工作,因此證書和密鑰文件必須有效。db_user.crt并且db_user.key都是 PEM 文件。(命令行也適用于sslmode='verify-full',因此 rootcert 也應該沒問題)但是當我pgx用那個連接字符串初始化一個池時,它失敗了:FATAL:連接需要有效的客戶端證書(SQLSTATE 28000)去期待 PEM 以外的東西嗎?還是應該使用 pgx 初始化 ssl 證書和密鑰對的不同方式?代碼import (    "context"    "fmt"    "os"    "github.com/jackc/pgx/v4"    "github.com/jackc/pgx/v4/pgxpool")type mockLogger struct{}func (ml *mockLogger) Log(ctx context.Context, level pgx.LogLevel, msg string, data map[string]interface{}) {    fmt.Printf("[%s] %s : %+v\n", level.String(), msg, data)}func connect() error {    connStr := "host='my-host.com' port='5432' dbname='my-db' user='my-db-user' sslmode='verify-full' sslcert='/path/to/db_user.crt' sslkey='/path/to/db_user.key' sslrootcert='/path/to/ca_roots.pem'"    poolCfg, err := pgxpool.ParseConfig(connStr)    if err != nil {        return err    }    poolCfg.ConnConfig.Logger = &mockLogger{}    poolCfg.ConnConfig.LogLevel = pgx.LogLevelTrace    fmt.Printf("using connection string: \"%s\"\n", poolCfg.ConnString())    connPool, err := pgxpool.ConnectConfig(context.TODO(), poolCfg)    if err != nil {        return err    }    connPool.Close()    return nil}func main() {    if err := connect(); err != nil {        fmt.Printf("%+v\n", err)        os.Exit(1)    }}
查看完整描述

1 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

概括

事實證明,證書指向的證書sslcert需要包含完整的客戶端證書鏈。

/path/to/db_user.crt包含客戶端證書后跟客戶端證書鏈時,pgx連接有效。

而該psql命令在兩種情況下都有效:

  • 什么時候sslcert只是沒有鏈的葉客戶端證書

  • sslcert包含客戶端證書+鏈時

不知道為什么 psql 在沒有完整鏈的情況下很好,但它現在可以工作了。

細節

在后臺,pgx 使用pgconn模塊創建連接。反過來,這只是調用和文件tls.X509KeyPair的內容。sslcertsslkey

pgconn/config.go :

func configTLS(settings map[string]string, thisHost string, parseConfigOptions ParseConfigOptions) ([]*tls.Config, error) {

    [...]

    sslcert := settings["sslcert"]

    sslkey := settings["sslkey"]

    [...]

    if sslcert != "" && sslkey != "" {

        [...]

        certfile, err := ioutil.ReadFile(sslcert)

        if err != nil {

            return nil, fmt.Errorf("unable to read cert: %w", err)

        }

        cert, err := tls.X509KeyPair(certfile, pemKey)

        if err != nil {

            return nil, fmt.Errorf("unable to load cert: %w", err)

        }

        tlsConfig.Certificates = []tls.Certificate{cert}


查看完整回答
反對 回復 2023-02-14
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號