zoukankan      html  css  js  c++  java
  • 将nginx上运行的http访问的网站改造成https访问

    参考地址:原文:https://www.cnblogs.com/Faquir/p/10867984.html

    感谢这位大佬。

    1. 背景

    我有个用于数据展示的网站使用nginx对外提供http访问,另外一个系统用超链接的方式跳转到我的网站提供给终端用户访问。后来对方说他们的站点是https访问的,不能直接访问http,所以需要我支持https访问。

    所以这里仅限于展示类网站的参考,交互式网站我也不会。

    ***对nginx的了解仅限于可以通过配置文件完成网站访问的配置,其他没有深入理解。***

    2. 预备知识

    https:

    HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 

    简单来讲就是网站中嵌入证书,用户通过浏览器和网站服务器交互时数据会被加密,保证安全。

    证书体系:

    树状结构,可能有多层证书办法机构,最顶层的叫根证书机构,持有根证书私钥,可以签发下一级证书,每个机构或者人使用的证书由证书颁发机构颁发,简单来讲就是用颁发机构的私钥,对证书人的个人信息、公钥等诸多信息做数字签名,对外宣称这个证书由他证明。证书可以公开访问以验证持有者身份,由颁发机构背书,证书对应私钥由持有人持有,不对外公开,用于解密他人通过证书中公钥加密的私密消息。

    有点类似于公安机构对于身份证的颁发,全国总上层有一个公安部,负责所有省级公安厅的管理,省级负责市级,...,最终由派出所给个人颁发身份证,我们拿着身份证就可以对外证明自己的身份,因为有派出所的背书,而派出所又有上级、上上级一直到公安部的背书。不同的是我们的身份证里并没有证书包含的那么多消息。

    备注:证书依赖于公钥加密体制,公钥密码体系包含公钥、私钥两把密钥,公钥用户加密、验签,私钥用于解密、签名。

    3. 操作过程

    3.1 证书生成

    主要过程是:根证书 -->服务器证书,这里的服务器证书指的是我上面所提到需要添加https访问的网站服务器,

    1. 生成根证书私钥、生成根证书请求、创建自签发根证书,(红色部分根据需要修改)

    #生成根证书私钥
    openssl genrsa -out root.key 2048
     
    #生成根证书请求
    openssl req -new -key root.key -out root.csr
     
    #用根证书私钥自签生成根证书
    openssl x509 -req -in root.csr -extensions v3_ca -signkey root.key -out root.crt
    

      

    这里根证书私钥自签证书的原因是,证书的格式都是一致的,需要有证书颁发签发,因为根证书颁发机构没有上级,所以根证书颁发机构给自己签发证书,因此有需要大家都信任他。

    2. 生成服务器证书私钥、生成服务器证书请求、使用根证书私钥签发服务器证书,这里注意此服务器证书的commonName需要设置成nginx配置文件中的server_name,保持一致。

    #生成服务器证书私钥
    openssl genrsa -out server.key 2048
     
    #生成服务器证书请求
    openssl  req -new -key server.key  -out server.csr
     
    #生成服务器证书
    openssl x509 -days 365 -req -in server.csr -extensions v3_req -CAkey root.key -CA root.crt -CAcreateserial -out server.crt -extfile openssl.cnf
    

      

    这里有个openssl.cnf文件需要注意,里面描述了需要颁发的服务器证书的一些信息,内容如下,根据需要修改红色内容(看不懂的不用管

    [req]
    distinguished_name = req_distinguished_name
    req_extensions = v3_req
    
    [req_distinguished_name]
    countryName = CN
    countryName_default = CN
    stateOrProvinceName = Guangdong
    stateOrProvinceName_default = Guangdong
    localityName = Shenzhen
    localityName_default = Shenzhen
    organizationalUnitName  = xxx
    organizationalUnitName_default  = xxx
    commonName = xxx.com(对应签名说的nginx配置文件中的server_name)
    commonName_max  = 64
    
    [ v3_req ]
    # Extensions to add to a certificate request
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment

    3.2 nginx配置

    打开nginx配置中HTTPS server部分的注释,修改server_name、ssl_certificate、ssl_certificate_key、location中的root等字段。

    ... 
       # HTTPS server
        #
        server {
            listen       443 ssl;
            server_name  xxx.com(网址访问地址);
    
        ssl on;
            ssl_certificate      xxx.crt(服务器证书);
            ssl_certificate_key  xxx.key(服务器证书私钥);
    
            ssl_session_cache    shared:SSL:1m;
            ssl_session_timeout  5m;
    
            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers  on;
    
            location / {
                root   xxx(前端代码目录);
                index  index.html index.htm;
            }
        }
    ...
    

      

    启动nginx,即可对外提供服务了。

    3.3 浏览器访问

    到现在我们已经在服务器端配置了https访问,但是浏览器访问的时候会提示证书错误,因为浏览器现在还不认识我们的证书,不确定它是不是安全的。就像我们都拿着公安部颁发的身份证去证明身份没问题,但是你拿着自己颁发的一个身份证去证明别人就不一定会信了,因为没人知道你的颁发机构是什么情况。

    所以我们要把服务器证书的颁发机构,即我们上面生成的根证书添加到浏览器的信任列表中,具体操作方法:如果是windows系统,可以直接双击根证书文件,点击安装,安装到受信任的根证书颁发机构,这时候就可以顺利访问了。

    #user  nobody;
    worker_processes  16;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  120;
    
        #gzip  on;
    
        proxy_connect_timeout 120;
        proxy_read_timeout 120;
        proxy_send_timeout 120;
        proxy_buffer_size 128k;
        proxy_buffers 8 128k;
        proxy_busy_buffers_size 256k;
        proxy_temp_file_write_size 256k;
        proxy_temp_path /data/soft/nginx/temp_dir;
        limit_req_zone $binary_remote_addr zone=mylimit:10m rate=800r/s;	
    
        upstream HOST_dl { 
              #sticky;
              server 10.150.82.121:10082;
              server 10.150.82.123:10082;
    		  ip_hash;
        }
    	
        upstream HOST_im { 
              server 10.150.82.121:10083;
              server 10.150.82.123:10083;
        }
    	
    
        server {
            listen      10081;
            server_name  localhost;
            
            #charset GBK;
    
            #access_log  logs/host.access.log  main;
    		
    		
            location ^~/dl/ {
                return 301 https://$host:9000$request_uri;
            }
    
    
            location ^~/im {
                proxy_pass http://HOST_im;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host       $host:10081;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
            }
    
    
            #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   html;
            }
        }
    	
    	
    	server {
            listen      9000;
            server_name  localhost;
            
            #charset GBK;
    
            #access_log  logs/host.access.log  main;
    		
    		location / {
                root   html;
                index  index.html index.htm;
    			error_page 404 /dl-app/;
            }
    		
    		location ^~/api/{
    			rewrite ^/api/(.*)$ /dl/$1 break;
    			proxy_pass http://HOST_dl;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host       $host:10081;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                limit_req zone=mylimit burst=800;
           }
        }
    	
    	
    	server {
            listen       9001 ssl;
            server_name  localhost;
    
            ssl_certificate      ssl/root.crt;
            ssl_certificate_key  ssl/root.key;
    
            ssl_session_cache    shared:SSL:1m;
            ssl_session_timeout  5m;
    
            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers  on;
    
            location ^~/dl/ {
                proxy_pass http://HOST_dl;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host       $host:10081;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                limit_req zone=mylimit burst=800;
            }
    
    
            location ^~/im {
                proxy_pass http://HOST_im;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host       $host:10081;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
            }
    
    
            #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   html;
            }
        }
    	
    	
    	server {
            listen       9002 ssl;
            server_name  localhost;
    
            ssl_certificate      ssl/root.crt;
            ssl_certificate_key  ssl/root.key;
    
            ssl_session_cache    shared:SSL:1m;
            ssl_session_timeout  5m;
    
            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers  on;
            
            #charset GBK;
    
            #access_log  logs/host.access.log  main;
    		
    		location / {
                root   html;
                index  index.html index.htm;
    			error_page 404 /dl-app/;
            }
    		
    		location ^~/api/{
    			rewrite ^/api/(.*)$ /dl/$1 break;
    			proxy_pass http://HOST_dl;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host       $host:10081;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                limit_req zone=mylimit burst=800;
           }
           
        }
    }
    

      

  • 相关阅读:
    Qt程序使用Win32 API发送ZPL指令与斑马打印机通信
    Eclipse构建Maven项目
    编码风格 缩进和空白
    Linux下Tomcat重新启动
    linux下tomcat服务的相关命令
    第一天
    Day1NLP_机器翻译
    Day4_attention is all you need 论文阅读下篇
    Day_7tensorflow 实战
    Day5_python学习
  • 原文地址:https://www.cnblogs.com/xiangyuqi/p/11735368.html
Copyright © 2011-2022 走看看