PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证
文章目录
- Openssl
- 操系统默认的CA证书的公钥位置
- Nginx Https 自签证书
- Nginx Https 使用CA签发证书
- 客户端使用自签证书供服务端验证
- 客户端使用 根证书 签发客户端证书 供服务端验证
Openssl
https://www.openssl.net.cn/
openssl是一个功能丰富且自包含的开源安全工具箱。
它提供的主要功能有:
- SSL协议实现(包括SSLv2、SSLv3和TLSv1)
- 大量软算法(对称/非对称/摘要)
- 大数运算
- 非对称算法密钥生成
- ASN.1编解码库
- 证书请求(PKCS10)编解码
- 数字证书编解码
- CRL编解码
- OCSP协议
- 数字证书验证
- PKCS7标准实现
- PKCS12个人数字证书格式实现等功能
openssl采用C语言作为开发语言,这使得它具有优秀的跨平台性能。openssl支持Linux、UNIX、windows、Mac等平台。openssl目前最新的版本是0.9.8e.
操系统默认的CA证书的公钥位置
centos 下 被信任的证书在此文件中
/etc/pki/t1s/cert$/ca-bunde.crt
Nginx Https 自签证书
创建和配置 Nginx 使用 HTTPS 自签名证书的步骤如下:
- 生成自签名证书和私钥:
openssl genrsa -out server.key 2048
- 该命令生成一个 RSA 密钥对,并将私钥保存到
server.key
文件中。参数2048
指定了密钥长度为 2048 位。
openssl req -x509 -new -nodes -key server.key -subj "/CN=artisan.com" -days 10000 -out server.crt
- 这个命令生成一个自签名的 X.509 证书。解释如下:
-x509
:表示生成自签名证书。-new
:创建一个新的证书请求。-nodes
:不加密生成的私钥。-key server.key
:指定使用之前生成的私钥文件server.key
。-subj "/CN=yandun.com"
:指定证书的主题(Subject)。在这里,/CN=yandun.com
表示通用名称(Common Name)为yandun.com
。-days 10000
:指定证书的有效期为 10000 天。-out server.crt
:将生成的证书保存到server.crt
文件中。
openssl x509 -in server.crt -noout -text
- 该命令用于查看生成的证书的详细信息,包括主题、颁发者、有效期等。解释如下:
-in server.crt
:指定要查看的证书文件。-noout
:不打印证书内容到标准输出。-text
:以文本形式显示证书内容。
这些命令可以用来生成自签名的证书并查看证书的详细信息。
-
配置 Nginx 使用 HTTPS:
编辑 Nginx 的配置文件(通常位于
/etc/nginx/nginx.conf
或/etc/nginx/sites-available/default
),并确保以下配置项已经添加或更新:
server {
.....
.....
ss1 on;
ss1_certificate /cert/server.crt;
ss1_certificate_key /cert/server.key;
#ss1_client_certificate /cert/client.crt;
#ssI_verify_client on;
ss1_session_cache shared:ssL:1m;
ss1_session_timeout 10m;
ss1_ciphers HIGH:!aNULL:!MD5;
ss1_prefer_server_ciphers on;
.....
.....
}
每个指令的含义如下:
-
ss1 on;
:- 启用 SSL/TLS 加密。这表示流模块将使用 SSL/TLS 加密来保护与客户端的通信。
-
ss1_certificate /cert/server.crt;
:- 指定用于 SSL/TLS 加密的服务器证书文件路径。在这里,
/cert/server.crt
是服务器证书的路径。
- 指定用于 SSL/TLS 加密的服务器证书文件路径。在这里,
-
ss1_certificate_key /cert/server.key;
:- 指定用于 SSL/TLS 加密的服务器私钥文件路径。在这里,
/cert/server.key
是服务器私钥的路径。
- 指定用于 SSL/TLS 加密的服务器私钥文件路径。在这里,
-
#ss1_client_certificate /cert/client.crt;
:- 用于指定客户端证书的文件路径。这是可选的,如果您希望服务器验证客户端的证书,则取消注释并指定客户端证书的路径。
-
#ss1_verify_client on;
:- 用于指定是否验证客户端证书。取消注释并设置为
on
可以启用客户端证书验证。
- 用于指定是否验证客户端证书。取消注释并设置为
-
ss1_session_cache shared:ssL:1m;
:- 指定用于缓存 SSL/TLS 会话的共享内存区域名称和大小。在这里,会话缓存名称为
ssL
,大小为 1MB。
- 指定用于缓存 SSL/TLS 会话的共享内存区域名称和大小。在这里,会话缓存名称为
-
ss1_session_timeout 10m;
:- 指定 SSL/TLS 会话的超时时间。在这里,会话超时时间为 10 分钟。
-
ss1_ciphers HIGH:!aNULL:!MD5;
:- 指定 SSL/TLS 加密算法的优先级和允许使用的加密套件。在这里,使用了
HIGH
表示使用高强度加密算法,同时禁用了一些不安全的加密套件,如NULL
和MD5
。
- 指定 SSL/TLS 加密算法的优先级和允许使用的加密套件。在这里,使用了
-
ss1_prefer_server_ciphers on;
:- 指定是否优先使用服务器端提供的加密套件。设置为
on
表示优先使用服务器端提供的加密套件。
- 指定是否优先使用服务器端提供的加密套件。设置为
这些指令配置了 Nginx 流模块的 SSL/TLS 加密功能,包括了服务器证书、私钥、会话缓存等参数。
-
重启 Nginx 服务:
完成配置后,通过以下命令重启 Nginx 服务,以使更改生效:
sudo systemctl restart nginx
现在,Nginx 应该已经配置为使用自签名证书进行 HTTPS 加密通信。请确保防火墙已正确配置以允许流量通过 HTTPS 端口(默认为 443)。