将.pfx转换为.cer

200

是否可以将.pfx(个人信息交换)文件转换为.cer(安全证书)文件?除非我弄错了,.cer不是以某种方式嵌入在.pfx中吗?如果可能的话,我想要一种提取它的方法。

8个回答

277

PFX文件是PKCS#12个人信息交换语法标准的捆绑包。它们可以包括任意数量的私钥与相应的X.509证书以及证书颁发机构链(一组证书)。

如果您想提取客户端证书,您可以使用OpenSSL的PKCS12工具

openssl pkcs12 -in input.pfx -out mycerts.crt -nokeys -clcerts

以上命令将以PEM格式输出证书。 ".crt"文件扩展名在macOS和Windows中均可处理。

您在问题中提到了".cer"扩展名,它通常用于DER编码的文件。二进制编码。首先尝试使用“.crt”文件,如果不被接受,则很容易从PEM转换为DER:

openssl x509 -inform pem -in mycerts.crt -outform der -out mycerts.cer

20
除了提供命令,+1解释文件是什么。 - Joshua Drake
当我尝试验证时,出现了“Mac验证错误:无效密码?” 我不知道任何密码,我只有供应商提供的文件。 - Brian Knoblauch
1
当尝试转换带有私钥的证书以供 Fiddler 使用时,似乎删除“-nokeys”可以起作用。 - Gert van den Berg
@Berk,除了OpenSSL外,Windows命令提示符有没有其他方法可以实现? - Pacerier

106

我认为简单的方法是使用Windows管理控制台中的证书管理器导入和导出,以此来处理相关技术。


10
我尝试着这样做,但当我选择导出私钥时,我发现.cer(DER编码)选项被禁用了。而且midletsigner工具无论如何都需要私钥。 - jmj
3
当您导入它时,必须勾选该框,该框应标记为“可导出此密钥”。 - Andrew Cox
12
如何在Windows中打开证书管理器:http://msdn.microsoft.com/zh-cn/library/ms788967.aspx - James White
13
打开Windows证书管理器的简便方法是在命令提示符下键入"certmgr.msc"。 - Jan Derk
@AndrewCox,但是将其标记为可导出和不标记有什么幕后的区别吗?还是说这只是一个UI选项? - Pacerier

64

如果你正在使用PowerShell,可以使用以下内容生成DER编码(二进制)证书文件OutputCert.der,假设有一个pfx文件InputBundle.pfx:

$pwd = ConvertTo-SecureString -String "YourPFXPassword" -Force -AsPlainText
Import-PfxCertificate -FilePath "C:\Path\To\InputBundle.pfx" -CertStoreLocation cert:\CurrentUser\My -Password $pwd
$cert = Get-ChildItem -Path "cert:\CurrentUser\My" | Where-Object {$_.Subject -eq "YourCertificateSubjectName"}
$binaryCert = $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Cert)
[io.file]::WriteAllBytes("C:\Path\To\OutputCert.der", $binaryCert)
Get-PfxCertificate -FilePath InputBundle.pfx | 
Export-Certificate -FilePath OutputCert.der -Type CERT

为了清晰起见添加了换行符,但当然您可以将所有内容放在单行中。

如果您需要以ASCII/Base64编码PEM格式获取证书,则可以采取其他措施进行操作,具体文档请参见此处:https://superuser.com/questions/351548/windows-integrated-utility-to-convert-der-to-pem

如果您需要导出不同于DER编码的格式,则可以更改Export-Certificate的-Type参数,使用.NET支持的类型,如在help Export-Certificate -Detailed中所示:

-Type <CertType>
    Specifies the type of output file for the certificate export as follows. 
     -- SST: A Microsoft serialized certificate store (.sst) file format which can contain one or more certificates. This is the default value for multiple certificates. 
     -- CERT: A .cer file format which contains a single DER-encoded certificate. This is the default value for one certificate. 
     -- P7B: A PKCS#7 file format which can contain one or more certificates.

Export-Certificate仅适用于某些版本,如Win 8.1和Server 2012 R2。如果您使用的是其他版本,如Win 7,则没有机会! - Deep-B
1
它应该存在于Server 2012和Windows 8.0中(https://technet.microsoft.com/en-us/library/hh848628(v=wps.620).aspx),但关于Windows 7等方面的确实是一个好观点! - Ian Gallagher
@IanGallagher,这与OpenSSL的选项相比如何? - Pacerier
如果你不想安装OpenSSL的东西,这种方式会更加方便! - Leonardo Herrera

33

我想添加一个最简单的方法。

  1. 右键单击pfx文件,选择“安装”,按照向导操作并将其添加到存储区(我添加到了个人存储区)。

  2. 在开始菜单中输入certmgr.msc,进入CertManager程序。

  3. 找到您的pfx证书(顶部的选项卡是各种存储区),单击“导出”按钮并按照向导操作(有一个导出为.CER的选项)

本质上它与安德鲁的答案相同,但它避免了使用Windows管理控制台(直接进入导入/导出过程)。


并不会更快,因为您仍然需要打开certmgr.msc来导出它... - Pacerier
我知道有一种简单的方法可以做到这一点,非常感谢!很顺利地运作。[+1] - kapitan

3
你可以使用这个方法从.pfx文件中提取出ca-bundle、.crt和.key。
# Extracting ca-certs..."
  openssl pkcs12 -in ${filename}.pfx -nodes -nokeys -cacerts -out ${filename}-ca.crt

# Extracting key file..."
  openssl pkcs12 -in ${filename}.pfx -nocerts -out ${filename}.key

# Extracting crt..."
  openssl pkcs12 -in ${filename}.pfx -clcerts -nokeys -out ${filename}.crt

# combine ca-certs and cert files
  cat  ${filename}.crt ${filename}-ca.crt > ${filename}-full.crt

# Removing passphrase from keyfile"
  openssl rsa -in ${filename}.key -out ${filename}.key

2
  1. 从OpenSSL\bin文件夹启动OpenSSL。
  2. 打开命令提示符并进入包含.pfx文件的文件夹。
  3. 运行以下命令以提取私钥: openssl pkcs12 -in [yourfile.pfx] -nocerts -out [drlive.key] 您将被提示输入导入密码。输入创建.pfx文件时用于保护密钥对的密码。然后,您将再次被提示提供一个新密码以保护正在创建的.key文件。请将密钥文件的密码存储在安全的地方以避免误用。
  4. 运行以下命令以提取证书: openssl pkcs12 -in [yourfile.pfx] -clcerts -nokeys -out [drlive.crt]
  5. openssl rsa -in [drlive.key] -out [drlive-decrypted.key]

将.pfx文件转换为.pem格式

有时您需要将.pfx文件转换为.pem格式。运行以下命令以将其转换为PEM格式。

openssl rsa -in [keyfile-encrypted.key] -outform PEM -out [keyfile-encrypted-pem.key]

来源:https://www.ibm.com/docs/en/arl/9.7?topic=certification-extracting-certificate-keys-from-pfx-file


1

这可能与提问者的问题无关,但我已尝试使用所有不同的标志和openssl语句,同时尝试使用PHP \SoapClient(...)进行连接,在经过3天的尝试之后,我终于找到了适合我的解决方案。

GitBash

$ cd path/to/certificate/
$ openssl pkcs12 -in personal_certificate.pfx -out public_key.pem -clcerts

首先,您需要输入YOUR_CERT_PASSWORD一次,然后再输入DIFFERENT_PASSWORD!两次。后者可能对所有具有访问代码权限的人都可用。

PHP

$wsdlUrl   = "https://example.com/service.svc?singlewsdl";
$publicKey = "rel/path/to/certificate/public_key.pem";
$password  = "DIFFERENT_PASSWORD!";

$params = [
    'local_cert' => $publicKey,
    'passphrase' => $password,
    'trace' => 1,
    'exceptions' => 0
];

$soapClient = new \SoapClient($wsdlUrl, $params);

var_dump($soapClient->__getFunctions());

-1
openssl rsa -in f.pem -inform PEM -out f.der -outform DER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接