第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決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'"當(dāng)我psql在命令行上直接運行它時,它可以工作,因此證書和密鑰文件必須有效。db_user.crt并且db_user.key都是 PEM 文件。(命令行也適用于sslmode='verify-full',因此 rootcert 也應(yīng)該沒問題)但是當(dāng)我pgx用那個連接字符串初始化一個池時,它失敗了:FATAL:連接需要有效的客戶端證書(SQLSTATE 28000)去期待 PEM 以外的東西嗎?還是應(yīng)該使用 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貢獻(xiàn)1784條經(jīng)驗 獲得超9個贊

概括

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

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

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

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

  • 當(dāng)sslcert包含客戶端證書+鏈時

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

細(xì)節(jié)

在后臺,pgx 使用pgconn模塊創(chuàng)建連接。反過來,這只是調(diào)用和文件tls.X509KeyPair的內(nèi)容。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}


查看完整回答
反對 回復(fù) 2023-02-14
  • 1 回答
  • 0 關(guān)注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號