openssl之SSL签名相关介绍

1、CSR是什么?

CSR是英文Certificate Signing Request的缩写,即证书签名请求。CSR文件是申请SSL证书时所需要的一个数据文件,下面将为你详细介绍CSR文件的具体内容。

数字证书的核心,其实就是非对称加密,也就是公私钥对加密。非对称加密之所以安全,前提条件是用户必须要保障私钥的安全。因此在用户向CA申请数字证书时,用户首先需要在自己的电脑中先产生一个公私钥对。用户需要保管好自己的私钥,然后再把公钥和你的个人信息发送给CA机构,CA机构通过你的公钥和个人信息最终签发出数字证书。

而CSR文件,其实就是包含了用户公钥和个人信息的一个数据文件。用户产生出这个CSR文件,再把这个CSR文件发送给CA,CA就会根据CSR中的内容来签发出数字证书。

1.1)如何生成CSR文件?

要产生CSR文件目前有很多种方法,比较常用的有OpenSSL工具、Keystore Explore等等,在网上搜索就能很容易地找到。而目前更多人常用的一般是在线产生CSR。一般的CA机构都会提供在线生成CSR的功能,如:https://myssl.com/csr_create.html。

通过网页,提交了网站信息后,系统生成了公钥和私钥,以及CSR文件,这里只暴露了私钥和CSR文件。

1.2)CSR文件是什么样子?

CSR是一个base64格式的一串字符串,并且以-----BEGIN CERTIFICATE REQUEST-----开头,并以-----END CERTIFICATE REQUEST-----为结尾。如下图

2、openssl介绍、使用

OpenSSL 是一个多功能的命令行工具,可以用于与 公钥基础设施(Public Key Infrastructure)(PKI)和 HTTPS(HTTP over TLS)相关。这包括生成私钥、 证书签署请求(certificate signing request)(CSR)和证书格式转换的 OpenSSL 示例。

2.1)关于证书签署请求(CSR)

从 证书颁发机构(certificate authority)(CA)那里获得 SSL 证书,你必须生成一个 证书签署请求(certificate signing request)(CSR)。一个 CSR 主要是由一个密钥对的公钥和一些附加信息组成。当证书被签署时,这两部分都会被插入到证书中。

下面是一个 CSR 信息提示的例子:

如果想非交互式地回答 CSR 信息提示,可以通过 -subj 选项来实现。例如:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

2.2)openssl生成公钥和私钥

1)无加密产生私钥

openssl genrsa -out rsa_private_key.pem 1024

2)无加密产生公钥

$openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

说明:根据私钥生成公钥

3)生成受密码保护的RSA私钥

$openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048

其中,passout代替shell进行密码输入,否则会提示输入密码

4)生成受密码保护的RSA公钥

$openssl rsa -in rsa_aes_private.key -pubout -out rsa_public.key

Enter pass phrase for rsa_aes_private.key:

writing RSA key

第二种非交互方式

$openssl rsa -in rsa_aes_private.key -passin pass:111111 -pubout -out rsa_public.key

writing RSA key

5)转换命令

查看秘钥明细

$openssl rsa -in rsa_private.key -noout -text

私钥转非加密

openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_private.key

私钥转加密

openssl rsa -in rsa_private.key -aes256 -passout pass:111111 -out rsa_aes_private.key

私钥PEM转DER

openssl rsa -in rsa_private.key -outform der -out rsa_aes_private.der

-inform和-outform 参数制定输入输出格式,由der转pem格式同理

查看公钥明细

$openssl rsa -pubin -in rsa_public_key.pem -noout -text

参考: Linux专题—openssl生成公钥和私钥 - 知乎

2.3)生成CSR

下面介绍如何使用openssl生成CSR。

1)生成一个私钥和一个CSR:

如果你想使用 HTTPS(HTTP over TLS)来保护你的 Apache HTTP 或 Nginx Web 服务器的安全,并且你想使用一个证书颁发机构(CA)来颁发 SSL 证书,那么就使用这个方法。生成的 CSR 可以发送给 CA,获取由 CA 签名的 SSL 证书。如果你的 CA 支持 SHA-2,请添加 -sha256 选项,用 SHA-2 签署 CSR。

这条命令从头开始创建一个 2048 位的私钥(domain.key)和一个 CSR(domain.csr):

openssl req \

-newkey rsa:2048 -nodes -keyout domain.key \

-out domain.csr

回答 CSR 信息提问,完成该过程。

选项 -newkey rsa:2048 指定密钥应该是 2048 位,使用 RSA 算法生成。选项 -nodes 指定私钥没有用密码加密。这里没有包含 -new 选项,而是隐含在其中,表示正在生成一个 CSR。

2)从现有的私钥中生成一个 CSR

如果你已经有了私钥,并想用它向 CA 申请证书,请使用这个方法。该命令基于现有的私钥(domain.key)创建一个新的 CSR(domain.csr):

openssl req \

-key domain.key \

-new -out domain.csr

回答 CSR 信息提问,完成该过程。

选项 -key 指定一个现有的私钥(domain.key),它将被用来生成一个新的 CSR。选项 -new 表示正在生成一个 CSR。

说明:openssl可以根据私钥生成公钥。

3)从现有的证书和私钥生成 CSR

如果你想更新现有的证书,但由于某些原因,你或你的 CA 没有原始的 CSR,请使用这个方法。基本上可以省去重新输入 CSR 信息的麻烦,因为它是从现有证书中提取信息的。

该命令基于现有的证书(domain.crt)和私钥(domain.key)创建一个新的 CSR(domain.csr):

openssl x509 \

-in domain.crt \

-signkey domain.key \

-x509toreq -out domain.csr

选项 -x509toreq 指定你使用一个 X509 证书来制作 CSR。

2.4)生成SSL证书

如果想使用 SSL 证书来确保服务的安全,但不需要 CA 签名的证书,一个有效的(和免费的)解决方案是签署你自己的证书,即:自签证书(self-signed certificate)。自签证书是用自己的私钥签署的证书。自签证书和 CA 签名证书一样可以用来加密数据,但是你的用户会显示一个警告,说这个证书不被他们的计算机或浏览器信任。因此,只有当你不需要向用户证明你的服务身份时,才可以使用自签名证书(例如非生产或非公开服务器)。

1)生成自签证书

如果你想使用 HTTPS(HTTP over TLS)来保护你的 Apache HTTP 或 Nginx Web 服务器,并且你不需要你的证书由 CA 签名,那么就使用这个方法。这个命令可以从头开始创建一个 2048 位的私钥(domain.key)和一个自签证书(domain.crt):

openssl req \

-newkey rsa:2048 -nodes -keyout domain.key \

-x509 -days 365 -out domain.crt

回答 CSR 信息提问,完成该过程。

选项 -x509 告诉 req 子命令创建一个自签名的证书。-days 365 选项指定证书的有效期为 365 天。它会生成一个临时的 CSR,以收集与证书相关的信息。

2)从现有私钥生成自签名证书

如果你已经有了一个私钥,并且你想用它来生成一个自签证书,请使用这个方法。这条命令可以从现有的私钥(domain.key)中创建一个自签证书(domain.crt):

openssl req \

-key domain.key \

-new \

-x509 -days 365 -out domain.crt

回答 CSR 信息提问,完成该过程。

选项 -x509 告诉 req 子命令创建一个自签证书。-days 365 选项指定证书的有效期为 365 天。选项 -new 启用 CSR 信息提问。

3)从现有的私钥和 CSR 生成自签证书

如果你已经有了私钥和 CSR,并且你想用它们生成一个自签证书,请使用这个方法。这条命令将从现有的私钥(domain.key)和(domain.csr)中创建一个自签证书(domain.crt)。

openssl x509 \

-signkey domain.key \

-in domain.csr \

-req -days 365 -out domain.crt

选项 -days 365 指定证书的有效期为 365 天。

2.5)查看证书

证书和 CSR 文件是以 PEM 格式编码的,不适合被人读取。本节介绍的 OpenSSL 命令将输出 PEM 编码文件的实际条目。

1)查看 CSR 条目

该命令允许你查看和验证纯文本的 CSR(domain.csr)的内容:

openssl req \

-text -noout -verify \

-in domain.csr

2)查看证书条目

该命令允许你查看纯文本证书(domain.crt)的内容:

openssl x509 \

-text -noout \

-in domain.crt

3)验证证书由 CA 签署

使用此命令验证证书(domain.crt)是否由特定的 CA 证书(ca.crt)签署:

openssl verify \

-verbose -CAFile ca.crt \

domain.crt

2.6)私钥

本节介绍了用于创建和验证私钥的 OpenSSL 命令。

1)创建私钥

使用该命令创建一个受密码保护的 2048 位私钥(domain.key):

openssl genrsa \

-des3 -out domain.key 2048

在提示时输入密码以完成该过程。

2)验证私钥

使用此命令检查私钥(domain.key)是否为有效密钥:

openssl rsa \

-check -in domain.key

如果你的私钥已经加密,系统会提示你输入它的密码,成功后,未加密的密钥会在终端上输出。

3)验证私钥是否与证书和 CSR 匹配

使用这些命令来验证私钥(domain.key)是否匹配证书(domain.crt)和 CSR(domain.csr):

openssl rsa -noout -modulus -in domain.key | openssl md5

openssl x509 -noout -modulus -in domain.crt | openssl md5

openssl req -noout -modulus -in domain.csr | openssl md5

如果每条命令的输出都是相同的,那么私钥、证书和 CSR 就极有可能是相关的。

4)加密私钥

这需要一个未加密的私钥(unencrypted.key),并输出它的加密版本(encrypted.key):

openssl rsa -des3 \

-in unencrypted.key \

-out encrypted.key

输入你所需的密码,以加密私钥。

5)解密私钥

这需要一个加密的私钥(encrypted.key),并输出一个解密的版本(decrypted.key):

openssl rsa \

-in encrypted.key \

-out decrypted.key

在提示时,输入加密密钥的密码。

2.7)转换证书格式

我们一直在使用的所有证书都是 ASCII 码 PEM 编码的 X.509 证书。还有很多其他的证书编码和容器类型;一些应用程序喜欢某些格式而不是其他格式。此外,这些格式中的许多格式可以在一个文件中包含多个项目,如私钥、证书和 CA 证书。

OpenSSL 可以用来将证书在则西格式间转换。本节将介绍一些可能的转换。

1)将 PEM 转换为 DER

如果要将 PEM 编码的证书(domain.crt)转换为 DER 编码的证书(domain.der),即二进制格式,请使用此命令:

openssl x509 \

-in domain.crt \

-outform der -out domain.der

DER 格式通常与 Java 一起使用。

2)将 DER 转换为 PEM

如果要将 DER 编码的证书(domain.der)转换为 PEM 编码的证书(domain.crt),请使用此命令:

openssl x509 \

-inform der -in domain.der \

-out domain.crt

将 PEM 转换为 PKCS7

3)如果你想把 PEM 证书(domain.crt 和 ca-chain.crt)添加到 PKCS7 文件(domain.p7b)中,请使用该命令:

openssl crl2pkcs7 -nocrl \

-certfile domain.crt \

-certfile ca-chain.crt \

-out domain.p7b

请注意,你可以使用一个或多个 -certfile 选项来指定要添加到 PKCS7 文件中的证书。

PKCS7 文件,也被称为 P7B,通常用于 Java Keystores 和 Microsoft IIS(Windows)。它们是 ASCII 文件,可以包含证书和 CA 证书。

4)将 PKCS7 转换为 PEM

如果你想将 PKCS7 文件(domain.p7b)转换为 PEM 文件,请使用该命令:

openssl pkcs7 \

-in domain.p7b \

-print_certs -out domain.crt

请注意,如果你的 PKCS7 文件中有多个项目(如证书和 CA 中间证书),创建的 PEM 文件将包含其中的所有项目。

5)将 PEM 转换为 PKCS12

如果你想使用私钥(domain.key)和证书(domain.crt),并将它们组合成一个 PKCS12 文件(domain.pfx),请使用这个命令:

openssl pkcs12 \

-inkey domain.key \

-in domain.crt \

-export -out domain.pfx

系统会提示你输入导出密码,你可以留空。请注意,在这种情况下,你可以通过将多个证书连接到一个 PEM 文件(domain.crt)中来添加一个证书链到 PKCS12 文件中。

PKCS12 文件,也被称为 PFX 文件,通常用于在 Micrsoft IIS(Windows)中导入和导出证书链。

6)将 PKCS12 转换为 PEM

如果你想转换 PKCS12 文件(domain.pfx)并将其转换为 PEM 格式(domain.combined.crt),请使用此命令:

openssl pkcs12 \

-in domain.pfx \

-nodes -out domain.combined.crt

请注意,如果你的 PKCS12 文件中有多个项目(如证书和私钥),创建的 PEM 文件将包含其中的所有项目。

参考:

OpenSSL 精粹:SSL 证书、私钥和 CSR | Linux 中国 - 知乎

一个自动生成签名的脚本:

#!/bin/sh

# create self-signed server certificate:

read -p "Enter your domain [www.example.com]: " DOMAIN

echo "Create server key..."

openssl genrsa -des3 -out $DOMAIN.key 1024



echo "Create server certificate signing request..."

SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"

openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr



echo "Remove password..."

mv $DOMAIN.key $DOMAIN.origin.key

openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key



echo "Sign SSL certificate..."

openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt



echo "TODO:"

echo "Copy $DOMAIN.crt to /etc/nginx/ssl/$DOMAIN.crt"

echo "Copy $DOMAIN.key to /etc/nginx/ssl/$DOMAIN.key"

echo "Add configuration in nginx:"

echo "server {"

echo " ..."

echo " listen 443 ssl;"

echo " ssl_certificate /etc/nginx/ssl/$DOMAIN.crt;"

echo " ssl_certificate_key /etc/nginx/ssl/$DOMAIN.key;"

echo "}"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值