基于OpenSSL的https的Nginx反向代理

  • 使用openssl实现 --》先安装openssl
  • 单向验证
  • 1. 产生不带密码保护的私钥
  • 2. 产生构造证书请求
  • 3. 自签发根CA证书
  • 4. 在后面遇到了报错,https访问不成功,解决办法
  • 5. 修改nginx配置文件,开启https访问
  • 6. 重启nginx
  • 7. 测试
  • 双向验证
  • 1. 制作根证书
  • 2. 制作服务端证书
  • 3. 制作客户端证书 (跟制作服务端证书步骤一样)
  • 4. 将ca证书追加到 /etc/pki/tls/certs/ca-bundle.crt
  • 5. 配置nginx
  • 6.本地浏览器导入p12格式的证书
  • 7. 测试


使用openssl实现 --》先安装openssl

yum install openssl -y

单向验证

1. 产生不带密码保护的私钥

openssl genrsa -out nginx.key 1024

2. 产生构造证书请求

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

3. 自签发根CA证书

根CA的证书是自己签发的,通过x509命令进行自签发:
 openssl x509 -req -in nginx.csr -signkey nginx.key -out nginx.pem

4. 在后面遇到了报错,https访问不成功,解决办法

(可以先跳过这一步,报错了再回来,不然你不知道为什么)

  • 将签发该证书的私有CA公钥cacert.pem文件内容(本人生成的是nginx.pem),追加到/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
  • 或者:cd /etc/pki/tls/certs/ cp ca-bundle.crt ca-bundle.crt.bk --》先备份 cat /usr/local/sczoupeng99/conf/https/nginx.pem >> ca-bundle.crt

5. 修改nginx配置文件,开启https访问

......
......
#定义一个负载均衡器,名字scapp
    upstream scapp{
        server  192.168.2.152;
        server  192.168.2.153;
        }
......
......
# HTTPS server
        #
        server {
            listen       443 ssl;
            server_name  localhost;

            ssl_certificate      /usr/local/sczoupeng99/conf/https/nginx.pem;
            ssl_certificate_key  /usr/local/sczoupeng99/conf/https/nginx.key;

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

            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers  on;

            location / {
                root   html;
                index  index.html index.htm;
            }
        }

6. 重启nginx

nginx -s reload

7. 测试

curl https://192.168.76.129 浏览器测试

双向验证

1. 制作根证书

  • 生成CA私钥:ca.key
    (这个是信任的起点,根证书,所有其他的证书都要经过CA的私钥签名)
    openssl genrsa -des3 -out ca.key 2048
  • 生成 CA根证书的公钥:ca.crt
    openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

2. 制作服务端证书

  • 生成证服务端书私钥:server.pem
    openssl genrsa -des3 -out server.pem 1024
  • 生成无密码的服务端私钥:server.key
    openssl rsa -in server.pem -out server.key
  • 生成服务端签发请求:server.csr
    openssl req -new -key server.pem -out server.csr
  • 最后用CA证书给服务端证书进行签名
    openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
  • 把ca.crt的内容追加到server.crt后面,因为有些浏览似乎不支持
    cat ca.crt >> server.crt

3. 制作客户端证书 (跟制作服务端证书步骤一样)

  • 生成客户端证书私钥
    openssl genrsa -des3 -out client.pem 2048
  • 生成客户端证书签发请求
    openssl req -new -key client.pem -out client-req.csr
  • 用CA证书给客户端证书进行签名
    openssl x509 -req -sha256 -in client-req.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out client.crt
  • 客户端证书CRT转换为PKCS
    #12格式(全称应该叫做 Personal Information Exchange,通常以 p12作为后缀) --》浏览器用的
    openssl pkcs12 -export -clcerts -in client.crt -inkey client.pem -out zoup.p12

4. 将ca证书追加到 /etc/pki/tls/certs/ca-bundle.crt

(前面提到过的报错解决方法)

  • cd /etc/pki/tls/certs/
  • cp ca-bundle.crt ca-bundle.crt.bk
  • cat /usr/local/sczoupeng99/conf/https/server.crt >> ca-bundle.crt

5. 配置nginx

......
......
#定义一个负载均衡器,名字scapp
    upstream scapp{
        server  192.168.2.152;
        server  192.168.2.153;
        }
......
......
# HTTPS server
    
    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      /usr/local/sczoupeng99/conf/https/server.crt;
        ssl_certificate_key  /usr/local/sczoupeng99/conf/https/server.key;

        ssl_verify_client on; #开启客户端给验证        
        ssl_client_certificate /usr/local/sczoupeng99/conf/https/ca.crt;  #CA证书用于验证客户端证书的合法性
        ssl_verify_depth 1;

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

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            proxy_pass http://zpapp;
        }
    }

6.本地浏览器导入p12格式的证书

将第三步中生成的客户端证书 zp.p12 传入本地机器并导入浏览器
浏览器–》设置–》安全/隐私–》证书管理–》导入–》个人

7. 测试

验证双向认证是否成功
浏览器访问