You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PostgreSQL库生成数据库中公证书的x5t#256指纹?

为PostgreSQL中的公钥生成x5t#256指纹

需求背景

需要在SQL迁移脚本中为数据库内所有公钥批量生成x5t#256指纹,替代Java/JS的实现方式,且pgcrypto无法满足需求。

解决方案:用PostgreSQL内置函数实现自定义转换

无需额外安装库,通过组合PostgreSQL的字符串处理、哈希和编码函数,即可实现与你提供的Shell命令完全一致的转换逻辑。

自定义函数实现

创建一个SQL函数generate_x5t_sha256,接收PEM格式的公钥/证书字符串,返回x5t#256指纹:

CREATE OR REPLACE FUNCTION generate_x5t_sha256(pem_cert TEXT)
RETURNS TEXT AS $$
DECLARE
    der_cert BYTEA;
    sha256_hash BYTEA;
    base64_str TEXT;
BEGIN
    -- 1. 提取PEM证书中的Base64内容(去除首尾标记和换行)
    pem_cert := REGEXP_REPLACE(pem_cert, '-----BEGIN CERTIFICATE-----|-----END CERTIFICATE-----|\r|\n', '', 'g');
    
    -- 2. 将Base64解码为DER格式的证书字节流
    der_cert := DECODE(pem_cert, 'base64');
    
    -- 3. 计算DER证书的SHA256哈希
    sha256_hash := DIGEST(der_cert, 'sha256');
    
    -- 4. 对哈希值做Base64编码,然后转换为URL安全格式(替换+/为-_,去除末尾=)
    base64_str := ENCODE(sha256_hash, 'base64');
    base64_str := REPLACE(REPLACE(base64_str, '+', '-'), '/', '_');
    base64_str := RTRIM(base64_str, '=');
    
    RETURN base64_str;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

测试示例

用你提供的示例证书验证函数效果:

SELECT generate_x5t_sha256('-----BEGIN CERTIFICATE-----
MIICrzCCAZegAwIBAgIGAYk++jfeMA0GCSqGSIb3DQEBCwUAMBMxETAPBgNVBAMT
CE1vY2stSURBMB4XDTIzMDcxMDAzMTUzM1oXDTIzMDcyMDAzMTUzM1owHjEcMBoG
A1UEAxMTU2lkZGhhcnRoIEsgTWFuc291cjCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAJy7TzHJJNkjlnSi87fkUr8NMM9k3UIkoAtAqiH7J4uPG1wcdgQK
luX1wfhsed7TUnblrZCZXOaxqT2kN1uniC28bekQPkWs/e0Mm8s3r7ncxyTtCMlS
kSlg6ZFN3bV2m3x893vFx81yOGk534Jc9O9qxouxB7WMHn8ynM9BE8k0VaNXyj2/
z0E7IXqpei4UDNdTU0avmqYGjw/YTsTdlrwQebwn9clwVvld2ZFV4jdgErTqLJ/Y
u7wIZmYzL3ib5kf2+tVZhY/MnqsT0Bx+TFatnd2Aout5/Hs2V2HdwSBY6ET6SXVT
NXKDtH3Sw6AyNPj+jo6l5IARsuOvWioTrfsCAwEAATANBgkqhkiG9w0BAQsFAAOC
AQEAgOtPRuk9IyrRGOFWyFlwJdqZxqVO+78UAJKJmBiko6xxeezkYqqiAuwcyWFj
XWmvvcwlTdCyfEnGWRi74r4ma7u0h5O4U3AJxPF0/BKklCF9nabRqtSC9ENPKHpf
/MAsZF/dQkzQ+k8oqCVKgg/OpgmLGg1dBFvBUOsSUtzp2Mv3GhQO8cjHb32YsS2C
EL2oRcBvJ0SQ9kmYaZ4Pb08xlbTTWbNtPJDj58w4S5Xs2PFlbJr/Ibe3DZM7nYym
zfeCZDzlkLcSCpEaFCMdeuZSpmdSrRaJ9gquR+Ix3uYrqKNmd6eVq+yr1F5DXu9e
c6Ny6Ira8ylf96JLLRfh3b5G4w==
-----END CERTIFICATE-----');

执行后将返回目标指纹:Zv2OGTzr7Nq7L2ijjjIY8ZSUIi9fVvxFtjmO7gYU0CY

批量更新数据库中的公钥

假设你的表名为certificates,公钥字段为public_key,新增指纹字段x5t_sha256,可以用以下SQL批量更新:

ALTER TABLE certificates ADD COLUMN x5t_sha256 TEXT;

UPDATE certificates
SET x5t_sha256 = generate_x5t_sha256(public_key)
WHERE public_key IS NOT NULL;

备选方案:使用第三方扩展

如果需要处理更复杂的X.509证书操作(如解析证书字段),可以考虑安装pgsql-x509扩展,它提供了完整的X.509证书解析和哈希生成功能。不过对于单纯生成x5t#256指纹的需求,上述内置函数方案足够轻量且无需额外依赖。

内容的提问来源于stack exchange,提问作者Hitesh jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:59:50