谁能告诉我从文件中提取/转换证书.crt
和私钥.key
文件的正确方法/命令.pem
?我刚刚读到它们是可互换的,但不是如何互换的。
7 回答
我能够使用以下方法将 pem 转换为 crt:
openssl x509 -outform der -in your-cert.pem -out your-cert.crt
使用 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
这将创建一个名为 private.pem 的密钥文件,该文件使用 1024 位。这个文件实际上有私钥和公钥,所以你应该从这个文件中提取公钥:
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,您可以与第 3 方自由共享它。您可以通过使用您的公钥自己加密某些内容然后使用您的私钥解密来测试这一切,首先我们需要一些数据来加密:
示例文件:
echo 'too many secrets' > file.txt
您现在在 file.txt 中有一些数据,让我们使用 OpenSSL 和公钥对其进行加密:
openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl
这将创建一个 file.txt 的加密版本,称为 file.ssl,如果您查看此文件,它只是二进制垃圾,对任何人都没有什么用处。现在您可以使用私钥对其进行解密:
openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt
您现在将在decrypted.txt 中有一个未加密的文件:
cat decrypted.txt |output -> too many secrets
OpenSSL 中的 RSA 工具选项
姓名
rsa - RSA 密钥处理工具
概要
openssl rsa [-help] [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-aes128] [- aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-RSAPublicKey_in] [-RSAPublicKey_out] [-engine id]
描述
rsa 命令处理 RSA 密钥。它们可以在各种形式之间转换,并且可以打印出它们的组件。请注意,此命令使用传统的 SSLeay 兼容格式进行私钥加密:较新的应用程序应使用更安全的 PKCS#8 格式,使用 pkcs8 实用程序。
命令选项
-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
要从 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
先决条件
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
这就是我在windows上所做的。
- 从Google下载包含打开的 ssl exe 的 zip 文件
- 解压缩 zip 文件并进入 bin 文件夹。
- 转到 bin 文件夹中的地址栏,然后键入 cmd。这将在此文件夹中打开命令提示符。
- 将 .pem 文件移动/放入此 bin 文件夹中。
- 运行两个命令。一个创建证书,第二个创建密钥文件
openssl x509 -outform der -in yourPemFilename.pem -out certfileOutName.crt
openssl rsa -in yourPemFilename.pem -out keyfileOutName.key
如果你问这个问题是因为你正在使用,mkcert
那么诀窍是.pem
文件是证书,-key.pem
文件是密钥。
(您不需要转换,只需运行mkcert yourdomain.dev otherdomain.dev
)
.crt 以 pem 格式存储证书。所以 .pem 虽然它也可以有其他东西,比如 csr(证书签名请求)、私钥、公钥或其他证书,但当它只存储一个证书时,它与 .crt 是一样的。
pem 是一个 base 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