在 PostgreSQL 中设置调试环境以更好地理解 OpenSSL API

PostgreSQL开启openssl(通讯加密) 阅读详情

1. 概述

本文将介绍如何设置一个 gdb 调试环境,以深入了解 TLS 连接并更好地理解 PostgreSQL 中使用的 OpenSSL API。

2. 使用调试符号构建 OpenSSL

首先,检出 OpenSSL 源代码并切换到您想要使用的版本。在本例中,我想使用 OpenSSL 3.0.2 版本来编译 PostgreSQL,因此我切换到 openssl-3.0.2 版本标签。

$ git clone https://github.com/openssl/openssl.git
$ cd openssl
$ git checkout openssl-3.0.2

接着,使用以下选项编译带有 gdb 调试支持的 OpenSSL:

$ ./config --prefix=/tmp/ssl --openssldir=/tmp/ssl -d shared -g3 -ggdb -fno-inline -O0 -fno-omit-frame-pointer
$ make -j
$ make install

编译带有调试符号的 OpenSSL 可能需要一段时间,最好将 prefix 设置为某个路径,这样可以确保该调试版本得以保存并重复使用。

3. 使用调试版 OpenSSL 库编译 PostgreSQL

同样,首先检出 PostgreSQL 源代码并切换到您感兴趣的分支。在本文中,我将使用 master 分支进行演示:

$ git clone https://github.com/postgres/postgres.git

然后,使用启用调试选项的命令编译 PostgreSQL,并特别指定要链接的 OpenSSL 源代码和调试库:

$ ./configure --prefix=/tmp/pgapp --enable-tap-tests --enable-debug CC="gcc -std=gnu99" CFLAGS="-O0 -fno-omit-frame-pointer -I/tmp/openssl/include" LDFLAGS="-Wl,-rpath=/tmp/openssl" --with-openssl
$ make -j
$ make install

在这里,必须指定 LDFLAGS="-Wl,-rpath=/tmp/openssl",以确保 PostgreSQL 链接到您指定的 OpenSSL 库,否则它将链接到系统的库。为了进一步确认 PostgreSQL 链接的是您想要的 OpenSSL 库,通常可以运行以下命令:

$ which postgres
/tmp/pgapp/bin/postgres
$ ldd /tmp/pgapp/bin/postgres
    linux-vdso.so.1 (0x00007ffd8a3c1000)
    libssl.so.3 => /tmp/openssl/libssl.so.3 (0x00007f6878dc6000)
    libcrypto.so.3 => /tmp/openssl/libcrypto.so.3 (0x00007f6877c00000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f68781cf000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f68780e8000)
    libicui18n.so.70 => /lib/x86_64-linux-gnu/libicui18n.so.70 (0x00007f6877800000)
    libicuuc.so.70 => /lib/x86_64-linux-gnu/libicuuc.so.70 (0x00007f6877605000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6877200000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6878e75000)
    libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6876e00000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f68780c8000)
    libicudata.so.70 => /lib/x86_64-linux-gnu/libicudata.so.70 (0x00007f6875000000)

在这里,检查 libssl.so.3 和 libcrypto.so.3 库,以确保 PostgreSQL 和 psql 链接的是您期望的 OpenSSL 库。在上面的示例中,我的 PostgreSQL 链接到了刚刚编译并安装的、带有调试符号的 OpenSSL 库。

4. 享受调试

要在 TLS 连接设置或初始化过程中调试 OpenSSL API,您需要一些证书。您可以按照PostgreSQL 文档设置您自己的证书,或者按照以下步骤使用 SSL 回归测试文件夹下预构建的证书。步骤如下:

$ initdb -D /tmp/pgdata
$ cd postgres/src/test/ssl/ssl
$ cp -pr root_ca.crt server-cn-only+server_ca.crt server-cn-only.key /tmp/pgdata/
$ chmod 600 /tmp/pgdata/server-cn-only.key

然后,编辑 postgresql.conf 文件以启用 SSL 并指定证书相关的文件。例如:

$ vim pgdata/postgresql.conf
ssl = on
ssl_ca_file = 'root_ca.crt'
ssl_cert_file = 'server-cn-only+server_ca.crt'
ssl_key_file = 'server-cn-only.key'

在这里,启用了 SSL,根 CA 证书指向 root_ca.crt,并使用实体证书 server-cn-only 和中间 CA server_ca 作为 PostgreSQL 服务器的证书,同时对应的私钥文件也已设置。

现在,我们已经准备好使用 gdb 调试 OpenSSL API。

$ gdb -args postgres -D pgdata
...

(gdb) b be_tls_init
Breakpoint 1 at 0x419bf2: file be-secure-openssl.c, line 95.
(gdb) b SSL_CTX_use_certificate_chain_file
Breakpoint 2 at 0xd9970

Breakpoint 1, be_tls_init (isServerStart=true) at be-secure-openssl.c:95
95      int         ssl_ver_min = -1;
(gdb) c
Continuing.

Breakpoint 2, SSL_CTX_use_certificate_chain_file (ctx=0x5555561e9ba0, file=0x5555561ddc08 "server-cn-only+server_ca.crt") at ssl/ssl_rsa.c:534
534     return use_certificate_chain_file(ctx, NULL, file);
(gdb) s
use_certificate_chain_file (ctx=0x5555561e9ba0, ssl=0x0, file=0x5555561ddc08 "server-cn-only+server_ca.crt") at ssl/ssl_rsa.c:419
419 {
420     BIO *in;
421     int ret = 0;
422     X509 *x = NULL;
423     pem_password_cb *passwd_callback;

(gdb) l
414  * Read a file that contains our certificate in "PEM" format, possibly
415  * followed by a sequence of CA certificates that should be sent to the peer
416  * in the Certificate message.
417  */
418 static int use_certificate_chain_file(SSL_CTX *ctx, SSL *ssl, const char *file)
419 {
420     BIO *in;
421     int ret = 0;
422     X509 *x = NULL;
423     pem_password_cb *passwd_callback;

(gdb) p file
$2 = 0x5555561ddc08 "server-cn-only+server_ca.crt"

(gdb) pt ctx
type = struct ssl_ctx_st {
    OSSL_LIB_CTX *libctx;
    const SSL_METHOD *method;
    struct stack_st_SSL_CIPHER *cipher_list;
    struct stack_st_SSL_CIPHER *cipher_list_by_id;
    struct stack_st_SSL_CIPHER *tls13_ciphersuites;
    struct x509_store_st *cert_store;

在上面的示例中,我启用了两个断点:be_tls_init 和 SSL_CTX_use_certificate_chain_file。be_tls_init 用来确保 PostgreSQL 已启用调试符号,而 SSL_CTX_use_certificate_chain_file 用来深入分析 OpenSSL。在这里,我们可以输出这个复杂的 ctx 对象作为示例。

通过这个调试环境设置,您应该能够调试 psql 客户端端,深入了解整个 TLS 过程。

5. 总结

在本文中,解释了如何设置一个简单的 gdb 调试环境,以深入了解 OpenSSL,希望它对您有所帮助。

使用Metasploit复现OpenSSL心脏滴血漏洞:原理、实战与防御 SSL/TLS协议是保障网络通信安全的基石,通过加密机制确保数据传输的机密性与完整性。其核心原理基于非对称加密与对称加密的结合,在握手阶段协商密钥,建立安全信道。然而,协议实现中的缺陷可能导致严重的安全风险,例如内存信息泄露漏洞,攻击者可利用此类漏洞窃取敏感数据。心脏滴血(Heartbleed)漏洞正是OpenSSL库在实现TLS心跳扩展时,因未严格验证用户输入长度而引发的经典案例,属于缓冲区溢出漏洞的一种。该漏洞的技术价值在于揭示了基础安全库中一个微小逻辑缺陷可能引发的全局性风险,影响了当时全球近三分之二 阅读详情

相关推荐

CentOS 7部署OpenClaw:从环境配置到生产级AI助手集成实战

自动化流程与智能助手集成是当前企业提升效率的关键技术方向,其核心在于通过中间件将本地服务、API与大型语言模型(LLM)无缝连接。实现这一目标通常涉及环境配置、依赖管理、服务部署与网络调优等基础工程实践。在CentOS 7这类经典Linux生产环境中,部署此类集成平台面临Python版本升级、系统依赖、防火墙及SELinux策略调整等具体挑战。本文以开源项目OpenClaw为例,详细解析了在CentOS 7.9上从系统基础配置、软件源优化,到核心组件安装、反向代理设置,再到使用Systemd进行服务化部署的

weixin_34072458的博客 343

PostgreSQL安装和开启SSL加密连接【配置单/双向认证】

服务端按需求配置postgres.conf、pg_hba.conf两个配置文件,并放入相关证书文件,客户端对应配置即可打开SSL单/双向认证连接

schwein_van的博客 1万+

从零部署Dify RAG知识库:私有化部署、模型接入与生产环境配置全指南

检索增强生成(RAG)技术通过结合信息检索与大型语言模型生成能力,有效解决了LLM的知识实时性与准确性问题。其核心原理是将外部知识库向量化存储,在问答时先检索相关文档片段,再提供给LLM生成有依据的答案。这项技术对于构建企业级智能问答、文档分析等应用具有重要价值,尤其在处理私有化、敏感数据场景下优势明显。在实际部署中,自托管方案能提供数据安全、模型选择灵活性和成本可控性。本文以Dify平台为例,深入探讨私有化部署过程中的环境规划、Docker容器化部署、本地模型集成等关键技术环节,并针对内存优化、网络配置等

weixin_33709609的博客 1108

postgresql-11启用ssl安全连接方式

原因 为了提高postgresql数据库连接访问安全性,降低数据传输是被窃取偷听.所以对postgresql数据库启用ssl安全传输功能. 操作环境: Liunx(Centos7.6) postgresql-11.5 1.postgresql安装(略) 注意: 编译配置时应该加上 --with-openssl参数,让postgresql支持ssl认证方式,即 ./configure ... ...

baidu_38981831的博客 8215

Claude Opus 4.7信号价值解码:API兼容性、上下文实效与system card调试指南

大语言模型的‘能力’需回归工程语境——从抽象指标转向可观测信号。Claude Opus系列作为Anthropic旗舰模型,其真实价值不在于参数或榜单分数,而体现在API调用稳定性、上下文窗口的有效利用率、多步工具调用的确定性衰减,以及system card所承载的可验证行为承诺。尤其在企业级AI应用中,‘claude opus国内能用吗’‘api error: context window limit’等高频问题,本质是模型能力边界、基础设施适配与可信度验证三者失配的结果。本文基于Opus 4.7实测数据,

weixin_34015336的博客 389

Pandas API对接Redshift的生产级ETL实践

Pandas API作为Python生态中主流的数据处理接口,常被用于轻量级ETL任务;其核心原理是通过SQLAlchemy引擎桥接数据库连接,将关系型数据加载为DataFrame进行内存计算与转换,再批量写回目标库。技术价值在于开发效率高、调试直观、逻辑可审计,特别适合T+1级增量同步、字段级清洗及跨源类型适配等场景。在AWS Redshift环境中,需重点解决连接池管理、浮点精度丢失、字符集乱码、安全组配置及批量写入性能瓶颈等问题。本文聚焦Pandas+SQLAlchemy+Redshift组合在真实电

weixin_33794672的博客 521

PostgreSQL 使用 ---- 配置 SSL/TLS/TLCP 加密传输

介绍 PostgreSQL 数据库 SSL/TLS、TLCP 加密通讯的使用

你好!我是一名互联网搬砖的菜鸟,我的博客主要记录我在工作和学习过程中积累的项目经验和技术总结。 我希望通过这些文章,能够帮助更多的开发者解决实际问题,提高开发效率。 欢迎大家订阅我的博客,期待与你们的互动和交流! 3354

从零部署Deepseek Harness:一站式LLM应用平台实战指南

大型语言模型(LLM)的工程化部署与管理是当前AI应用落地的核心挑战。其原理在于通过构建标准化的中间件平台,统一处理模型调用、版本控制与资源调度,从而将模型能力高效、稳定地转化为API服务。这一技术价值显著,它能大幅降低AI应用开发门槛,提升资源利用率和系统可维护性。在应用场景上,无论是构建企业内部智能助手、代码生成工具,还是对外提供模型API服务,一个健壮的模型服务平台都至关重要。本文聚焦于Deepseek Harness这一热门平台,详细拆解其从环境准备、依赖安装到服务部署的完整实战流程,并针对模型加载

weixin_30617695的博客 370

编译安装postgresql

编译前需要安装必要的开发工具和库前往找到需要的版本,使用wget下载并解压# 配置编译参数make -j4。

xiaozhenghahaha的博客 1150

POCO C++库编译十大常见错误深度解析与解决方案

在C++跨平台开发中,第三方库的集成与编译是开发者常遇到的核心挑战,尤其涉及网络通信、数据加密等基础功能时。其原理在于构建系统(如CMake)需要正确解析库依赖、头文件路径和链接符号,任何环节的配置偏差都会导致编译失败。掌握这些底层机制的技术价值在于,它能显著提升开发效率,减少环境配置时间,确保项目构建的稳定性和可复现性。在实际应用场景中,POCO C++库作为广泛使用的网络与工具库,其编译过程常因OpenSSL、PCRE等第三方依赖问题而受阻,例如典型的“openssl/ssl.h: No such fi

weixin_34268843的博客 305

DeepSeek工业级落地实战:从本地部署到IDE集成与API生产集成

大语言模型(LLM)正从研究原型迈向工业级应用,其核心在于推理稳定性、长上下文处理能力与中文语义理解精度。DeepSeek凭借全栈自研训练框架、万卡智算集群支撑及MoE架构优化,在代码生成、专利分析、AI Agent编排等场景展现出显著工程优势。技术价值体现在低延迟API吞吐、AWQ量化兼容性、vLLM推理引擎深度适配,以及VS Code/IDEA插件级上下文感知与本地知识库绑定能力。典型应用场景覆盖金融合规本地部署、医疗病历结构化提取、智能招聘Agent协同层构建,以及专利跨模态图文检索。本文聚焦Deep

weixin_34109408的博客 407

Docker化Flask API:从本地开发到生产部署的完整实践

Flask是Python轻量级Web框架的代表,Docker则提供跨环境一致的运行时封装能力。理解二者结合的本质,需回归到‘环境一致性’这一核心工程问题:传统virtualenv仅隔离Python包,而Docker通过Linux命名空间与cgroups实现系统级硬隔离,彻底解决glibc、openssl、C扩展等底层依赖冲突。其技术价值在于将‘在我机器上能跑’转化为可验证、可复现、可交付的标准化镜像。典型应用场景包括快速联调API、教学演示环境搭建、以及运维侧服务容器化准入验证。本文聚焦Flask + Do

weixin_33853794的博客 375

RubyMine深度环境重建与运行时补丁实战指南

RubyMine作为专业Ruby/Rails IDE,其稳定运行依赖于IDE内核、JVM运行时与Ruby解释器三层协同。理解JVM Agent加载机制、Ruby动态库符号兼容性及macOS硬编码签名策略,是解决启动失败、断点失效、portable ruby安装异常等高频问题的技术基础。本文聚焦RubyMine在macOS Sonoma+Ruby 3.2+Rails 7环境下的可复现适配方案,涵盖JBR配置、--enable-load-relative编译参数控制、libruby.dylib劫持补丁等核心实践

weixin_34056162的博客 320

企业级LLM知识平台部署实战:WeKnora容器化架构与生产环境优化指南

WeKnora作为开源LLM知识平台,通过RAG检索增强生成、自主推理代理和自维护Wiki三大核心能力,将原始文档转化为可查询的知识资产。本文为技术决策者和运维团队提供从架构设计到生产部署的完整解决方案,涵盖环境评估、容器化部署、性能优化和安全加固等关键环节。 ## 环境评估与容量规划 在部署WeKnora之前,必须进行全面的环境评估和容量规划。系统资源需求因使用场景而异,以下是不同规模部署的

gitblog_00746的博客 1022

Python SSL证书验证终极指南:certifi原理、实战与深度调试

SSL/TLS证书验证是网络安全通信的基石,它通过非对称加密和数字签名技术,在客户端与服务器之间建立可信的加密连接。其核心原理依赖于证书颁发机构(CA)的信任链机制,确保数据传输的机密性、完整性和身份真实性。在Python生态中,certifi库作为维护最新Mozilla CA证书包的标准解决方案,为requests、httpx等主流网络库提供了统一可靠的信任锚点。无论是处理企业内网的自签名证书,还是调试SSL:CERTIFICATE_VERIFY_FAILED等常见错误,理解certifi的工作机制都至关

weixin_34218579的博客 446

STM32F103C8T6最小系统板GPIO配置避坑指南:从原理图到流水灯一次成功

本文详细介绍了STM32F103C8T6最小系统板GPIO配置的实战指南,从硬件准备到流水灯实现,涵盖了九大关键步骤。特别针对新手常见问题,如GPIO配置、开发环境搭建和程序下载调试,提供了详细的解决方案和避坑技巧,帮助开发者快速掌握STM32开发基础。

weixin_33756596的博客 341

CentOS 7部署OpenClaw AI网关:从环境配置到生产级运维全攻略

AI模型服务网关是统一管理多种大模型API的核心中间件,其核心原理是通过标准化接口将ChatGPT、Claude、Llama等不同供应商的模型服务进行抽象和聚合。这项技术的关键价值在于实现应用层与底层模型服务的解耦,提供负载均衡、限流、成本控制和监控等企业级功能,从而显著提升AI应用开发的灵活性与运维效率。在实际应用场景中,AI网关常用于构建多模型调度平台、自动化AI工作流以及企业内部AI能力中台。本文将聚焦于在CentOS 7这一经典企业级Linux发行版上,从Python环境配置、Docker部署到Op

weixin_30367169的博客 395

基于IDEA与Mill构建Windows下的Chisel开发环境——香山处理器源码解析实战

本文详细指导如何在Windows系统下使用IDEA集成开发环境和Mill构建工具搭建Chisel开发环境,并以香山处理器源码为实战案例进行解析。内容涵盖环境准备、源码获取、工程构建、IDEA配置优化及代码阅读技巧,帮助开发者高效学习硬件设计语言。

a1b2c3d的博客 718

Laravel框架安装指南:从环境配置到生产部署

PHP作为流行的服务器端脚本语言,其框架生态中的Laravel凭借优雅的语法和丰富的功能成为开发者首选。通过Composer依赖管理工具,Laravel实现了快速安装和模块化开发,显著提升了Web应用开发效率。该框架采用MVC架构模式,内置Eloquent ORM、Blade模板引擎等核心组件,特别适合构建中大型企业级应用。在安装过程中,环境配置是关键环节,需要确保PHP 8.1+、Composer 2.2+等基础依赖,并正确设置storage目录权限。使用Laravel Sail可以快速搭建Docker开

weixin_34198762的博客 398

RI-CLPM vs CLPM:什么时候该用随机截距交叉滞后模型?

本文深入对比了交叉滞后模型(CLPM)与随机截距交叉滞后模型(RI-CLPM)的核心差异与应用场景。RI-CLPM通过分离个体间稳定特质与个体内动态波动,能更纯净地估计变量间的动态因果关系,避免CLPM可能存在的混淆。文章提供了清晰的模型选择决策框架,并辅以Mplus语法示例,帮助研究者根据变量特质稳定性与研究问题,正确选用模型以确保结论的严谨性。

weixin_29276847的博客 306

【Qualcomm高通音频】音效调试_录音文件播放有杂音,如何定位原因?

一、录音播放数据处理过程介绍 (1)TX方向 麦克风(硅麦克风或者主机体麦克风)采集模拟音频信号,经过内部CODEC芯片中的adc转换为数字信号,在经过高通音频DSP处理音效后编码为wav/aac/amr/mp3等格式文件。 (2)RX方向 音频文件经过解码、重采样还原为pcm数据,经过DSP处理音效后送到内部CODEC,然后经过DAC转换为模拟信号,送到喇叭。 二、分析步骤 1...

crow_ch的博客 5976

OpenClaw安装部署全攻略:从环境配置到生产级调优

在Python生态中,依赖管理和环境隔离是保障项目稳定运行的基础技术。通过虚拟环境(如conda)实现依赖隔离,能有效解决库版本冲突问题,其原理是为每个项目创建独立的Python运行时。这一实践对自动化工具部署尤为重要,能确保复杂依赖链的完整性。在数据抓取与自动化任务场景下,环境配置的规范性直接影响工具的可用性。以OpenClaw为例,其安装涉及系统依赖、Python包管理及可选组件配置。通过标准化流程处理编译错误和依赖冲突,并结合容器化部署,可实现从开发到生产的平滑迁移。本文聚焦OpenClaw这一具体工

weixin_33671935的博客 322

《Python入门到精通》函数详解

函数就是一段「封装」起来的「代码」,目的是提高代码的「模块性」和「复用性」。 2、函数的参数 2.1、变量的就近原则 2.2、传递参数 2.3、形参和实参 2.4、位置参数 2.5、缺省参数 2.6、可变类型和不可变类型 2.7、关键字参数 3、匿名函数 4、函数的返回值

wangyuxiang946的博客 1万+
上一篇: 深入理解 PostgreSQL Planner:简化扫描路径与查询计划
下一篇: 手把手教你在 openKylin 上部署 IvorySQL 4.4
IvorySQL
博客等级 码龄5年 745粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值