openssl genrsa -out private.pem 给了我一个只包含私钥的 PEM 文件
并不真地。原则上 RSA 可以只存储一个没有公钥的私钥,但是 OpenSSL 使用的 RSAPrivateKey 格式(来自 PKCS1 aka RFCs 2313 2437 3447 8017)存储两者。用于其他非对称算法(DSA、DH、ECC)的格式也具有此属性,这意味着您始终可以只存储私钥文件,并在需要时仍然获取公钥。GPG 做同样的事情。公钥信息总是包含在“秘密”密钥中,因为他们称之为历史原因。OpenSSH(大部分)使用 OpenSSL 格式,所以它不是一个有用的观察。
openssl rsa -in private.pem -outform PEM -pubout -out public.pem 给了我一个 PEM 文件,其中包含一个公钥
其中仅包含公钥。并且几乎没用,因为(1)它可以从私钥文件中重新生成,并且(2)大多数应用程序不仅仅使用公钥,而是使用证书。
所以,在执行这两个命令后,我有了我的 RS-256 密钥对(它的名称正确吗?据我所知,密钥是 2048 位,那么为什么是 RS-256,而不是 RS-2048?)。
从技术上讲,它是一个密钥对,但如上所述,OpenSSL 基本上将密钥对的概念与私钥相结合,并且只区分公钥——这是需要区分的,因为它是公共的。
是的,加密密钥几乎总是以比特为单位。在 JSON Web Signature (JWS) 和 JSON Web Token (JWT) 中使用方案名称 RS256(无连字符)表示 RSA 签名(特别是由 PKCS1 定义的 RSA 签名方案 RSASSA-PKCS1-v1_5),其中 SHA-256 用于哈希. 这与 RSA 密钥的大小无关,可以与任何(实现的)大小一起使用;RFC7517 中 RS256 的示例密钥是 1024 位——尽管今天的 RSA-1024 不能提供足够的安全边际,而且它已被 NIST 和 CABforum 等权威机构(以及大多数 Web 浏览器)禁止了好几年。RSA 签名(以及 RSA 加密)用于 JWS/JWT 以外的许多应用程序中。
我可以考虑我拥有的 2 个文件(private.PEM + public.PEM)已经是证书吗?
首先澄清一下:“证书”是在许多情况下使用的一般概念。对于加密,感兴趣的证书通常是公钥证书,它将公钥绑定到具有一些相关属性的身份(或有时是角色),到目前为止最常见的是由X.x定义的公钥证书。 509是由当时的 CCITT(现为 ITU-T)于 1988 年创建的标准,此后被许多标准组织增强并变得更有用,但并没有根本的不同。证书的 Internet 标准基于 X.509,称为使用 X.509 的公钥基础结构,缩写为 PKIX。X.509 与其他一些计算机标准一样,使用称为抽象语法表示法 1 的通用语法表示其数据,缩写为ASN.1。
话虽如此,不。公钥/X.509 证书包含公钥,但它不仅仅是公钥。它包含大量对其使用方式至关重要的其他信息,尽管公钥可以说是最重要的单条信息。证书是为公钥创建的,通常由称为证书颁发机构的实体打包为证书签名请求,即 CSR 或只是请求或 CA 使用 CA 的密钥对证书进行数字签名,这样其他人就无法更改它,因此任何使用它的程序都可以信任它。原则上,任何人都可以充当 CA,特别是 OpenSSL 命令行程序可以执行 CA 所做的技术操作,例如颁发证书。但是,在大多数情况下,证书的价值和有用性取决于颁发 CA 的可信度和广泛程度,因此最成功的 CA 是那些已将自己确立为可信的 CA,例如 Digicert-now-including-Symantec-以前-Verisign、Comodo、GoDaddy 等。
作为一种特殊情况,可以拥有一个“自签名”证书,该证书使用自己的密钥而不是 CA 的密钥进行签名。此证书无法像来自真实 CA 的证书那样传达信任,因为它没有有效地防止替换,但即使您无法联系和/或支付 CA,它也可以创建,并且通常可以处理,使用由设计为正常使用或需要证书的程序手动批准或覆盖。
CER、CRT 或 P12 文件的内容是什么?我找不到这些文件的任何真实示例。
CER 和 CRT(两者)通常用作包含 X.509 证书的文件的扩展名,并且可能在任何一种情况下都取决于文件系统。文件内容常用的编码有两种:“DER”,是ASN.1定义的二进制编码(Distinguished Encoding Rules);和“PEM”,它将二进制 DER 转换为 base64,分成大小合适的行,并添加了标题和尾行,这对人们来说更方便,尤其是对于像剪切和粘贴这样的事情。PEM 之所以如此命名,是因为这种编码最初是为隐私增强 (e)Mail 定义的,该方案已被其他电子邮件和消息技术取代,但这种格式仍在使用中。这些编码看起来非常不同,但它们包含完全相同的信息(除非损坏),并且许多处理证书的程序可以读取两者。OpenSSL 编写的 PEM 文件通常在标题之前或尾部之后包含“注释”信息;程序应该忽略这一点,但有时它们会感到困惑,您需要删除无关信息。在 Windows 上,也要小心不要使用 'UTF-8'字节顺序标记在显示屏上不可见,但会干扰读取文件的程序。
尽管 PEM 被广泛用于证书并且许多 PEM 文件都是证书,但请注意 PEM 也用于许多其他用途。不要假设 PEM 文件是证书;而是检查标题行,在这种情况下方便地说-----BEGIN CERTIFICATE-----
或有时-----BEGIN X509 CERTIFICATE-----
. 有关这方面的更多详细信息,请参阅rfc7468 。
P12 通常用于识别PKCS12 又名 PFX格式的文件,这是完全不同的。尽管 PKCS12 标准支持大量选项,但它通常用于包含私钥加上相应的证书,以及在大多数情况下,形成信任链所需的一个或多个“链”或“中间”证书验证最终实体证书。实际上,PKCS12 文件始终是二进制文件,尽管没有技术原因它们不能被 PEM 编码或以其他方式变得更人性化。
如何从我拥有的 2 个 PEM 文件中生成 CER、CRT 或 P12?
要获得证书,您需要使用 CA(已建立的 CA 或您创建的 DIY 证书)或创建自签名证书。根据您使用的软件(和 CA,如果有的话),这些可能有数百种变体,但对于 OpenSSL 和大多数CA,通常的过程是:
- 使用创建 CSR
openssl req -new -key privatekey [... other options] >csr
有关详细信息,请参见手册页req
。如果您想将证书用于 SSL/TLS 包括 HTTPS,请将“通用名称”设置为(或一个)用于访问服务器的名称,通常是其完全限定域名 (FQDN)。如果要将证书用于其他应用程序,则必要的身份信息取决于应用程序。
- 对于真正的 CA,将 CSR 连同他们需要的身份证明或其他授权以及可能的付款一起提交给 CA(通常在网络表单上,PEM 很方便)。
作为回报,您应该收到一个新颁发的“最终实体”证书(包含您的公钥和身份),并且通常是一个或两个证书,其中包含用于创建信任链的中间 CA 的公钥和身份. 这些可能是单独的文件(DER 或 PEM)或串联(仅 PEM)或PKCS7标准的特定情况(没有数据或仅签名证书的签名数据),通常称为 P7B 或 P7C。
2'。或者,自己做这件事。创建 CA 密钥和证书(仅一次),然后使用openssl ca ...
或openssl x509 -req -CA -CAkey ...
读取 CSR 并在您自己的 CA 下颁发证书。
此证书仅适用于您自己控制的系统和程序,或隐式信任您并在技术上能够安装您的 CA 证书的人,这通常是一个小组,有时是一个空的。还要注意不要为您的 CA 证书和最终实体证书提供相同的名称,例如接受 ; 中的默认值req
。如果你这样做,生成的证书将无法在任何地方使用。
- 根据需要使用证书以及私钥和链证书。这可能涉及将它们组合成一个 PKCS12,使用
openssl pkcs12 -export
.
如上所述,您可以创建自签名证书而不是 CA 颁发的证书。将步骤 1 和 2/2' 替换为单个步骤:openssl req -new -x509 -key privatekey ... >cert
请注意-x509
标志的添加,并且手册页上描述了许多其他选项。这具有 DIY CA 的所有属性和限制,以及更多:您(和/或您的朋友)不能只安装一次 DIY CA 证书,而是必须单独安装每个最终实体证书并随时重复该过程您的证书必须更换,因为它已过期或任何相关信息已更改。
我看到一些信息表明 P12 文件可以用密码保护 - 用密码保护这个文件的原因是什么 - 密码必须再次存储在某个地方,我们已经将 P12 文件存储在一个安全的地方,没有人可以访问对吧?
不一定要存储密码;程序可以在必要时提示它(openssl
特别是程序会这样做)。虽然现在经常用于存储,但 PKCS12/PFX 最初用于将带有证书的私钥从一个系统传输到另一个系统,这个过程通常不安全。即使对于存储,您认为安全的系统和地方有时也会变得不安全,加密私钥的深度防御是值得的。但在某些情况下,是的,密码只是一点点额外的工作,并没有真正的好处。
我看到了一些示例,其中 1 个 PEM 文件同时包含公钥和私钥。PEM没有确定的结构吗?我可以放任何我想要的钥匙吗?
是否可以从单个 PEM 文件中读取多个对象并因此有效地将其存储在一个 PEM 文件中取决于执行读取的程序。在大多数(但不是全部)情况下,OpenSSL 可以处理此问题,因此将此类文件与 OpenSSL(以及调用 OpenSSL 库的程序)一起使用是比较常见的;其他程序和库可能会有所不同。如上所述,这样存储公钥几乎没有用处。存储例如 privatekey 和certificate或链中的所有证书可能很有用。Apache httpd 和 nginx 等程序支持这一点(但不需要它)。
我还看到了 PEM 文件,其中包含“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”。那个证书是什么?
有关一般证书,请参见上文。如果您想知道特定证书的详细信息(密钥所有者的名称,称为“主题”;公钥;证书有效的时间段;颁发 CA 及其序列号等),您可以使用openssl x509 -text <file
或者根据您的系统,通常其他几个程序能够显示证书详细信息。在 Windows 上,.cer .crt
您只需双击一个文件(或在“运行”对话框或start
CMD 中的命令中命名它),就会弹出一个包含详细信息选项卡的对话框。