NGINX使用OpenSSL自签证书实现HTTPS安全访问-完整版

自己折腾了很久, 网上的教程都不是很全, 特意整理记录 --> 2024-04-28

  • 环境:centos 8 stream
  • 自签证书仅限测试环境和本地测试HTTPS使用, 生产环境请申请证书

安装NGINX

nginx官网

https://nginx.org/

选择你自己需要的版本, 我们这里使用最新版
可以下载本地上传或者直接服务器下载
在这里插入图片描述
在这里插入图片描述
下载完成后上传至服务器/nginx目录或者直接在服务器下载
先安装通用开发包

yum groupinstall "Development Tools"
#安装完成后
cd nginx/
#直接在服务器下载命令
#wget https://nginx.org/download/nginx-1.26.0.tar.gz
tar -zxvf nginx-1.26.0.tar.gz 
cd nginx-1.26.0/
#prefix设置nginx安装路径 并且开启http和https模块支持
./configure --prefix=/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
#安装完成后启动nginx
/nginx/sbin/nginx
#删除多余安装包
rm -rf nginx-1.26.0*

启动后访问http://IP 如果端口被占用 修改/nginx/conf/nginx.conf中http模块的监听端口
在这里插入图片描述

安装OpenSSL

#修改为你自己的目录
mkdir -p /www/server/openssl
cd /www/server/openssl
wget http://www.openssl.org/source/openssl-1.0.0a.tar.gz
tar zxvf openssl-1.0.0a.tar.gz
cd openssl-1.0.0a
#设置openssl的安装路径
./config –prefix=/www/server/openssl
make && make install

注意有可能会报pod2man的错, 删除就行, 没报错就跳过

#删除pod2man
ll /usr/bin/pod2man 
rm -f /usr/bin/pod2man 
make && make install

生成ca自签证书

mkdir -p /nginx/ssl
cd /nginx/ssl/
1. 生成根证书的私钥
首先,您需要为根证书生成一个私钥。这通常是一个RSA或EC私钥。
* 注意 centos8 秘钥长度低于2048位会报错 
openssl genpkey -algorithm RSA -out root_private_key.pem -pkeyopt rsa_keygen_bits:4096
2. 创建根证书的CSR和自签名证书
接下来,使用根证书的私钥生成一个证书签名请求(CSR),并自签名该CSR以生成根证书。
其中CN=My Root CA 可以修改为你需要的根域名
# 创建根证书的CSR  
openssl req -new -key root_private_key.pem -out root_csr.pem -subj "/C=US/ST=California/L=San Francisco/O=My Root CA/CN=My Root CA"
在下面的命令中,-extensions v3_ca 指示 OpenSSL 使用名为 v3_ca 的扩展配置。
需要创建一个包含这些扩展的配置文件,并在其中定义 v3_ca 段落
可以写在服务器证书配置的openssl.cnf文件中, 下面为了好区分所以分开写:
vim v3_ca
#添加下面文本
[v3_ca]  
basicConstraints = CA:TRUE  
keyUsage = keyCertSign, cRLSign
#保存后运行下面命令生成根证书
# 自签名根证书的CSR以生成根证书  
openssl x509 -req -days 3650 -in root_csr.pem -signkey root_private_key.pem -out root_certificate.pem -extensions v3_ca
3. 生成服务器证书的私钥
现在,需要为服务器证书生成一个单独的私钥。
openssl genpkey -algorithm RSA -out server_private_key.pem -pkeyopt rsa_keygen_bits:2048
4. 创建服务器证书的CSR
使用服务器证书的私钥生成一个CSR。
将CN=100.70.84.6修改为你自己的域名或IP
如果这里填写的IP/域名和 你服务器访问的IP/域名不匹配,证书始终无效
openssl req -new -key server_private_key.pem -out server_csr.pem -subj "/C=US/ST=California/L=San Francisco/O=My Company/CN=100.70.84.6"
5. 使用根证书签发服务器证书
最后,使用根证书和根证书的私钥签发服务器证书的CSR,以生成最终的服务器证书。
在下面的命令中,-extensions v3_req -extfile openssl.cnf 指示 OpenSSL 使用配置文件
(如 openssl.cnf)中定义的 v3_req 段落来添加v3扩展。您需要在配置文件中定义这些扩展,例如:
vim openssl.cnf
#添加以下内容
[v3_req]  
keyUsage = digitalSignature, keyEncipherment  
extendedKeyUsage = serverAuth  
subjectAltName = @alt_names  
#服务器使用的域名和服务器IP
[alt_names]  
DNS.1 = feng.com  
DNS.2 = www.feng.com
DNS.2 = *.feng.com
DNS.2 = 100.70.84.6
IP.1 = 100.70.84.6
#保存后生成服务器证书
openssl x509 -req -in server_csr.pem -CA root_certificate.pem -CAkey root_private_key.pem -CAcreateserial -out server_certificate.pem -days 3650 -extensions v3_req -extfile openssl.cnf

6. 验证证书
最后,您可以验证生成的根证书和服务器证书。
# 验证根证书  
openssl x509 -in root_certificate.pem -text -noout  
  
# 验证服务器证书  
openssl x509 -in server_certificate.pem -text -noout
请注意,这只是一个基本的示例,用于生成根证书和基于该根证书的服务器证书。
在实际应用中,可能需要根据您的具体需求和环境进行更多的配置和调整。
特别是,您需要确保您的私钥得到妥善保管,不要将其泄露给未经授权的人员。

配置nginx

vim /nginx/conf/nginx.conf
#在http标签中添加https模块

server {
    listen       443 ssl;
    server_name  100.70.84.6 feng.com www.feng.com;

    ssl_certificate      /nginx/ssl/server_certificate.pem;
    ssl_certificate_key  /nginx/ssl/server_private_key.pem;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_protocols TLSv1.2 TLSv1.3;
    
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        #proxy_pass http://100.70.84.6:20157;
        root   html;
        index  index.html index.htm;
    }
}

完整配置如下:

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    #gzip  on;
	# HTTP server
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }


    # HTTPS server
    server {
        listen       443 ssl;
        server_name  100.70.84.6 feng.com www.feng.com;
		#生成的ssl证书
        ssl_certificate      /nginx/ssl/server_certificate.pem;
        #证书秘钥
        ssl_certificate_key  /nginx/ssl/server_private_key.pem;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

		ssl_protocols TLSv1.2 TLSv1.3;
        
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        location / {
            #proxy_pass http://100.70.84.6:20157;
			root   html;
            index  index.html index.htm;
        }
    }
}
重载nginx
/nginx/sbin/nginx -s reload
常用nginx命令
启动
/nginx/sbin/nginx
重载配置
/nginx/sbin/nginx -s reload
停止nginx
/nginx/sbin/nginx -s stop

本地安装证书

由于自签证书不是可信任的CA机构签发, 所以需要手动安装
*注意安装的是根证书root_certificate.pem , 不是服务器使用的server_certificate.pem
正式生产环境可以在阿里云或腾讯云免费申请证书使用
生产nginx配置https也是一样的,跳过openssl生成自签证书即可

点击不安全标签
点击证书无效

查看证书信息,这里的颁发者就是我们上面生成的 root_certificate.pem 根证书

CA

从服务器下载根证书进行安装.
注意不是服务器的证书, 因为服务器证书中不包含根证书信息
所以就算导出证书安装后也是一样无法正常使用
将root_certificate.pem转换为Windows可以识别的crt文件
cd /nginx/ssl
cp root_certificate.pem 100.70.84.6.crt
将证书保存本地
保存后Win+R打开窗口输入certlm.msc

在这里插入图片描述
点击受信任的根证书颁发机构–>证书
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

选择从服务器下载的证书文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

导入成功后, 关闭浏览器再重新访问服务器
可以看到https访问已经没问题了

在这里插入图片描述

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值