目录
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.****.net/download/ruby_matlab/10138057
PDF下载: