将.pem转换为.crt和.key


Answers:


500

我能够使用以下方法将pem转换为crt:

openssl x509 -outform der -in your-cert.pem -out your-cert.crt

13
使用文本编辑器不是最佳方法。提取PKCS8格式的密钥:openssl pkey -in mumble.pem -out mumble-key.pem 如果OpenSSL版本低于1.0.0,则将密钥提取为RSA密钥:openssl rsa -in mumble.pem -out mumble-key.pem
Andron 2014年

131
我尝试了您的命令,但遇到了:unable to load certificate 140584440387400:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
Damien Carol

15
密钥命令(openssl pkey -in mumble.pem -out mumble-key.pem)给出以下信息:无法加载密钥129051320116880:error:0906D06C:PEM例程:PEM_read_bio:no开始行:pem_lib.c:703:预期:任意PRIVATE KEY
MYLORD

2
openssl rsa -your-cert.pem -forme pem -out your-key.pem
troyfolger

3
@Andron pkey和rsa都给我Expecting: ANY PRIVATE KEY错误。
王王航空

393

使用OpenSSL进行转换

这些命令使您可以将证书和密钥转换为不同的格式,以使其与特定类型的服务器或软件兼容。

  • 将DER文件(.crt .cer .der)转换为PEM

    openssl x509 -inform der -in certificate.cer -out certificate.pem
    
  • 将PEM文件转换为DER

    openssl x509 -outform der -in certificate.pem -out certificate.der
    
  • 将包含私钥和证书的PKCS#12文件(.pfx .p12)转换为PEM

    openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes
    
    You can add -nocerts to only output the private key or add -nokeys to only output the certificates.
    
  • 将PEM证书文件和私钥转换为PKCS#12(.pfx .p12)

    openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
    
  • 将PEM转换为CRT(.CRT文件)

    openssl x509 -outform der -in certificate.pem -out certificate.crt
    

OpenSSL转换PEM

  • 将PEM转换为DER

    openssl x509 -outform der -in certificate.pem -out certificate.der
    
  • 转换PEM到P7B

    openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer
    
  • 将PEM转换为PFX

    openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
    

OpenSSL转换DER

  • 将DER转换为PEM

    openssl x509 -inform der -in certificate.cer -out certificate.pem
    

OpenSSL转换P7B

  • 将P7B转换为PEM

    openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
    
  • 将P7B转换为PFX

    openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
    
    openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer
    

OpenSSL转换PFX

  • 将PFX转换为PEM

    openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes
    

通过OpenSSL生成rsa密钥

  • 首先需要在命令行上使用OpenSSL生成公用密钥和专用密钥,您应该使用-passout参数对该文件进行密码保护,该参数可以采用多种形式,因此请查阅OpenSSL文档。

    openssl genrsa -out private.pem 1024
    
  • 这将创建一个使用1024位的名为private.pem的密钥文件。该文件实际上同时具有私钥和公钥,因此您应该从该文件中提取公钥:

    openssl rsa -in private.pem -out public.pem -outform PEM -pubout
    
    or
    
    openssl rsa -in private.pem -pubout > public.pem
    
    or
    
    openssl rsa -in private.pem -pubout -out public.pem
    

    现在,您将拥有仅包含公用密钥的public.pem,您可以与第三方自由共享此密钥。您可以通过使用公共密钥自己加密某些东西,然后使用私有密钥解密,来进行全部测试,首先我们需要一点数据来加密:

  • 示例文件:

    echo 'too many secrets' > file.txt
    
  • 现在,您在file.txt中有一些数据,让我们使用OpenSSL和公共密钥对其进行加密:

    openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl
    
  • 这会创建一个名为file.ssl的file.txt加密版本,如果您查看此文件,它只是二进制垃圾,对任何人都没有什么用。现在,您可以使用私钥对其解密:

    openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt
    
  • 现在,decrypted.txt中将有一个未加密的文件:

    cat decrypted.txt
    |output -> too many secrets
    

OpenSSL中的RSA TOOLS选项

  • 名称

    rsa-RSA密钥处理工具

  • 概要

    openssl rsa [-help] [-通知PEM | NET | DER] [-form PEM | NET | DER] [-输入文件名] [-passin arg] [-输出文件名] [-passout arg] [-aes128] [- aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-RSAPublicKey_in] [-RSAPublicKey_out] [-引擎ID]

  • 描述

    rsa命令处理RSA密钥。它们可以在各种形式之间转换,并且可以打印出它们的组件。请注意,此命令使用传统的SSLeay兼容格式进行私钥加密:较新的应用程序应使用pkcs8实用程序使用更安全的PKCS#8格式。

  • 命令选项

    -help
    

    打印出使用情况消息。

    -inform DER|NET|PEM
    

    这指定输入格式。DER选项使用与PKCS#1 RSAPrivateKey或SubjectPublicKeyInfo格式兼容的ASN1 DER编码形式。PEM格式是默认格式:它由DER格式base64编码,并带有附加的页眉和页脚行。输入PKCS#8格式的私钥也被接受。NET表单是一种在NOTES部分中描述的格式。

    -outform DER|NET|PEM
    

    这指定了输出格式,这些选项与-inform选项具有相同的含义。

    -in filename
    

    如果未指定此选项,则它指定从中读取键的输入文件名或标准输入。如果密钥已加密,将提示您输入密码。

    -passin arg
    

    输入文件密码源。有关arg格式的更多信息,请参见openssl中的PASS PHRASE ARGUMENTS部分。

    -out filename
    

    如果未指定此选项,则它指定要向其中写入密钥的输出文件名或标准输出。如果设置了任何加密选项,则将提示您输入密码。输出文件名不应与输入文件名相同。

    -passout password
    

    输出文件密码源。有关arg格式的更多信息,请参见openssl中的PASS PHRASE ARGUMENTS部分。

    -aes128|-aes192|-aes256|-camellia128|-camellia192|-camellia256|-des|-des3|-idea
    

    这些选项在输出私钥之前使用指定的密码对其进行加密。提示输入密码。如果未指定这些选项,则密钥以纯文本形式编写。这意味着使用rsa实用程序读取没有加密选项的加密密钥可用于从密钥中删除密码短语,或者通过设置加密选项可将其用于添加或更改密码短语。这些选项只能与PEM格式输出文件一起使用。

    -text
    

    除了编码版本外,还以纯文本形式打印各种公共或私有密钥组件。

    -noout
    

    此选项可防止输出密钥的编码版本。

    -modulus
    

    此选项打印出密钥的模数值。

    -check
    

    此选项检查RSA私钥的一致性。

    -pubin
    

    默认情况下,从输入文件中读取一个私钥:使用此选项时,将读取一个公钥。

    -pubout
    

    默认情况下,将输出私钥:使用此选项时,将输出公钥。如果输入是公钥,则自动设置此选项。

    -RSAPublicKey_in, -RSAPublicKey_out
    

    类似于-pubin和-pubout,但是使用RSAPublicKey格式代替。

    -engine id
    

    指定引擎(通过其唯一的ID字符串)将导致rsa尝试获取对指定引擎的功能引用,从而在需要时对其进行初始化。然后,引擎将被设置为所有可用算法的默认引擎。

  • 笔记

    PEM私钥格式使用页眉和页脚行:

    -----BEGIN RSA PRIVATE KEY-----
    
    -----END RSA PRIVATE KEY-----
    

    PEM公钥格式使用页眉和页脚行:

    -----BEGIN PUBLIC KEY-----
    
    -----END PUBLIC KEY-----
    

    PEM RSAPublicKey格式使用页眉和页脚行:

    -----BEGIN RSA PUBLIC KEY-----
    
    -----END RSA PUBLIC KEY-----
    

    NET表单是与较早的Netscape服务器和Microsoft IIS .key文件兼容的格式,该格式使用无盐RC4进行加密。它不是很安全,因此仅在必要时使用。

    某些较新版本的IIS在导出的.key文件中具有其他数据。要将其与该实用程序一起使用,请使用二进制编辑器查看文件并查找字符串“ private-key”,然后追溯到字节序列0x30、0x82(这是ASN1 SEQUENCE)。从此以后将所有数据复制到另一个文件,并通过-inform NET选项将其用作rsa实用程序的输入。

    例子

    要删除RSA私钥上的密码,请执行以下操作:

     openssl rsa -in key.pem -out keyout.pem
    

    要使用三重DES加密私钥:

     openssl rsa -in key.pem -des3 -out keyout.pem
    

    要将私钥从PEM转换为DER格式:

      openssl rsa -in key.pem -outform DER -out keyout.der
    

    要将私钥的组件输出到标准输出,请执行以下操作:

      openssl rsa -in key.pem -text -noout
    

    要仅输出私钥的公共部分:

      openssl rsa -in key.pem -pubout -out pubkey.pem
    

    以RSAPublicKey格式输出私钥的公共部分:

      openssl rsa -in key.pem -RSAPublicKey_out -out pubkey.pem
    

32
但这仍然不能回答以下问题:如何从(导出的)二进制证书中获取私钥
bbaassssiiee

谢谢,想知道我是否有包含私钥和证书的PEM,如何仅获取证书?我知道我可以使用文本编辑器从其中复制证书部分,但我想知道是否有任何openssl命令,谢谢
workplaylifecycle

46

要从pem文件中提取密钥和证书:

提取密钥

openssl pkey -in foo.pem -out foo.key

提取密钥的另一种方法...

openssl rsa -in foo.pem -out foo.key

提取所有证书,包括CA链

openssl crl2pkcs7 -nocrl -certfile foo.pem | openssl pkcs7 -print_certs -out foo.cert

将文本第一证书提取为DER

openssl x509 -in foo.pem -outform DER -out first-cert.der

7
openssl x509 -outform der -in C:\ Users \ Greg \ .ssh \ e360_stork_listener.pem -out C:\ Users \ Greg \ .ssh \ e360_stork_listener.crt无法加载证书4294956672:错误:0906D06C:PEM例程:PEM_read_bio:没有开始行:pem_lib.c:708:预期:
受信任的

5

0.先决条件openssl 应安装。在Windows上,如果Git Bash已安装,请尝试!备用二进制文件可以在这里找到。

1.提取.key来自.pem

openssl pkey -in cert.pem -out cert.key

2.提取.crt来自.pem

openssl crl2pkcs7 -nocrl -certfile cert.pem | openssl pkcs7 -print_certs -out cert.crt

1

.crt以pem格式存储证书。因此,.pem虽然还可以存储其他内容,例如csr(证书签名请求),私钥,公钥或其他证书,但它仅存储证书时,它与.crt是同一回事。

pem是基数为64的编码文件,每个部分之间都有一个页眉和页脚。

要提取特定部分,如下所示的perl脚本是完全有效的,但是可以随意使用一些openssl命令。

 perl -ne "\$n++ if /BEGIN/; print if \$n == 1 && /BEGIN/.../END/;" mydomain.pem

== 1可以更改为您需要的任何部分。显然,如果您确切知道所需的页眉和页脚,并且文件中只有其中的一个(通常在其中仅保留证书和密钥的情况下),则可以简化它:

 perl -ne "print if /^-----BEGIN CERTIFICATE-----\$/.../END/;" mydomain.pem

0

如果您是因为使用而问这个问题,mkcert那么诀窍是该.pem文件是cert,-key.pem文件是密钥。

(您无需进行转换,只需运行mkcert yourdomain.dev otherdomain.dev

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.