服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 详解如何使用openssl创建自签名证书

详解如何使用openssl创建自签名证书

2023-04-27 10:46飞鱼科技 C/C++

这篇文章主要为大家介绍了详解如何使用openssl创建自签名证书示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

概览&证书的结构&证书验签

详解如何使用openssl创建自签名证书

创建根证书

创建根密钥 ca.key.pem

?
1
2
3
4
5
6
7
$ openssl genrsa -des3 -out ca/ca.key.pem 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
.........................................................................................................................................................................++++
..........................................................++++
e is 65537 (0x010001)
Enter pass phrase for ca.key.pem:
Verifying - Enter pass phrase for ca.key.pem:

密码 123456

我们在这儿使用 RSA 4096, 因为根证书不经常使用,为了更好的安全性,我们使用较大的参数。

备注

生产环境一般都会有中间证书,我们这儿为了方便省略了中间证书的签发流程

-des         使用des cbc模式对私钥文件进行加密。
-des3         使用des3 cbc模式对私钥文件进行加密。  需要输入密码,秘钥使用需要输入密码
-idea         使用idea cbc模式对私钥文件进行加密
-out          指定输出私钥文件名。

创建根证书 ca.crt.pem

可以不用创建ca.csr.pem文件,直接生成ca.crt.pem文件,如果分成两步,见下一小节

现在我们使用刚创建的根密钥来创建我们的根证书:

?
1
2
$ openssl req -key ca/ca.key.pem -new -x509 -days 3650 -sha256 -out ca/ca.crt -subj '/C=CN/ST=ShanDong/CN=demo.toolbox/O=dzb'
Enter pass phrase for ca.key.pem:

req大致有3个功能:生成证书请求文件、验证证书请求文件和创建根CA

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-config
-key     指定私钥
-new
-sha256  哈希函数
-out     输出的文件
-days    有效期
-subj
subj子参数详解:
缩写  翻译       英文对照
C    国家名称缩写 Country Name (2 letter code)
ST   州或省名称  State or Province Name (full name)
L    城市或区域称 Locality Name (eg, city)
O    组织名(或公司名)  Organization Name (eg, company)
OU   组织单位名称(或部门名)   Organizational Unit Name (eg, section)
CN   服务器域名/证书拥有者名称  Common Name (e.g. server FQDN or YOUR name)
emailAddress    邮件地址    Email

ca.crt的后缀名不加pem,是方便证书安装的时候,系统可以识别,后续的crt不需要安装,所以添加pem后缀,以区分格式

* 创建根证书 ca.csr.pem ca.crt.pem

?
1
2
$ openssl req -new -key ca/ca.key.pem -sha256 -out ca/ca.csr.pem -subj '/C=CN/ST=ShanDong/CN=demo.toolbox/O=dzb'
Enter pass phrase for ca.key.pem:
?
1
$ openssl x509 -req -days 3650 -in ca/ca.csr.pem -signkey ca/ca.key.pem -out ca/ca.crt

查看根证书

查看我们刚刚创建的根证书:

?
1
$ openssl x509 -noout -text -in ca/ca.crt

主要检查上面 -subj 填写的内容和证书的有效期

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            71:34:01:05:eb:4b:f7:8c:09:c6:b0:ad:34:b4:aa:03:93:2b:fc:d8
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = ShanDong, CN = demo.toolbox, O = dzb
        Validity
            Not Before: Apr 24 02:08:43 2023 GMT
            Not After : Apr 21 02:08:43 2033 GMT
        Subject: C = CN, ST = ShanDong, CN = demo.toolbox, O = dzb
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:a7:cb:bb:f2:58:8b:17:60:6d:e3:c8:3f:ed:72:
                      ... ...
                    73:ad:e1:de:d0:5b:d2:1d:3e:0c:55:a3:aa:b5:0c:
                    28:8c:b7
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                FE:D8:0D:72:BE:7B:21:48:1F:14:27:85:3C:9D:16:9E:25:D1:3B:4A
            X509v3 Authority Key Identifier:
                keyid:FE:D8:0D:72:BE:7B:21:48:1F:14:27:85:3C:9D:16:9E:25:D1:3B:4A
            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         24:1e:d8:40:7b:0e:3b:4b:96:51:ff:cb:a0:62:ba:e5:e9:55:
           ... ...
         a2:ba:44:ac:97:da:dc:24:d9:b7:5f:3a:fa:05:16:b8:2f:9e:
         7a:45:89:fa:be:cf:e4:4e

创建服务器证书

现在让我们使用上面创建的根证书,创建一个我们可以使用的 https 证书。

创建服务器密钥 server.key.pem

?
1
2
3
4
5
6
7
$ openssl genrsa -des3 -out server/server.key.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.......................................................+++++
................................+++++
e is 65537 (0x010001)
Enter pass phrase for server.key.pem:
Verifying - Enter pass phrase for server.key.pem:

密码 123456

备注

我们使用 2048 位的 RSA 证书是因为服务器证书会经常使用,这样可以降低CPU的压力,而且并不影响安全性。

配置文件server.ini

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat > server/server.ini <<EOF
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext
[ req_distinguished_name ]
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1  = localhost
IP.1   = 127.0.0.1
IP.2   = 169.254.4.58
IP.3   = 172.20.10.2
EOF

DNS可以配置多个

如果只对IP进行签名,可以如下配置(如果要修改IP,就从这之后进行就行)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat > server.ini <<EOF
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext
[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = CN
stateOrProvinceName         = ShangHai
stateOrProvinceName_default = ShangHai
localityName                = Locality Name (eg, city)
localityName_default        = ShangHai
organizationName            = Organization Name (eg, company)
organizationName_default    = dai
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64
commonName_default          = server.toolbox
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
IP      = 169.254.4.58
EOF

DNS可以配置多个(对应多个域名),IP也可以配置多个

生成服务器端证书==请求文件== server.csr.pem

?
1
2
$ openssl req -sha256 -new -key server/server.key.pem -config server/server.ini -out server/server.csr.pem -subj '/C=CN/ST=ShangHai/CN=server.toolbox/O=dai'
$ openssl req -sha256 -new -key server/server.key.pem -config server/server.ini -out server/server.csr.pem

第一种方式,通过 -subj配置了证书授权对象的信息

第二种方式,通过配置文件确定,在执行过程中,会要求确认,可以在这个过程中进行修改

生成服务器端证书 server.crt.pem

?
1
2
3
4
openssl x509 -req -days 3650 \
  -CA ca/ca.crt -CAkey ca/ca.key.pem -CAcreateserial \
  -in server/server.csr.pem -out server/server.crt.pem\
  -extensions req_ext -extfile server/server.ini

一定要加-extfile server/server.ini否则最后签发的证书内不会有IP和域名的信息

查看服务器端请求文件

?
1
$ openssl x509 -noout -text -in server/server.crt.pem
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            61:79:bd:82:c8:1e:2a:27:6f:a9:34:c8:92:f8:54:3f:22:de:80:0b
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = ShanDong, CN = demo.toolbox, O = dzb
        Validity
            Not Before: Apr 24 02:19:50 2023 GMT
            Not After : Apr 21 02:19:50 2033 GMT
        Subject: C = CN, ST = ShangHai, CN = server.toolbox, O = dai
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:b1:de:96:bb:43:4b:fb:46:99:7e:be:61:c1:46:
                      ... ...
                    4a:18:24:b3:79:8c:ff:35:d1:3a:4e:a3:11:02:2c:
                    98:ff
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:localhost, IP Address:127.0.0.1, IP Address:169.254.4.58, IP Address:172.20.10.2
    Signature Algorithm: sha256WithRSAEncryption
         07:c8:2a:e0:e7:14:86:23:3b:72:38:7f:f8:cc:90:54:f2:fa:
           ... ...
         c2:82:8a:2f:c0:a3:42:78:91:45:92:73:a4:aa:f2:ca:c1:5a:
         58:c0:41:f0:ea:65:43:9e

要检查授权的DNS和IP

以上就是详解如何使用openssl创建自签名证书的详细内容,更多关于openssl创建自签名证书的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7225509897763291192

延伸 · 阅读

精彩推荐
  • C/C++C++实现LeetCode(142.单链表中的环之二)

    C++实现LeetCode(142.单链表中的环之二)

    这篇文章主要介绍了C++实现LeetCode(142.单链表中的环之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang11292021-12-02
  • C/C++C++中关键字Struct和Class的区别

    C++中关键字Struct和Class的区别

    这篇文章主要介绍了C++中关键字Struct和Class的区别,本文用大量实例讲解了Struct和Class的区别,需要的朋友可以参考下...

    果冻想10992021-02-04
  • C/C++关于C++多重继承下虚表结构的问题

    关于C++多重继承下虚表结构的问题

    这篇文章主要介绍了C++ 多重继承下虚表结构的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    不会写代码的丝丽7872022-01-04
  • C/C++C语言--数字交换题目详解

    C语言--数字交换题目详解

    本文通过代码给大家介绍c语言数字交换的题目,通过实例代码给大家讲解的很详细,具有一定的参考借鉴价值,对c语言感兴趣的朋友一起看看吧...

    weixin_450907284262021-12-24
  • C/C++c语言与c++基础知识点(必看)

    c语言与c++基础知识点(必看)

    下面小编就为大家带来一篇c语言与c++基础知识点(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    MoMo6732021-04-08
  • C/C++C++ normal_distribution高斯正态分布函数的用法示例

    C++ normal_distribution高斯正态分布函数的用法示例

    高斯分布也称为正态分布(normal distribution),常用的成熟的生成高斯分布随机数序列的方法由Marsaglia和Bray在1964年提出,这篇文章主要给大家介绍了关于C++ ...

    c语言中文网8622021-11-26
  • C/C++c++字符串分割的方法

    c++字符串分割的方法

    这篇文章主要介绍了c++字符串分割的方法,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下...

    Dabelv12672021-09-22
  • C/C++C++中putchar与getchar函数的细节及运用

    C++中putchar与getchar函数的细节及运用

    C语言提供putchar函数,用于给终端输出一个字符;getchar函数,可以从终端接收用户输入的一个字符,本文给大家分享C++中putchar与getchar函数的细节及运用,...

    Chaser Feng4302021-12-03