如何获取证书的Base64编码SHA-256哈希值用于证书固定?
获取ECC证书Base64编码SHA-256哈希的可靠方法
方法一:修正OpenSSL命令(解决GitBash报错)
你之前的OpenSSL命令大概率是输入时出现乱码或格式错误,针对ECC证书,正确步骤如下:
- 抓取目标网站证书并保存为PEM格式:
openssl s_client -connect your-hostname:443 < /dev/null | openssl x509 -outform PEM > cert.pem - 提取公钥并计算哈希:
执行后直接输出openssl x509 -in cert.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64sha256/后所需的字符串,复制结果即可。
方法二:使用Java keytool+代码(稳定兼容ECC)
如果环境有JDK,用这套方法不会出现不稳定问题:
- 导出网站证书到本地:
keytool -printcert -rfc -sslserver your-hostname:443 > cert.pem - 运行以下Java代码计算哈希:
编译运行后输出的就是所需字符串,ECC和RSA证书都适用。import java.io.FileInputStream; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.MessageDigest; import java.util.Base64; public class CertHash { public static void main(String[] args) throws Exception { CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate) cf.generateCertificate(new FileInputStream("cert.pem")); byte[] pubKey = cert.getPublicKey().getEncoded(); MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] hash = md.digest(pubKey); System.out.println(Base64.getEncoder().encodeToString(hash)); } }
方法三:Python脚本(快捷无依赖)
有Python环境的话,用脚本一键生成:
import socket import ssl import hashlib import base64 hostname = "your-hostname" port = 443 context = ssl.create_default_context() with context.wrap_socket(socket.socket(), server_hostname=hostname) as s: s.connect((hostname, port)) cert = s.getpeercert(True) pubkey_hash = hashlib.sha256(cert).digest() print(base64.b64encode(pubkey_hash).decode('utf-8'))
替换your-hostname为目标域名,直接运行即可得到结果。
方法四:浏览器手动提取(直观易操作)
- 打开目标网站,点击地址栏锁图标→「证书」→「详细信息」→「公钥」,复制公钥的十六进制内容(去掉空格和换行)
- 用以下Python代码转换为目标哈希:
import hashlib import base64 hex_pubkey = "复制的公钥十六进制字符串" pubkey_bytes = bytes.fromhex(hex_pubkey) hash = hashlib.sha256(pubkey_bytes).digest() print(base64.b64encode(hash).decode('utf-8'))
内容的提问来源于stack exchange,提问作者Lena
相关产品推荐
相关产品推荐

