从证书中获取公钥
- 行业动态
- 2025-04-13
- 6
从证书中提取公钥需解析证书结构,常见X.509证书可通过OpenSSL命令行工具或编程库实现,使用openssl x509命令解析PEM/DER格式证书,或通过Python cryptography库加载证书对象后调用public_key()方法直接获取公钥数据,支持RSA/ECC等多种加密算法。
在网络安全与数据加密领域,公钥是数字证书的核心组成部分,常用于验证身份、加密通信或数字签名,以下提供多种从证书中提取公钥的方法,操作步骤清晰且适用于不同场景。
通过命令行工具提取公钥(OpenSSL)
OpenSSL是广泛使用的开源工具,支持证书解析与密钥管理。
查看证书内容(以PEM格式为例)
若证书文件为certificate.pem
,执行命令:openssl x509 -in certificate.pem -text -noout ``` 包含证书持有者、颁发者、有效期及公钥信息。
直接提取公钥并保存
运行以下命令生成公钥文件public_key.pem
:openssl x509 -in certificate.pem -pubkey -noout > public_key.pem
公钥将以PEM格式存储,可直接用于加密或验证签名。
适用场景:服务器管理员、开发者在本地环境快速操作。
通过编程语言提取公钥
若需集成到代码中,以下为常用语言示例:
Python(使用
cryptography
库)from cryptography import x509 from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat with open("certificate.pem", "rb") as cert_file: pem_data = cert_file.read() cert = x509.load_pem_x509_certificate(pem_data) public_key = cert.public_key().public_bytes( Encoding.PEM, PublicFormat.SubjectPublicKeyInfo ) print(public_key.decode())
Java(使用
KeyStore
类)import java.io.FileInputStream; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; public class ExtractPublicKey { public static void main(String[] args) throws Exception { CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate) cf.generateCertificate( new FileInputStream("certificate.der") ); System.out.println(cert.getPublicKey()); } }
适用场景:开发者在应用程序中自动化处理证书。
使用在线工具解析证书
对非技术用户,以下工具可快速提取公钥:
- SSL Checker(如SSL Shopper)
上传证书文件或输入域名,工具自动解析并显示公钥。 - Certificate Decoder(如Decode Cert)
粘贴证书内容(PEM格式),直接获取公钥字段。
注意事项:
- 仅限测试或非敏感场景使用,避免上传含私钥的文件。
- 选择可信的在线工具,确认其隐私政策。
关键注意事项
- 区分证书格式
- PEM:以
-----BEGIN CERTIFICATE-----
开头,文本格式。 - DER:二进制格式,可通过OpenSSL转换为PEM:
openssl x509 -inform der -in certificate.der -out certificate.pem
- PEM:以
- 公钥与私钥的区别
- 公钥可公开分发,用于加密数据或验证签名。
- 私钥必须严格保密,用于解密或生成签名。
- 证书链完整性
提取公钥时需确保证书未过期且由可信机构签发,避免中间人攻击风险。
引用说明
- OpenSSL官方文档:https://www.openssl.org/docs/
- Python
cryptography
库文档:https://cryptography.io/ - RFC 5280(X.509证书标准):https://tools.ietf.org/html/rfc5280