前言
1、前面写过一篇 阿里云免费ssl证书申请与部署,大家可以去看下
2、建议大家看完本篇博客,可以再去了解 openssel 命令 openssl系列,写的很详细
一、openssl 安装说明
1、这部分就不再说了,我使用centos7.9,是自带 openssl
的,window的话,要去下载安装
二、CA机构
CA机构,全称为Certificate Authority,即电子认证服务机构,也称作证书授权机构。以下是关于CA机构的详细解释:
2.1、定义与性质
CA机构是具有权威公信力的第三方安全认证机构,负责数字证书的申请、审核申请人身份、签发证书及证书的生命周期管理等工作。作为独立第三方,CA机构为用户提供电子认证服务,确保网上传递信息的机密性、完整性,以及交易实体身份的真实性、信息的不可否认性,从而保障网络应用的可靠性。
2.2、功能与职责
- 发放数字证书:CA机构验证用户的身份信息后,发放包含用户公钥、身份信息及CA签名的数字证书,证明用户合法拥有其公钥。
- 公钥管理:承担公钥体系中公钥的合法性检验责任,确保公钥的合法性和有效性。
- 证书管理:负责数字证书的签发、更新、撤销和查询等全生命周期管理。
- 身份认证:通过数字证书实现用户身份的在线验证,确保网络通信双方的身份真实可靠。
2.3、类型与分类
根据功能和服务范围的不同,CA机构可分为根CA、中间CA、终端CA、域名CA和代码CA等。不同类型的CA机构在数字证书服务中扮演着不同的角色。
2.4、数字证书的内容与作用
数字证书是互联网通讯中标志通讯各方身份信息的一串数字,也称为公开密钥证书。它包含证书持有者的公钥、证书的有效期、颁发证书的CA的标识等信息,并附有CA的数字签名以验证证书的真实性和完整性。数字证书的作用包括:
- 网络上单位的身份证:每个证书只能被唯一地签发给一个机构,不存在多个机构共用一个CA证书。
- 信息保密性:交易中的信息均有保密的要求,因此在信息传递时需进行加密。
- 交易者身份的确定性:网上交易的双方需要确认对方的身份以确保交易成功。
- 不可否认性:交易一旦达成是不能被否认或抵赖的。
- 不可修改性:交易的文件是不可被修改的,以保障交易的顺利进行。
2.5、window 本地自带已经安装的CA证书
1、win10系统里,右键工具栏左下角windows图标,选择“运行”,然后输入certmgr.msc
,回车,这时就会弹出一个窗口就可以查看到了,如下图所示:
2.6、浏览器本地自带已经安装的CA证书
1、这里以chrome为例
三、流程说明
3.1、标准的CA签发流程
假设需要证书的是你的服务器,这里假设就命名为 server。
- 为
服务器
创建私钥(.key) - 基于
服务器
私钥创建证书签名请求(.csr) - 将
服务器
证书申请请求(.csr)提交给CA认证机构申请证书(.crt) - CA机构生成CA证书链
此刻你的服务器上面就会得到,如下三个文件。
- server.key
- server.csr
- server.crt
如果你的服务器web是nginx,那么只需要将 server.key 和 server.crt 部署到Nginx上面就行了。
3.2、生成私有CA签发的证书
- 生成CA私钥(ca.key)和CA自签名证书(ca.crt)
自己假扮CA机构,当然,这种网络是不会认可的,所以,我们本地测试是没啥问题的
- 生成Server端私钥(server.key)和证书签名请求(server.csr)
- 使用CA证书(ca.crt)与密钥(ca.key)签署服务器的证书签名请求(server.csr),生成私有CA签名的服务器证书(server.crt)
此刻你的服务器上面就会得到,如下五个文件。
- server.key
- server.csr
- server.crt
- ca.key
- ca.crt
四、生成私有CA签发的证书的实操
1、在centos 中创建一个 ssl 文件夹,后续操作都在这
4.1、生成CA私钥(ca.key)和CA自签名证书(ca.crt)
1、生成密钥对,该命令随即会提示您输入密钥保护密码,后续在生成、签发、验证证书时均需要此密码。请妥善相关密钥及密码
如果使用 openssl genrsa -out rootCA.key 2048,即不使用参数 -des3 就可以生成无需密码管理的密钥对
其实 生成的 ca.key 里面包含了公钥和私钥,因为公钥就是从私钥里面提取出来的,我们也可以使用相关命令得到 ca.key 的指定私钥和指定公钥
openssl genrsa -des3 -out ca.key 2048
2、我们可以看下 这个 ca.key 文件内容
3、可以将ca.key转为pem文件,或者你在之前生成的时候就换成 .pem文件,也行
openssl rsa -in ca.key -out ca-key.pem
4、生成 CA 证书,证书有效期 1 年
# 简化的命令
openssl req -x509 -key ca.key -sha256 -days 365 -out ca.crt# 复杂的命令: openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem
与之前的命令相比,这个命令增加了 -new 和 -nodes 选项:- new: 在复杂的命令中,这个选项表示创建一个新的证书请求或证书。然而,在简化的命令中,由于 -x509 已经指示要生成一个新的自签名证书,所以 -new 实际上是隐含的,因此可以省略。- nodes: 这个选项用于防止对私钥进行加密(我们之前的ca.key是需要输入密码的,使用了-des3参数)。在复杂的命令中,增加这个参数来保证 省略加密 是为了方便在脚本或自动化环境中使用私钥。然而,在这个复杂的命令中,如果 ca.key 私钥文件已经是没有加密的,或者您不介意在生成证书时手动输入密码来解密私钥(尽管这通常不是生成自签名证书时的常见做法),那么 -nodes 也可以省略。- sha256 : 这个参数指定了用于签名证书的哈希算法。具体来说,加上 -sha256 参数会指示 OpenSSL 使用 SHA-256 算法对证书进行签名。如果不加这个参数,OpenSSL 可能会使用默认的哈希算法,这个默认算法可能会根据 OpenSSL 的版本和配置而有所不同。
5、查看我们的ca证书,以文本形式输出,
openssl x509 -in ca.crt -text -noout
命令 openssl x509 -in ca.crt -text -noout 用于查看和解析 X.509 证书(在这个例子中是 ca.crt 文件)的详细信息,并以文本格式输出,但不输出证书本身。下面是该命令各部分的解释:
x509: 这是 OpenSSL 中用于处理 X.509 证书的命令。X.509 是一种广泛使用的公钥证书标准,用于在公钥基础设施(PKI)中分发公钥。
-in ca.crt: 指定输入文件,即要查看的 X.509 证书文件。在这个例子中,证书文件名为 ca.crt。
-text: 指示 OpenSSL 以文本格式输出证书的详细信息。这包括证书的版本、序列号、签名算法、颁发者(Issuer)和主题(Subject)信息、公钥、扩展等。
-noout: 阻止 OpenSSL 输出证书本身。由于使用了 -text 选项来查看证书的详细信息,因此 -noout 确保只输出这些详细信息,而不包括证书的 PEM 或 DER 编码表示。
该命令的作用是读取 ca.crt 文件中的 X.509 证书,并以文本格式输出其详细信息,但不包括证书本身的编码数据。
请注意,ca.crt 通常是一个包含 X.509 证书的文件,该文件可能以 .crt、.pem、.cer 或 .der 作为文件扩展名。在这个上下文中,.crt 扩展名仅表示该文件包含一个证书,而不涉及文件的编码格式(尽管 .crt 和 .pem 通常用于表示基于文本的 PEM 编码证书)。
[root@localjt01 ssl]# openssl x509 -in ca.crt -text -nooutCertificate:Data:Version: 3 (0x2)Serial Number:e0:94:6c:61:6a:9f:5e:bcSignature Algorithm: sha256WithRSAEncryptionIssuer: C=cn, ST=gz, L=sz, O=gxm, OU=gxm, CN=gxm_ca/emailAddress=gxm@foxmail.com # 发布者,CA机构信息,就是我们刚刚填写的Validity # 有效期,就是我们刚刚填写的,1年Not Before: Dec 3 03:24:49 2024 GMTNot After : Dec 3 03:24:49 2025 GMTSubject: C=cn, ST=gz, L=sz, O=gxm, OU=gxm, CN=gxm_ca/emailAddress=gxm@foxmail.com #颁发者(Issuer)CA机构信息,就是我们刚刚填写的Subject Public Key Info:Public Key Algorithm: rsaEncryptionPublic-Key: (2048 bit) # ca.key 里面的公钥Modulus:00:cc:1e:f4:cf:dc:c7:6c:e7:81:e3:46:e0:11:fc:5f:92:f2:e4:44:2a:5f:4a:af:17:3a:62:1b:db:06:79:d2:86:df:67:fb:a1:bb:12:a0:33:9e:1f:da:34:e6:4e:93:da:6a:b0:68:fc:62:63:b7:a0:89:68:7a:6c:81:52:01:1f:2e:b1:ea:1d:32:dc:b2:61:d0:09:a0:f6:a6:b7:c4:58:a4:c5:b3:80:54:f8:ae:ae:2c:62:5b:39:41:12:0b:24:5f:28:96:13:af:76:a4:71:79:3b:2b:18:e7:12:59:09:a1:74:00:f4:5b:b4:69:8a:7f:4d:04:85:e9:21:48:7b:45:3b:bb:dc:03:59:e6:03:ae:d0:39:59:83:1e:6f:43:e7:be:cd:1e:60:21:65:20:02:d8:1c:21:1b:b7:18:ae:b4:cc:11:fd:ff:b9:84:21:16:2d:06:f0:ca:19:be:c1:77:d9:59:16:43:cf:c7:1c:50:d6:36:be:03:d8:42:ed:4b:7c:ae:97:33:6d:ba:7e:d8:fb:ef:86:3d:95:ee:7d:c7:9e:c9:f5:03:0a:ca:e0:90:0f:83:28:87:96:6e:ae:f0:28:dc:95:a9:00:d3:fc:a1:7b:13:71:57:67:42:bf:84:1c:7a:e4:4f:fa:7f:4b:ce:51:48:49:0a:d3:4d:c3Exponent: 65537 (0x10001)X509v3 extensions: # 扩展信息X509v3 Subject Key Identifier: 0E:0B:87:6B:E0:76:15:B5:7A:E6:49:CC:D8:06:AB:00:30:B6:C9:B1X509v3 Authority Key Identifier: keyid:0E:0B:87:6B:E0:76:15:B5:7A:E6:49:CC:D8:06:AB:00:30:B6:C9:B1X509v3 Basic Constraints: CA:TRUESignature Algorithm: sha256WithRSAEncryption # 签名算法 使用的是sha256,我们前面指定的参数1f:e1:cb:08:b7:79:18:ed:f7:85:3f:cd:e0:d7:66:bf:a4:86:31:c4:63:7c:3d:96:93:fd:6f:63:a5:51:dd:b8:3a:ff:3d:0d:3b:2e:3e:7d:d7:ff:56:65:bb:83:3c:2f:7d:f5:b5:66:a7:11:4d:fe:88:38:4b:26:0e:85:75:35:b8:39:07:af:05:5f:38:6c:ef:92:25:d6:c1:44:60:3b:27:45:8e:02:5f:b1:33:b9:8f:c6:31:c5:9e:f0:46:fe:20:b1:00:60:96:96:25:d4:b3:03:a4:a1:f1:b8:49:09:f3:c8:c8:25:c4:95:e3:44:2a:ee:a8:83:a0:28:1f:1a:06:2a:7c:ef:ff:97:6f:a6:a6:09:54:c5:33:03:7f:75:35:91:5a:b3:7c:2b:46:cc:10:2b:0d:49:34:4c:e0:09:67:74:64:37:60:f5:9b:10:0c:9d:b3:c6:75:12:c9:36:53:e6:71:a0:e2:93:58:d0:44:45:79:37:dc:6e:ea:7c:b7:80:bd:fb:f5:a0:65:99:17:ab:ba:35:c1:da:77:5c:d6:24:73:b6:3c:fb:83:e3:8d:54:24:b4:b0:96:dc:65:6e:8a:e8:ed:9d:84:ff:a6:50:47:d4:d1:16:ac:96:c4:92:65:12:1b:55:b2:41:58:96:c2:61:89:81:89:cd:af
4.2、生成Server端私钥(server.key)和证书签名请求(server.csr)
1、这里不使用 参数 -des3
openssl genrsa -out server.key 2048
2、使用CA证书(ca.crt)与密钥(ca.key)签署服务器的证书签名请求(server.csr)
注意这⾥的common name必须是需要访问的域名或者ip
openssl req -new -key server.key -out server.csr
3、多出了 服务端证书签名请求文件 server.csr
4、查看下这个 签名请求文件的内容,如下
openssl req -text -noout -verify -in server.csr
[root@localjt01 ssl]# openssl req -text -noout -verify -in server.csr
verify OK
Certificate Request:Data:Version: 0 (0x0)Subject: C=cn, ST=gz, L=sz, O=gxm, OU=gxm, CN=192.168.173.129/emailAddress=gxmto@foxmail.com # 服务器的信息,就是我们之前填写的Subject Public Key Info:Public Key Algorithm: rsaEncryption # 服务器的公钥内容,以及算法是rsaPublic-Key: (2048 bit)Modulus:00:c3:98:2f:78:19:9b:cc:6c:72:ff:d0:75:b1:6e:bd:45:5e:46:ef:7c:e0:56:c2:6c:0a:23:1a:02:a9:7f:23:44:0a:2b:fc:28:ec:de:3b:05:07:b0:d2:fb:21:e9:48:fa:e5:9e:f6:f1:d0:34:7b:d8:06:a6:ea:e4:8d:64:d3:ce:2a:0d:20:90:51:56:ff:a4:91:e3:3a:7f:68:5f:7c:6b:c4:c2:68:b3:f5:7d:74:98:72:74:14:d7:39:bc:58:53:7d:77:71:31:7a:57:76:23:d0:6d:8a:b9:03:ec:87:6b:99:5e:5f:5e:46:6f:51:a8:2f:c4:76:16:0b:a7:91:4a:9a:52:d1:71:64:a6:1a:3a:28:db:63:9a:48:70:90:ce:e5:f0:8e:4d:49:3a:e4:08:29:66:c6:8d:f2:30:22:59:50:61:e3:e4:04:e4:3e:7c:f7:73:e2:62:ab:5f:55:45:ab:54:5b:23:fe:82:a7:a4:9a:1a:28:64:cd:70:31:84:aa:ef:ed:7e:b9:80:3a:80:b0:07:9d:06:e3:48:41:e7:7c:17:76:8b:16:9f:63:67:1a:5b:32:7e:bb:bf:02:7b:e8:f6:62:d8:aa:f6:4e:d3:e5:4c:d0:5c:db:1b:ac:98:87:11:9b:fb:49:fe:37:84:c0:27:86:26:47:15:31:51Exponent: 65537 (0x10001)Attributes:a0:00Signature Algorithm: sha256WithRSAEncryption53:79:c3:c9:4e:81:62:b3:44:e1:d3:40:eb:bf:56:d8:22:8a:b1:18:45:c2:3d:a5:c2:bd:f3:8b:b6:a7:29:9f:97:a5:56:9a:4e:c9:c0:90:7a:e2:7d:9e:18:7b:ab:0e:ec:a3:61:54:ad:62:4b:78:f4:c0:db:a3:1d:9b:7f:73:e7:fc:5c:76:a2:17:56:7c:b9:89:69:21:81:c0:11:89:98:81:a6:65:5d:9b:bf:db:aa:5d:9e:3b:e0:b8:c0:d3:7e:c6:f7:60:af:9c:4b:69:9a:fc:49:4c:5e:12:dc:d4:cb:3c:c5:b9:e8:71:e7:b4:fc:ef:02:16:35:6f:b2:3e:99:33:99:5c:56:f5:ae:4c:96:e6:e5:97:82:04:1f:09:43:a3:9b:fc:77:cf:ea:4d:d7:32:39:40:5d:33:0a:1a:69:a1:12:aa:0e:c8:e9:a1:8d:2e:5b:fe:26:83:5d:2c:d7:65:09:01:6c:6e:82:57:bd:a5:81:64:5f:e3:5c:77:7f:74:af:a4:b5:b9:8e:c2:fb:1c:d0:ad:ef:41:cf:01:63:22:92:b2:7a:5d:c1:ce:fc:3e:3d:12:64:85:15:83:6c:39:cb:57:15:9b:2d:62:3c:2b:ac:5c:d6:9a:fe:3d:05:14:0b:3b:69:8d:d3:2f:03:25:fc:77:31:5c:bd:64
[root@localjt01 ssl]#
4.3、生成私有CA签名的服务器证书(server.crt)
1、签发这个服务器的证书给1年
因为我们的ca需要密码,所以需要你输入前面你设置的CA密码
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -out server.crt
2、查看这个 server.crt 证书内容
[root@localjt01 ssl]# openssl x509 -in server.crt -text -noout
Certificate:Data:Version: 1 (0x0)Serial Number:cc:d9:62:c5:84:84:f3:e8Signature Algorithm: sha256WithRSAEncryptionIssuer: C=cn, ST=gz, L=sz, O=gxm, OU=gxm, CN=gxm_ca/emailAddress=gxm@foxmail.com # 签发者信息,就是我们前面自己填写的ca机构信息Validity #有效期一年Not Before: Dec 3 03:55:53 2024 GMTNot After : Dec 3 03:55:53 2025 GMTSubject: C=cn, ST=gz, L=sz, O=gxm, OU=gxm, CN=192.168.173.129/emailAddress=gxmto@foxmail.com # 服务器信息,就是我们自己前面填写的服务器信息Subject Public Key Info: # 服务器的公钥信息Public Key Algorithm: rsaEncryptionPublic-Key: (2048 bit)Modulus:00:c3:98:2f:78:19:9b:cc:6c:72:ff:d0:75:b1:6e:bd:45:5e:46:ef:7c:e0:56:c2:6c:0a:23:1a:02:a9:7f:23:44:0a:2b:fc:28:ec:de:3b:05:07:b0:d2:fb:21:e9:48:fa:e5:9e:f6:f1:d0:34:7b:d8:06:a6:ea:e4:8d:64:d3:ce:2a:0d:20:90:51:56:ff:a4:91:e3:3a:7f:68:5f:7c:6b:c4:c2:68:b3:f5:7d:74:98:72:74:14:d7:39:bc:58:53:7d:77:71:31:7a:57:76:23:d0:6d:8a:b9:03:ec:87:6b:99:5e:5f:5e:46:6f:51:a8:2f:c4:76:16:0b:a7:91:4a:9a:52:d1:71:64:a6:1a:3a:28:db:63:9a:48:70:90:ce:e5:f0:8e:4d:49:3a:e4:08:29:66:c6:8d:f2:30:22:59:50:61:e3:e4:04:e4:3e:7c:f7:73:e2:62:ab:5f:55:45:ab:54:5b:23:fe:82:a7:a4:9a:1a:28:64:cd:70:31:84:aa:ef:ed:7e:b9:80:3a:80:b0:07:9d:06:e3:48:41:e7:7c:17:76:8b:16:9f:63:67:1a:5b:32:7e:bb:bf:02:7b:e8:f6:62:d8:aa:f6:4e:d3:e5:4c:d0:5c:db:1b:ac:98:87:11:9b:fb:49:fe:37:84:c0:27:86:26:47:15:31:51Exponent: 65537 (0x10001)Signature Algorithm: sha256WithRSAEncryption8e:99:59:55:98:b5:f8:1e:25:6b:35:c8:8d:2a:35:9a:ee:71:db:f3:0e:17:06:e0:b9:2e:74:d6:4c:eb:d6:d1:bd:7e:b6:1f:78:da:f0:1d:55:5a:8f:b7:6e:2a:c2:b2:a6:bb:96:39:4f:a5:2f:7f:5d:96:c3:fb:62:5e:05:32:5b:9d:8c:ba:37:a5:01:bf:e5:fe:9e:2e:f7:ec:04:00:9d:1f:7b:20:ee:1a:75:48:ab:3e:79:3d:85:4e:c5:c7:68:bb:19:a2:5c:1d:9f:ee:e4:b5:13:4b:25:24:93:12:25:54:f2:fa:d5:f9:d8:04:2b:b2:3f:e7:ea:f4:3e:52:df:01:0f:1d:f8:79:91:27:62:3a:78:0a:b7:2c:00:3c:89:7b:1d:ca:37:3e:e5:0c:5f:34:e5:ec:62:40:54:1e:49:62:ac:9f:90:d3:65:cc:2b:99:c7:d3:d0:29:68:1a:37:c2:c9:f1:20:cb:c1:99:34:c5:91:a7:cd:59:63:75:05:2e:2c:85:7c:7e:e0:f0:fd:e6:87:c2:67:f6:2f:14:10:59:db:db:86:52:45:40:77:2d:5c:e9:1e:51:b5:c5:fa:84:93:3e:d2:0a:9b:aa:0d:a7:dc:62:fe:65:d6:e8:cb:59:04:05:45:08:28:9f:88:d1:4a:7d:97:ba:41:61
4.4、证书信息
1、我们可以把 ca.crt 和 server.crt 文件拿到 window下查看,方便查看信息,如下
4.4.1、ca.crt
4.4.2、server.crt
五、服务器部署证书
1、在 192.168.173.129
服务器上面部署一个 docker nginx,大致如下
docker run \
-p 80:80 \
-p 443:443 \
--name nginx \
-v /etc/localtime:/etc/localtime \
-v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /data/docker/nginx/log:/var/log/nginx \
-v /data/docker/nginx/html:/usr/share/nginx/html \
-d nginx:latest
2、启动成功之后,确认 http://192.168.173.129/
可以访问,而 https://192.168.173.129/
不可以访问
3、将制作成的 server.key
,server.crt
放到nginx安装目录下的指定某个文件夹,一般是ssl,所以将这两个文件放到了 宿主机,/data/docker/nginx/conf/conf.d/ssl 此文件夹下,那么docker内部也有这两个文件
4、修改配置文件,因为是单向认证,所以我们只需配置服务端Nginx,在 /data/docker/nginx/conf/conf.d
目录创建一个ssl.conf文件,内容如下,主要的是
#填写证书文件名称ssl_certificate /etc/nginx/conf.d/ssl/server.crt;#填写证书私钥文件名称ssl_certificate_key /etc/nginx/conf.d/ssl/server.key;
server {#配置HTTPS的默认访问端口为443。#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。listen 443 ssl;#填写证书绑定的域名server_name 192.168.173.129;#填写证书文件名称ssl_certificate /etc/nginx/conf.d/ssl/server.crt;#填写证书私钥文件名称ssl_certificate_key /etc/nginx/conf.d/ssl/server.key;ssl_session_timeout 5m;#表示使用的加密套件的类型ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;#表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;#access_log /var/log/nginx/host.access.log main;location / {root /usr/share/nginx/html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}
}
5、重启nginx 验证
6、如果你需要 http 自动跳转 https。只需要在ssl.conf
文件加上
server {listen 80;#填写证书绑定的域名server_name 192.168.173.129;#将所有HTTP请求通过rewrite指令重定向到HTTPS。rewrite ^(.*)$ https://$host$1;
}
六、客户端部署证书(如果需要双向认证)
1、如果你在服务端配置了,那其实是单向认证,即客户端认证服务器是否安全,如果你希望服务器也认证客户端是否安全,那就是 双向认证。
6.1、生成客户端证书
1、步骤和服务器一样,其实都是通过ca机构颁发证书,即我们需要得到如下文件
- client.key
- client.csr
- client.crt
2、生成文件 client.key
openssl genrsa -out client.key 2048
3、使用CA证书(ca.crt)与密钥(ca.key)签署客户端的证书签名请求(client.csr)
注意这⾥的common name 可以是客户端标识
openssl req -new -key client.key -out client.csr
4、生成私有CA签名的客户端证书(client.crt)
openssl x509 -req -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -out client.crt
5、因为我们这个客户端是 window 的浏览器,windows上安装的证书需要pfx格式,也叫p12格式,生成方式如下
如果你的客户端是一个程序,client.crt 就可以满足
为了保护私钥不被未经授权的用户访问,OpenSSL 要求你为私钥设置一个密码。这个密码在 PKCS#12 文件被打开以访问私钥时会被要求输入。你可以和前面的 ca.key一个密码,也可以单独再设置一个密码
openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx
6、最后的文件如下
6.2、设置双向认证
1、在服务端Nginx的配置文件ssl.conf里面做配置即可,别忘记把ca.crt文件挂载
ssl_client_certificate /etc/nginx/conf.d/ssl/ca.crt;
ssl_verify_client on;
2、访问 https://192.168.173.129/
你会发现,服务器已经开始校验你的证书了,告诉你不行
这里如果你请求 http://192.168.173.129/ 还是可以访问,因为http是 80,没有开启ssl,所以你如果想限制的话,按照我前面说的,在ssl.conf配置 80 转 443,即访问 http 自动跳转 https
3、配置客户端证书,我们需要将证书导入到浏览器中才能访问,打开chrome浏览器,找到:设置->隐私设置和安全性->安全->管理证书:
4、然后将准备好的证书client.pfx导入到浏览器中,导入成功后关闭浏览器然后再重启,重新访问刚才的的https://+服务器IP,就会提示:
5、后面我换成 火狐的,因为chrome 在写博客,可能证书上传需要重启浏览器
6、需要设置你之前设置的密码 不是ca.key的密码欧~,是你将client.crt转为client.pfx文件时候设置的密码
7、输入密码后
8、再次访问
参考文章:
- 基于Nginx的https单向认证和双向认证(自制证书生成+详细配置)
- 自建CA并生成自签名SSL证书