代码改变世界

Nginx集群之SSL证书的WebApi微服务

2017-12-01 08:57  夜雨瞳  阅读(2197)  评论(1编辑  收藏  举报

目录

1       大概思路... 1

2       Nginx集群之SSL证书的WebApi微服务... 1

3       HTTP与HTTPS(SSL协议)... 1

4       Openssl生成SSL证书... 2

5       编写.NET WebApi 3

6       部署WebApi到局域网内3台PC机... 5

7       Nginx集群配置搭建... 6

8       运行结果... 8

9       总结... 9

1       大概思路

l  Nginx集群之SSL证书的WebApi微服务

l  HTTP与HTTPS(SSL协议)

l  Openssl生成SSL证书

l  编写.NET WebApi

l  部署WebApi到局域网内3台PC机

l  Nginx集群配置搭建

l  运行结果

l  总结

2       Nginx集群之SSL证书的WebApi微服务

Nginx集群是.NET WebApi提供了负载均衡的其中一种实现方式,同时还增加了SSL认证,能够确保WebApi能够以加密形式进行响应。Nginx使用其中的SSL模块,能够支持HTTPS的配置,当然也能够让HTTP与HTTPS并存(只需要增加listen 80监听端口则可),本文主要实现HTTP访问则跳转至以HTTPS方式。

以下是本文讲述的主要结构图:

客户端访问Nginx的域名zhyongfeng.com,然后Nginx进行负载均衡,返回https的响应。Nginx集群之SSL证书的WepApi微服务架构,如下图所示:

 

3       HTTP与HTTPS(SSL协议)

HTTP(HyperText Transfer Protocol)超文本传输协议是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。

HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议:它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息,它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。

 

HTTPS和HTTP的区别:

l  https协议需要到ca申请证书,一般免费证书很少,需要交费。

l  http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

l  http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。

l  http的连接很简单,是无状态的。

l  HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。

 

4       Openssl生成SSL证书

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

本文安装了Visualbox虚拟机,内装了Linux Ubuntu系统,所以使用内置的openssl,具体生成SSL证书命令行如下:

(Windows下可以到https://www.openssl.org/source/下载,使用ActivePerl安装Openssl):

自行颁发不受浏览器信任的SSL证书,先生成一个RSA密钥

zhyongfeng@zhyongfeng-VirtualBox:~$ openssl genrsa -des3 -out server.key 1024

拷贝一个不需要输入密码的密钥文件

zhyongfeng@zhyongfeng-VirtualBox:~$ openssl rsa -in server.key -out server_nopass.key

生成一个证书请求,会提示输入省份、城市、域名信息等,重要的是,email一定要是你的域名后缀的。这样就有一个 csr 文件了,提交给 ssl 提供商的时候就是这个 csr 文件。

zhyongfeng@zhyongfeng-VirtualBox:~$ openssl req -new -key server.key -out server.csr

自己签发证书

zhyongfeng@zhyongfeng-VirtualBox:~$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out

如下图所示:

5       编写.NET WebApi

UserController.cs

using System.Net;
using System.Web.Http;

namespace SSLWebApi.Controllers
{
    [RoutePrefix("api/User")]
    public class UserController : ApiController
    {
        /// <summary>
        /// 获取当前用户信息
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("PostMessage")]
        public string PostMessage([FromBody]string msg)
        {
            return string.Format("当前输入的消息是:{0}", msg);
        }

        [Route("GetMachine")]
        public string GetMachine()
        {
            string AddressIP = string.Empty;
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                {
                    AddressIP = _IPAddress.ToString();
                }
            }
            return string.Format("当前系统的IP是:{0}", AddressIP);
        }
    }
}

安装Microsoft.AspNet.WebApi.HelpPage

注册HelpPage页面:

Global.asax

using System.Web.Http;
using System.Web.Mvc;

namespace SSLWebApi
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            //注册HelpPage页面
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }
}

 编译后如下:

 

6       部署WebApi到局域网内3台PC机

将WebApi部署到以下10.92.202.56的3台PC机

 

7       Nginx集群配置搭建

通过自主义域名zhyongfeng.com:80端口进行负载均衡集群访问,则访问C:\Windows\System32\drivers\etc\hosts,添加下列“本机IP 自定义的域名”:

10.93.85.66     zhyongfeng.com

Nginx的localhost配置如下:

worker_processes  1; 
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # HTTPS server
    server {
        listen       443 ssl;
        server_name  localhost;
        ssl_certificate      server.crt;
        ssl_certificate_key  server_nopass.key;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

Nginx的集群配置:

#user  nobody;
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    #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;
    #    }
    #}

    upstream zhyongfeng.com {
        server    10.92.202.56:560;
        server    10.92.202.57:570; 
        server    10.92.202.58:580;
    }
    server {
        listen       80;
        server_name  zhyongfeng.com;
        rewrite ^(.*)$  https://$host$1 permanent;
    }
    # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  zhyongfeng.com;
        ssl_certificate      server.crt;
        ssl_certificate_key  server_nopass.key;
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
        location / {
            proxy_pass   http://zhyongfeng.com;
        }
    }
}

运行CMD:

D:\DTLDownLoads\nginx-1.10.2>start nginx

D:\DTLDownLoads\nginx-1.10.2>nginx -s reload 

8       运行结果

Nginx的localhost配置运行结果:

Nginx的集群配置运行结果:

 

9       总结

Nginx使用SSL模块可以支持WebApi的https访问,增加了访问的安全性。SSL模块,具体可以参考Nginx中文文档http://www.nginx.cn/doc/的SSL*模块。WebApi基于SSL协议数据传输的加密, 保证了通信的安全性。SSL的功能包含了建立服务器与客户之间安全的数据通道、服务器对客户的身份认证(如公钥、私钥)等。

 

源代码下载:

http://download.csdn.net/download/ruby_matlab/10138057

 

PDF下载:

Nginx集群之SSL证书的WebApi微服务.pdf