自签名证书与加/解密

生成自签名证书

1、概述

自签名证书是指使用自己的证书颁发机构(Certificate Authority,CA)来生成和颁发证书,而不是依赖于公共的第三方CA。与使用受信任的第三方CA不同,自签名证书的信任链由自己管理,因此在信任方面可能存在一些挑战。下面是自签名证书的基本步骤:

  • 创建自签名证书颁发机构(CA):首先,您需要创建自己的证书颁发机构,也就是私有CA。这个CA将负责颁发和管理您自己的证书。您可以使用工具(如OpenSSL)生成自己的CA证书和私钥
  • 生成证书请求:要生成自签名证书,您首先需要创建证书请求。证书请求包含了与证书相关的信息,如组织名称、组织单位、国家/地区等。
  • 使用私钥签名证书请求:使用自己的CA私钥,您可以对证书请求进行签名,生成自签名证书。签名是证书颁发机构用自己的私钥对证书请求进行加密,以证明该证书是由该CA颁发的。
  • 分发证书:一旦生成了自签名证书,您可以将证书分发给需要使用它的实体。这通常涉及将证书部署到服务器或分发给客户端。
  • 验证证书:当客户端与使用自签名证书的服务器进行通信时,客户端需要验证服务器提供的证书的有效性和身份。验证过程通常涉及检查证书的签名、期限和可信任性等因素。

自签名证书的优势:在于您可以独立地创建和管理证书,不依赖于第三方CA。但是,由于自签名证书没有通过公共的第三方CA签名,因此需要在使用自签名证书的客户端上配置对应的根证书以进行验证。此外,自签名证书在公共信任方面可能存在一些限制,因为其他人需要验证您的证书的可信度。
在生产环境中,通常建议使用由受信任的第三方CA颁发的证书,这样可以获得更广泛的信任和适应性。自签名证书通常在开发和测试环境中使用,或者在内部网络中进行加密通信时使用。

2、OpenSSL命令

OpenSSL是一个开放源代码的密码工具包,提供了一组用于安全通信的加密、解密、签名、验证和证书操作的命令行工具。下面是一些常用的OpenSSL命令及其说明:
1、生成私钥:

openssl genpkey -algorithm <algorithm> -out <private_key_file>

参数详解:

  • genpkey 是用于生成私钥。
  • -algorithm <algorithm> : 指定生成私钥时使用的算法,如 RSA、DSA、EC 等。
  • -out <private_key_file> : 指定保存生成的私钥的文件名。
[root@node111 test-pkey]# openssl genpkey -algorithm RSA -out ca.key
..................................++++++
......................++++++
[root@node111 test-pkey]# ls
ca.key

2、生成证书请求文件

openssl req -new -key <private_key_file> -out <csr_file>

参数详解:

  • req 是用于生成证书请求文件
  • -new:生成一个新的证书请求。
  • -key <private_key_file>: 指定私钥文件的路径和文件名。
  • -out <csr_file>: 指定生成的证书请求文件的路径和文件名。
  • -subj <subject>: 指定证书请求的主题(如 “/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com”).

/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com 是一个X.509证书中的主题(Subject)字段的示例,用于说明字段中各个部分的含义。
解释如下:
/C=CN:表示证书的国家(Country),此处为中国(China)。CN是Country的缩写。
/ST=Beijing:表示证书的省/自治区/直辖市(State/Province/Territory),此处为北京市。ST是State的缩写。
/L=Beijing: 表示证书的城市(Locality),此处为北京市。L是Locality的缩写.
/O=example:表示证书的组织(Organization),此处为example。O是Organization的缩写。
/OU=Personal:表示证书的组织单位(Organizational Unit),此处为个人(Personal)。OU是Organizational Unit的缩写。
/CN=yourdomain.com:表示证书的通用名称(Common Name),此处为yourdomain.com。CN是Common Name的缩写,通常用于指定证书所属的域名或主机名。

[root@node111 test-pkey]# openssl req -new  -key ca.key  -out ca.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN    #表示证书的国家(Country),此处为中国(China)。
State or Province Name (full name) []:Beijiang # 表示证书的省/自治区/直辖市(State/Province/Territory),此处为北京市。
Locality Name (eg, city) [Default City]:Beijing #表示证书的城市(Locality),此处为北京市。
Organization Name (eg, company) [Default Company Ltd]:expample  #表示证书的组织(Organization),此处为example。
Organizational Unit Name (eg, section) []:Personal #表示证书的组织单位(Organizational Unit),此处为个人(Personal)。
Common Name (eg, your name or your server's hostname) []:www.test.com #表示证书的通用名称(Common Name),此处为test.com,通常用于指定证书所属的域名或主机名。
Email Address []:xxxq@qq.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@node111 test-pkey]# ls
ca.csr  ca.key

3、使用自签名CA私钥和请求生成自签名CA证书

openssl req -x509 -key <private_key_file> -in <csr_file> -out <certificate_file>

参数详解:

  • -in <certificate_file>: 指定输入证书请求文件的路径和文件名。
  • -out <output_file>: 指定输出证书的路径和文件名。
  • -req: 将证书视为证书请求(CSR)。
  • -key <private_key_file> : 使用指定的私钥对证书进行签名。
[root@node111 test-pkey]# openssl req -x509 -in ca.csr -key ca.key  -out  ca.crt 
[root@node111 test-pkey]# ls
ca.crt  ca.csr  ca.key

4、创建服务器私钥

openssl genpkey -algorithm RSA -out server.key

5、 创建服务器证书请求

openssl req -new -key server.key -out server.csr

6、使用自签名CA私钥、CA的证书和服务器证书请求生成服务器证书

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
  • -req: 指定要生成的证书是由证书请求 (CSR) 生成的。
  • -in server.csr : 指定证书请求文件的路径和文件名。
  • -CA ca.crt: 指定自签名证书的颁发机构 (CA) 证书的路径和文件名。
  • -CAkey ca.key: 指定自签名证书的颁发机构 (CA) 的私钥文件的路径和文件名。
  • -CAcreateserial: 告诉 OpenSSL 工具创建一个序列号文件 (ca.srl),其中包含一个唯一的证书序列号。这个序列号文件将用于标识生成的证书。
  • -out server.crt : 指定生成的自签名服务器证书的输出路径和文件名。

7、查看证书信息

openssl x509 -in <certificate_file> -text -noout

该命令用于查看证书的详细信息,包括版本、序列号、有效期、拥有者、颁发者等。

[root@node111 test-pkey]# openssl x509 -in server.crt -text -noout 
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            e8:7c:2e:9f:cb:d3:ed:47
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=Beijiang, L=Beijing, O=exp\x08ample , OU=Personal, CN=www.test.com/emailAddress=xxxq\x08@qq.com
        Validity
            Not Before: Jun 19 17:07:49 2023 GMT
            Not After : Jul 19 17:07:49 2023 GMT
        Subject: C=CN, ST=Beijing, L=Beijing, O=explame, OU=personal, CN=www.test.com/emailAddress=xxx@qq.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                Modulus:
                    00:d0:97:b9:cb:a6:aa:af:b7:41:b8:cd:44:cc:e6:
                    94:71:1e:fa:43:2b:84:13:22:05:78:88:06:65:d5:
                    07:48:09:35:ee:ea:d3:41:bf:34:70:e0:d0:57:05:
                    2b:d3:a9:77:8a:8c:b1:75:e7:f8:78:58:4b:49:aa:
                    71:15:2d:0b:f0:02:ab:28:59:97:b8:74:3f:e7:b5:
                    39:29:8f:d3:85:c5:fc:21:69:8f:dd:b5:e8:bf:a7:
                    24:5e:0c:73:77:e7:1c:57:aa:81:dc:c1:d9:3a:4d:
                    3e:8e:41:d4:79:b0:98:cf:84:30:a5:22:ae:b1:0e:
                    a1:80:d5:ae:4d:95:d1:db:b7
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         6b:d0:1e:12:0d:b7:c0:33:db:8e:36:84:b5:04:a7:11:22:ce:
         0c:32:7b:fe:8c:e7:56:df:34:20:44:5a:c5:eb:50:93:36:c2:
         28:ef:d0:4a:83:ed:3b:5b:bd:aa:88:c0:71:de:8c:a7:b6:0c:
         1e:b2:07:13:f7:c2:00:47:4b:02:04:66:e1:3d:77:d9:30:6c:
         db:02:03:b2:19:af:0a:ac:e3:cb:66:37:34:e1:f6:df:5b:c5:
         08:df:e7:ec:79:bf:ca:7b:fd:98:95:aa:00:0a:cc:2e:21:2e:
         ce:98:93:89:ab:a6:1d:e4:17:e8:9b:25:98:47:1b:a9:13:0a:
         bd:cf

这是一个证书的示例,包含了证书的各个字段信息和签名。
解释如下:

  • Data: 证书的数据部分
  • Version: 证书版本号,这里是1 (0x0),表示X.509证书的第一个版本。
  • Serial Number: 证书的序列号,这里是e8:7c:2e:9f:cb:d3:ed:47。
    Signature Algorithm: 证书签名算法,这里是sha256WithRSAEncryption,使用SHA-256哈希算法和RSA加密算法进行签名。
  • Issuer: 颁发者信息,即证书的颁发机构
  • C=CN: 国家,这里是中国(China)。
  • ST=Beijiang: 省/自治区/直辖市,这里是Beijiang。
  • L=Beijing: 城市,这里是北京市。
  • O=exp\x08ample: 组织(Organization),这里是exp\x08ample。
  • OU=Personal: 组织单位(Organizational Unit),这里是个人(Personal)。
  • CN=www.test.com/emailAddress=xxxq\x08@qq.com: 通用名称(Common Name)和电子邮件地址(Email Address)。
  • Validity: 证书的有效期
  • Not Before: 证书的生效日期,这里是Jun 19 17:07:49 2023 GMT。
  • Not After: 证书的过期日期,这里是Jul 19 17:07:49 2023 GMT。
  • Subject: 证书的主题信息,即证书的持有者信息。
  • Subject Public Key Info: 证书的主题公钥信息。
  • Public Key Algorithm: 公钥算法,这里是rsaEncryption。
  • Public-Key: 公钥的具体信息,包括模数(Modulus)和指数(Exponent)。
  • Signature Algorithm: 证书的签名算法,这里是sha256WithRSAEncryption。
  • Signature: 签名值,用颁发机构的私钥对证书的摘要进行加密得到的签名值。

8、加密与解密

1、生成密钥对
首先,我们需要生成一个密钥对,其中一个密钥用于加密(公钥),另一个密钥用于解密(私钥)。
生成私钥:

openssl genpkey -algorithm RSA -out private_key.pem
  • genpkey:生成密钥对的命令。
  • -algorithm RSA:指定生成 RSA 密钥对。
  • -out private_key.pem:指定生成的私钥文件名和路径。
[root@node111 test-pkey]# cd test-enc-dec/
[root@node111 test-enc-dec]# ls
[root@node111 test-enc-dec]# openssl genpkey -algorithm RSA -out private.pem
..................................................................++++++
..++++++

生成公钥:

openssl rsa -pubout -in private_key.pem -out public_key.pem
  • rsa:RSA 密钥操作命令。
  • -pubout:生成公钥。
  • -in private_key.pem:指定私钥文件的路径和文件名。
  • -out public_key.pem:指定生成的公钥文件名和路径。
[root@node111 test-enc-dec]# openssl rsa -pubout -in private.pem  -out pub.pem
writing RSA key

2、加密数据
使用公钥对数据进行加密。

openssl rsautl -encrypt -in plaintext.txt -out encrypted.txt -pubin -inkey public_key.pem
  • rsautl:RSA 密钥操作命令。
  • -encrypt:指定进行加密操作。
  • -in plaintext.txt:指定要加密的明文文件。
  • -out encrypted.txt:指定加密后的密文文件。
  • -pubin:表示使用公钥进行加密。
  • -inkey public_key.pem:指定公钥文件的路径和文件名。
[root@node111 test-enc-dec]# echo "asdbchcgc123yuudc" >test.txt
[root@node111 test-enc-dec]# openssl rsautl -encrypt -in test.txt  -out encrypt.txt -pubin -inkey pub.pem 
[root@node111 test-enc-dec]# cat encrypt.txt

3、解密数据
使用私钥对加密后的数据进行解密。

openssl rsautl -decrypt -in encrypted.txt -out decrypted.txt -inkey private_key.pem
  • -decrypt:指定进行解密操作。
  • -in encrypted.txt:指定要解密的密文文件。
  • -out decrypted.txt:指定解密后的明文文件。
  • -inkey private_key.pem:指定私钥文件的路径和文件名。
[root@node111 test-enc-dec]# openssl rsautl -decrypt -in encrypt.txt  -out decrypt.txt -inkey private.pem 
[root@node111 test-enc-dec]# cat decrypt.txt 
asdbchcgc123yuudc
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值