使用带有示例的openssl生成CSR的简单步骤

时间:2020-02-23 14:40:11  来源:igfitidea点击:

如何在Linux中使用openssl生成证书签名请求。
是否可以用openssl生成CSR?
我们可以自动执行创建证书签名请求的步骤,而不是交互式提示吗?
我们是否需要ssl.conf才能使用openssl生成CSR?

配置SSL涉及的步骤

我们可以创建自己的CA证书,也可以向第三方CA发送请求以供应用程序使用证书。
证书最常见的用途之一是在Web服务器上安装SSL证书,以对客户端和服务器之间的通信进行加密。

在上配置SSL或者将证书应用于任何应用程序时,有四个主要步骤:

创建证书签名请求(CSR)

  • 第一步是创建证书请求,也称为证书签名请求(CSR)。

  • 通常,我们导航到CA的以填写Web表单以创建请求或者从实际应用程序创建请求。

  • 例如,Microsoft的IIS和Exchange Server具有创建证书请求的向导。
    发出请求后,该请求将存储在文本文件中。

  • 我们将使用openssl生成CSR,该CSR也可以提交给第三方CA或者由我们自己的CA证书使用

提交请求

  • 获得CSR后,就可以将请求(CSR的内容)提交给CA了。

  • 对于第三方CA,我们可以通过导航到CA来实现。

  • 如果我们使用自己的CA,则可以使用openssl来完成

下载证书

  • 通过提交第三方CA的请求后,我们需要将生成的证书下载到计算机上。

  • 通常,在"提交请求"阶段的末尾会提供一个链接,以下载证书。

  • 在执行结束时使用openssl,我们将根据提供的路径获得证书。

安装证书

  • 获得证书后,可以将其安装在应用程序中。

第三方CA列表

以下是一些证书颁发机构:

  • CertiSign(巴西,VeriSign的一部分)

  • Entrust

  • IKS GmbH(德国)

  • Thawte(VeriSign的一部分)

  • VeriSign

所有这些都接受由mod_ssl软件包生成的证书签名请求,以与Apache与mod_ssl一起使用。

什么是证书签名请求(CSR)?

  • 制作服务器密钥文件和证书时,还会发出证书签名请求。

  • 证书颁发机构将使用CSR创建SSL证书,但不需要私钥。

  • 此请求所需的信息必须与证书颁发机构要求的名称,注册域名和其他详细信息完全匹配,以便他们处理请求。

  • 名称必须与服务器的FQDN匹配,否则证书将引发名称不匹配错误或者TLS握手失败

  • CSR还包括许多其他与我们要为其申请证书的组织有关的详细信息

  • 该文件将自动以特殊格式编码。

准备工作

希望我们对openssl和使用证书的不同术语有所了解。

由于我使用的是Linux环境,因此我将使用openssl为本教程生成私钥和CSR。
默认情况下,openssl已安装在更多Linux发行版中。
我们可以使用验证相同

# rpm -q openssl
openssl-1.1.1c-2.el8.x86_64

如果尚未安装,则可以根据发行版安装openssl软件包。
我正在使用RHEL/CentOS,因此将使用yum安装opensll。
对于Ubuntu,Debian,我们可以使用apt-get

# yum -y install openssl

重要的提示:

确保保留将随CSR生成的私钥。
CSR仅可与此私钥一起使用。

生成CSR(交互式)

在此示例中,我将显示交互式方法,这意味着将提示我们填写CSR所需的数据。

要生成证书签名请求,我们将需要一个私钥。
理想情况下,我将使用两个不同的命令分别生成每个命令,但是其中将介绍单个命令来生成私钥和CSR

# openssl req -new -newkey rsa:2048 -nodes  -keyout ban27.key -out ban27.csr

在此示例中,我们使用RSA算法和2048位大小创建一个私钥(ban27.key)。
接下来,我们将使用此ban27.key生成我们的CSR(ban27.csr)

提示:

此处私钥未加密,如果我们希望拥有加密的私钥,则可以从此命令中删除-nodes,该命令将提示我们为私钥添加密码短语

我的终端在此命令中的摘要输出

生成CSR(交互式)

其中

  • -newkey:这个选项创建一个新的证书请求和一个新的私钥。

  • rsa:2048:生成2048位大小的RSA密钥

  • -nodes:私钥将被创建而不进行任何加密

  • -keyout:这给出了将新创建的私钥写入的文件名

  • -out:默认指定要写入的输出文件名或者标准输出。

这样就创建了我们的密钥和CSR:

# ls -l ban27.*
-rw-r--r-- 1 root root 1078 Aug 10 08:21 ban27.csr
-rw------- 1 root root 1704 Aug 10 08:20 ban27.key

生成CSR(非交互式)

在此示例中,我将共享非交互式方法来生成CSR,这意味着不会提示我们输入任何内容。

创建具有生成CSR所需内容的配置文件。
我创建了一个示例文件,我们可以将其用作模板。

# cat server_cert.cnf
[req]
distinguished_name = req_distinguished_name
prompt = no
[req_distinguished_name]
C = IN
ST = Karnataka
L = Bengaluru
O = theitroad
OU = R&D
CN = ban27.example.com

接下来,我们将使用与之前相同的命令,并添加-config server_cert.cnf以确保不提示我们输入任何内容。

# openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out ban27.csr -config server_cert.cnf

如预期的那样,该命令未提示任何输入。
我们可以将其用于自动化目的。
以下是我的终端的摘录

生成CSR(非交互式)

验证证书签名请求

现在,由于有了CSR,我们将验证证书的内容。

# openssl req -noout -text -in ban27.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = IN, ST = Karnataka, L = Bengaluru, O = theitroad, OU = R&D, CN = ban27.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:b9:de:b9:d5:6a:36:77:1e:72:76:28:09:5e:d5:
                    61:17:60:fc:ed:4d:b2:22:61:5d:24:16:88:6d:89:
                    b5:ae:45:74:1f:39:f0:4f:bc:1c:07:f2:82:d6:4b:
                    10:29:05:15:e2:78:26:2c:82:e1:5e:c7:54:8f:94:
                    eb:d0:79:80:43:d0:d8:9e:04:88:d6:d3:4c:c0:25:
                    61:f8:67:98:fb:17:cd:35:e5:d9:1f:d0:6f:83:2f:
                    a2:82:9f:1d:aa:77:4f:7f:e8:50:ea:80:96:7d:31:
                    a9:c3:16:6a:30:7e:8f:52:5a:8c:b6:62:97:d6:84:
                    17:19:f4:1c:95:39:94:c0:81:86:25:9b:85:50:65:
                    c6:39
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         51:81:12:53:22:8e:92:3c:c0:7c:b6:dc:cc:ff:63:35:6a:24:
         2d:3e:f2:1f:d0:df:bf:c8:73:02:ea:19:d5:ff:2d:b5:78:3d:
         b4:a7:43:3c:96:92:25:62:83:b1:9e:8c:81:33:92:0c:1f:83:
         6e:50:bd:cd:69:2c:32:a9:9f:12:43:f8:de:6f:28:d1:4c:3d:
         2e:b7:ac:f4:50:15:22:e2:5c:21:22:c9:e9:bc:e5:d2:f9:49:
         10:c5:87:58:60:a1:da:64:aa:55:b6:06:2f:29:31:4e:b6:a7:
         b6:11:dd:31:ed:7c:32:dd:f3:2f:2f:0a:e3:37:b0:f4:b1:86: