目录
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:WindowsSystem32driversetchosts,添加下列“本机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
ginx-1.10.2>start nginx
D:DTLDownLoads
ginx-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下载: