首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pgx tls连接引发有效证书的客户证书无效错误。

pgx tls连接引发有效证书的客户证书无效错误。
EN

Stack Overflow用户
提问于 2022-09-13 21:33:48
回答 1查看 39关注 0票数 0

我正在尝试使用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.crtdb_user.key都是PEM文件。(命令行也适用于sslmode='verify-full',因此rootcert也应该是安全的)

但是,当我用该连接字符串初始化一个pgx池时,它失败的原因是:

致命:连接需要有效的客户端证书(SQLSTATE 28000)

是不是在期待其他的东西而不是PEM?或者是否有一种不同的方法,ssl证书和密钥对应该用pgx初始化?

代码

代码语言:javascript
复制
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)
    }
}

从调用connect()输出

代码语言:javascript
复制
using connection string: "host='my-host.com' port='5432' dbname='my-db' user='my-db-user' sslmode='require' sslcert='/path/to/db_user.crt' sslkey='/path/to/db_user.key' sslrootcert='/path/to/ca_roots.pem'"
[info] Dialing PostgreSQL server : map[host:my-host.com]
[error] connect failed : map[err:failed to connect to `host=my-host.com user=my-db-user database=my-db`: server error (FATAL: connection requires a valid client certificate (SQLSTATE 28000))]
failed to connect to `host=my-host.com user=my-db-user database=my-db`: server error (FATAL: connection requires a valid client certificate (SQLSTATE 28000))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-14 19:42:39

摘要

最后,sslcert指出的证书需要包含完整的客户端证书链

/path/to/db_user.crt包含客户端证书和客户端证书链时,pgx连接正常工作。

尽管psql命令在这两种情况下都有效:

  • sslcert只是没有链的叶客户端证书时
  • sslcert包含客户端证书+链时

不知道为什么psql没有完整的链,但它现在起作用了。

详细信息

在底层,pgx使用pgconn模块创建连接.反过来,这只是对sslcertsslkey文件的内容调用sslkey

pgconn/config.go

代码语言:javascript
复制
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}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73709371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档