如何从证书和私钥创建.pfx文件?

606
我需要 .pfx 文件来在 IIS 上安装网站的 https。
我有两个独立的文件:证书(.cer或pem)和私钥(.crt),但是IIS只接受.pfx文件。
显然,我已经安装了证书,并且它在证书管理器(mmc)中可用,但是当我选择证书导出向导时,我无法选择PFX格式(它被禁用了)。
是否有任何工具可以做到这一点或者C#编写的示例程序?

2
可能是重复的问题:将 CERT/PEM 证书转换为 PFX 证书 - Daniel DiPaolo
1
是的,但它的答案并不明确,并且在我的情况下没有解决任何问题。 - jlp
http://www.slproweb.com/products/Win32OpenSSL.html - alexl
在几乎所有情况下,Openssl都是完全不必要的。我刚刚添加了我的答案(我创建了一个博客来提供)。具有讽刺意味的是,当您按预期生成CSR时,您可能甚至不需要PFX。 - rainabba
今天我在Windows IIS上安装PFX文件,遇到了生成PFX文件的相同问题,最终看到了你的问题。如果其他人需要一个简单的选项,我最终采取的方法是购买了这些人的SSL证书:https://www.ssltrust.com.au/geotrust,当您收集证书时,他们实际上有一个内置的PFX文件生成器,因此您可以构建并下载它以立即安装。 - PixelPaul
18个回答

927

你需要使用openssl。

openssl pkcs12 -export -out domain.name.pfx -inkey domain.name.key -in domain.name.crt

密钥文件只是一个包含您私钥的文本文件。

如果您拥有根CA和中间证书,则可以使用多个-in参数将它们一起包含。

openssl pkcs12 -export -out domain.name.pfx -inkey domain.name.key -in domain.name.crt -in intermediate.crt -in rootca.crt

如果你有一个捆绑的crt文件,例如在使用nginx时,你可以将其与证书一起传递:

cat domain.name.crt | tee -a domain.name.bundled.crt
cat intermediate.crt | tee -a domain.name.bundled.crt
cat rootca.crt | tee -a domain.name.bundled.crt
openssl pkcs12 -export -out domain.name.pfx \
  -inkey domain.name.key \
  -in domain.name.bundled.crt 
您可以从这里安装openssl:openssl

21
“关键文件只是一个包含您的私钥的文本文件。” 这是正确的,除非它不是这样。 - Casey
54
谢谢,我还要补充一点:如果你有根证书或中间证书,可以通过提供多个 -in 参数将其附加到命令中:openssl pkcs12 -export -out domain.name.pfx -inkey domain.name.key -in domain.name.crt -in intermediate.crt -in rootca.crt - gerrytan
17
对我来说做得不错。值得注意的是,在Windows机器上运行此操作需要在管理员命令提示符中运行openssl。 - Martin Costello
20
您从哪里获取密钥文件?我已经颁发了SSL证书,但是我没有看到任何密钥文件。我只收到了一个p7b文件和一堆*.crt文件。 - Knelis
44
为了让这个在openssl 1.0.2m上运行,我必须在提示输入密码之前指定“-certfile intermediate.crt -certfile rootca.crt”,来保护“.pfx”文件。我认为这可能是因为“.key”文件与其他“-in”文件不匹配,导致了我之前遇到的“没有证书与私钥匹配”的错误消息。 - dragon788
显示剩余21条评论

50
如果你需要Windows图形用户界面,请查看DigiCert。我刚刚使用过它,操作相当简单。 在SSL选项卡下,我首先导入了证书。然后选定证书后,我能够导出PFX文件,包括和不包括密钥文件。 https://www.digicert.com/util

19
当我这样做时,它告诉我我的计算机上没有导入私钥。这是事实。 - Niels Brinch
8
当我这样做时,它也告诉我我的计算机上没有导入私钥。虽然这是错误的,因为它与证书在同一个文件夹中... - aBertrand
1
为了解决这个问题,我不得不重新提交一个新的CSR,然后在处理完毕后再次下载证书,私钥被隐藏在您创建CSR的服务器/机器上。这解决了那个错误信息。 - Paddymac
我可以根据多年与DigiCert的经验向您推荐他们。 - mmell
1
不要忘记在“DigiCertUtil.exe”可执行文件的根目录中包括私钥。最简单的方法是将其复制到证书文件夹中。 - Jonas
警告:证书必须安装在计算机证书存储中(如果证书未安装在正确位置,Digicert可能会建议您“修复”证书)。 - rdhainaut

49

不需要安装 OpenSSL 的 Windows 解决方案

最近我也遇到了同样的问题——我只有一台没有安装 OpenSSL 的 Windows 笔记本电脑(而且没有足够的管理员权限来安装它)。结果发现 Windows 有一个内置的实用程序叫做 certutil,可以将 .crt 和 .key 文件合并成 .pfx。文档在这里

您需要创建一个新文件夹,将您的 .crt 和密钥文件放入其中。将两个文件重命名为相同的名称(但扩展名不同):

{{sitename}}.crt
{{siteName}}.key

如果您的密钥文件是普通的文本文件 - 只需将扩展名更改为 .key

之后在该文件夹中打开cmd并运行certutil -mergepfx [INPUTFILE] [OUTPUTFILE]

示例:

证书文件:mySite.crt

密钥文件:mySite.key

certutil命令:certutil -mergepfx mySite.crt mySite.pfx

注意:您将被要求为新创建的.pfx文件提供密码 - 不要忘记记住/存储它 - 因为在目标系统上导入证书时将需要它。


1
谢谢,这正是我在寻找的。.key文件需要与同一文件夹中的相同名称才能正常工作,这很棘手。 - slingshot
3
这太棒了。对于像我这样看不懂的人,如果你遇到 80 ERROR_FILE_EXISTS 错误,那是因为你输入了密钥文件名而不是 mysite.pfx ;) 仔细重新阅读上面的说明即可。 - Rory
非常感谢!直戳要点,救了我的一天! :-) - André Miranda

41

1
.cer文件的-spc参数 - BozoJoe
3
C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x64\pvk2pfx.exe - Stefan Steiger
这个Pvk2Pfx.exe工具可能无法在“正常”的PowerShell中运行,但如果您安装了VisualStudio,则可以从Developer PowerShell运行它:VisualStudio => Tools => Command Line => Developer PowerShell。 - TechAust10

34
You do NOT需要使用openssl或makecert或任何其他工具。您也不需要由CA提供的个人密钥。我几乎可以保证问题在于您期望能够使用CA提供的密钥和cer文件,但它们不基于“IIS方式”。
使用PFX为IIS配置SSL证书- SSL和IIS解释- http://rainabba.blogspot.com/2014/03/ssl-certs-for-iis-with-pfx-once-and-for.html 使用IIS的“服务器证书”UI来“生成证书请求”(本文不涉及此请求的详细信息,但这些细节非常关键)。这将为您提供一个为IIS准备的CSR。然后,您将该CSR提供给您的CA并请求证书。然后,您将获得他们给您的CER/CRT文件,回到IIS,在您生成请求的同一位置上“完成证书请求”。它可能会要求一个.CER文件,而您可能有一个.CRT文件。它们是相同的东西。只需更改扩展名或使用扩展名下拉菜单选择您的.CRT。现在提供一个适当的“友好名称”(*.yourdomain.example、yourdomain.example、foo.yourdomain.example等)。这很重要!这必须与您设置CSR和您的CA提供给您的内容相匹配。如果您要求通配符,则您的CA必须已经批准并生成了一个通配符,您必须使用相同的通配符。如果您的CSR是为foo.yourdomain.example生成的,则必须在此步骤中提供相同的内容。

6
问题的开头是:“我需要一个 .pfx 文件在 IIS 上安装网站的 https。” - rainabba
38
请在您的回答中加入与帖子相关的内容,这样即使您的博客消失,回答仍然是相关的。您仍然可以链接到您的博客。现在的回答中没有任何有用的信息。请注意不改变原来的意思,并将翻译语言通俗易懂。 - Deanna
21
如果您要请求新证书,这是最简单的方法,但如果您已经拥有证书和/或私钥(例如您之前与Apache使用的证书),则此方法将无法正常工作,因为IIS的证书签名请求将生成新的私钥。我认为这是IIS的一个非常烦人的方面,因为“完成请求”所做的一切只是将私钥与公共证书组合在一起生成pfx文件,为什么它不能简单地接受它们作为单独的PEM格式文件,谁知道呢? - Chris Chilvers
2
虽然我欣赏你的解决方案很可能是“正确的做法”,但我认为与 OpenSSL 玩耍更容易——一个工具,一个命令行调用,一个密码,完成。此外,我不知道所有 SSL 公司是否支持这种方法。 - Jan Bühler
11
很抱歉,如果证书是在其他地方生成的,你的回答就没有帮助了。好的,IIS希望自己生成并保存私钥——有时这不可行。 - staticsan
显示剩余5条评论

19

我从.key和.pem文件创建了.pfx文件。

操作方式如下:openssl pkcs12 -inkey rootCA.key -in rootCA.pem -export -out rootCA.pfx


5
这基本上是我使用的相同命令,但是当我在使用Git bash时需要在openssl之前添加winpty(例如,winpty openssl pkcs12...),这是Windows上openssl的常见解决方案。 - smoore4
我不需要使用“-export”开关。 - mmell

12

https://msdn.microsoft.com/zh-cn/library/ff699202.aspx

(( 文章中的相关引用如下 ))

接下来,您需要创建 .pfx 文件,以用于对您的部署进行签名。打开一个命令提示符窗口,然后键入以下命令:

PVK2PFX –pvk yourprivatekeyfile.pvk –spc yourcertfile.cer –pfx yourpfxfile.pfx –po yourpfxpassword

其中:

  • pvk - yourprivatekeyfile.pvk 是你在步骤4中创建的私钥文件。
  • spc - yourcertfile.cer 是你在步骤4中创建的证书文件。
  • pfx - yourpfxfile.pfx 是将要创建的 .pfx 文件的名称。
  • po - yourpfxpassword 是你想要为 .pfx 文件分配的密码。当你第一次将 .pfx 文件添加到 Visual Studio 项目中时,会提示你输入该密码。

(可选(不适用于原作者,但适用于未来读者),你可以从头开始创建 .cer 和 .pvk 文件)(在上述步骤之前完成此操作)。注意 mm/dd/yyyy 是开始和结束日期的占位符。有关完整文档,请参阅 MSDN 文章。

makecert -sv yourprivatekeyfile.pvk -n "CN=My Certificate Name" yourcertfile.cer -b mm/dd/yyyy -e mm/dd/yyyy -r

12

从以下链接中了解更多信息:

如果需要,可以使用OpenSSL命令生成filessl.key(SSL证书密钥文件)filessl.crt(SSL证书文件)

openssl genrsa 2048 > filessl.key
chmod 400 filessl.key
openssl req -new -x509 -nodes -sha256 -days 365 -key filessl.key -out filessl.crt

在这里,您必须回答交互表单(您可以从此其他帖子中找到类似req.cnf的参考信息:https://dev59.com/d2Ei5IYBdhLWcg3wUa46#49784278

然后,继续执行以下最后一个命令,它将要求您输入导出密码

openssl pkcs12 -export -out filessl.pfx -inkey filessl.key -in filessl.crt

准备好了,它已经为你生成了SSL证书文件,格式为.PFX(或.P12): filessl.pfx.


迄今为止最有用的东西 - Simon Giesen

8

3
可能值得一提的是,您需要首先“安装”证书,然后返回SSL选项卡并“导出”它以获取实际的pfx文件。 - access_granted

8

你需要使用makecert工具。

以管理员身份打开命令提示符并输入以下内容:

makecert -sky exchange -r -n "CN=<CertificateName>" -pe -a sha1 -len 2048 -ss My "<CertificateName>.cer"

在这里,<CertifcateName>代表您要创建的证书名称。

然后,您可以通过在“开始”菜单中键入certmgr.msc,单击“个人”>“证书”,然后您的证书应该可用来打开管理控制台的证书管理器快照。

这是一篇文章。

https://azure.microsoft.com/documentation/articles/cloud-services-certs-create/


3
我不能。在导出向导中,“pfx”选项是灰色的。 - jlp
我的证书可以在证书管理器中找到。但是我无法将其导出为pfx格式。您的命令行指令是做什么用的? - jlp
尝试按照建议创建证书,如果可以的话,请告诉我。这可能需要5分钟时间。链接的文章提供了完整的解释。 - BentOnCoding
1
这不是我要找的。我不想自己制作证书。我从证书机构购买了两个文件的证书。我宁愿使用OpenSSL工具。 - jlp

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