如何将OpenSSL自签名证书的公钥转为.cer/.crt格式?
解决方法:从OpenSSL自签名证书获取.cer/.crt格式的公钥/证书
首先得澄清两个关键点:.cer和.crt本质只是文件后缀,它们可以是**PEM格式(Base64文本)或DER格式(二进制)**的证书,也可以用来存储单独的公钥(不过更常见的是用来存证书)。你的错误主要是混淆了「证书文件」和「单独公钥文件」的处理方式,下面分情况解决:
一、如果客户需要的是包含公钥的证书文件(最常见场景)
你已经生成的cert.pem本身就是完整的X.509证书,里面包含了公钥。只需要转换格式或改名就能得到.cer/.crt文件:
1. 直接改名(PEM格式,快速简单)
直接把cert.pem重命名为cert.crt或cert.cer即可。PEM格式的证书内容以-----BEGIN CERTIFICATE-----开头,绝大多数系统都支持这种格式的.crt/.cer文件。
2. 转换为DER二进制格式的.cer/.crt
如果客户明确要求二进制格式的证书,用这条命令:
openssl x509 -in cert.pem -out cert.cer -outform DER
这条命令会把PEM格式的证书转换成DER二进制格式,保存为.cer文件,完全符合要求,不会出现你之前的错误。
从头直接生成.cer/.crt格式的证书
如果你想一步到位生成目标格式的证书,直接在生成命令里指定输出格式:
- 生成DER格式的
.cer证书:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.cer -days 365 -outform DER
- 生成PEM格式的
.crt证书(其实就是换个后缀):
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.crt -days 365
二、如果客户需要的是单独的公钥文件(而非完整证书)
如果你确实需要导出单独的公钥并保存为.cer/.crt后缀,不能用处理证书的x509命令,要改用处理密钥的命令:
1. 从现有证书提取PEM格式公钥(你这步是对的)
openssl x509 -pubkey -noout -in cert.pem > public-key.pem
2. 转换为DER格式的公钥(.cer后缀)
用pkey命令处理单独的公钥:
openssl pkey -pubin -in public-key.pem -out public-key.cer -outform DER
或者针对RSA公钥,也可以用rsa命令:
openssl rsa -pubin -in public-key.pem -out public-key.cer -outform DER
为什么你之前的方法失败了?
- 第一种方法失败:你用
openssl x509命令去处理单独的公钥文件,但x509是专门处理X.509证书的工具,它期望文件开头是-----BEGIN CERTIFICATE-----,但你的公钥文件开头是-----BEGIN PUBLIC KEY-----,所以会报错“unable to load certificate”。 - 第二种方法失败:Windows证书导出向导的「导出公钥」选项需要证书对应的私钥也安装在系统中(并且标记为可导出),而你只导入了证书文件,没有私钥,所以选项是灰色的。另外,乱码是因为你用文本编辑器打开了二进制DER格式的文件——DER是二进制编码,不是文本,自然会显示乱码。
内容的提问来源于stack exchange,提问作者Sandeep Gupta
相关产品推荐
相关产品推荐

