Linux 笔记 - 第二十二章 Nginx 配置 SSL
一、前言
基础知识
1.1 公钥密码体制(public-key cryptography)
公钥密码体制分为三个部分,公钥、私钥、加密解密算法,它的加密解密过程如下:
加密:通过加密算法和公钥对内容(或者说明文)进行加密,得到密文。加密过程需要用到公钥。
解密:通过解密算法和私钥对密文进行解密,得到明文。解密过程需要用到解密算法和私钥。注意,由公钥加密的内容,只能由私钥进行解密,也就是说,由公钥加密的内容,如果不知道私钥,是无法解密的。
公钥密码体制的公钥和算法都是公开的(这是为什么叫公钥密码体制的原因),私钥是保密的。大家都以使用公钥进行加密,但是只有私钥的持有者才能解密。在实际的使用中,有需要的人会生成一对公钥和私钥,把公钥发布出去给别人使用,自己保留私钥。
1.2 对称加密算法(symmetric key algorithms)
在对称加密算法中,加密使用的密钥和解密使用的密钥是相同的。也就是说,加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道,不能对外公开。这个和上面的公钥密码体制有所不同,公钥密码体制中加密是用公钥,解密使用私钥,而对称加密算法中,加密和解密都是使用同一个密钥,不区分公钥和私钥。密钥,一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。前面在公钥密码体制中说到的公钥、私钥就是密钥,公钥是加密使用的密钥,私钥是解密使用的密钥。
1.3 非对称加密算法(asymmetric key algorithms)
在非对称加密算法中,加密使用的密钥和解密使用的密钥是不相同的。前面所说的公钥密码体制就是一种非对称加密算法,他的公钥和是私钥是不能相同的,也就是说加密使用的密钥和解密使用的密钥不同,因此它是一个非对称加密算法。
1.4 RSA简介
RSA 是一种公钥密码体制,现在使用得很广泛。如果对 RSA 本身有兴趣的,可以查询 RSA 相关的具体介绍。
RSA 密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。由公钥加密的内容可以并且只能由私钥进行解密,并且由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA 的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。
1.5 签名和加密
我们说加密,是指对某个内容加密,加密后的内容还可以通过解密进行还原。 比如我们把一封邮件进行加密,加密后的内容在网络上进行传输,接收者在收到后,通过解密可以还原邮件的真实内容。
这里主要解释一下签名,签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过,怎么样可以达到这个效果呢?一般是对信息做一个 hash 计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过 hash 值得出原来的信息内容。在把信息发送出去时,把这个 hash 值加密后做为一个签名和信息一起发出去。 接收方在收到信息后,会重新计算信息的 hash 值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里 hash 计算可以保证不同的内容一定会得到不同的 hash 值,所以只要内容一被修改,根据信息内容计算的 hash 值就会变化。当然,不怀好意的人也可以修改信息内容的同时也修改hash值,从而让它们可以相匹配,为了防止这种情况,hash 值一般都会加密后(也就是签名)再和信息一起发送,以保证这个 hash 值不被修改。
HTTPS 的通信过程
HTTPS 是 HTTP 的安全版本,它可以通过 SSL / TLS 连接保护在线传输的任何通信。简而言之,HTTPS=HTTP+SSL。如果想要建立 HTTPS 连接,则首先必须从受信任的证书颁发机构(CA)Gworg 机构注册 SSL证书。安装 SSL 证书后,网站地址栏 HTTP 后面就会多一个 "S",还有绿色安全锁标志。
SSL(Secure Sockets Layer,安全套接字层)协议,及其继任者 TLS(Transport Layer Security,传输层安全)协议,是为网络通信提供安全及数据完整性的一种安全协议。
1)浏览器发送一个 HTTPS 的请求给服务器;
2)服务器要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥;
3)服务器会把公钥传输给客户端;
4)客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
5)客户端把加密后的随机字符串传输给服务器;
6)服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
7)服务器把加密后的数据传输给客户端;
8)客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
9)客户机和服务器都知道了对称密钥,并用它来加密会话期间的最终用户。
二、自己生成 SSL 证书
如果准备给 Nginx 安装 SSL 证书,默认情况下,SSL 模块是不被编译的,需要在编译 Nginx 时使用 --with-http_ssl_module 参数,而该编译模块需要 OpenSSL 库文件,一般需要安装 openssl 与 openssl-devel 软件。
# cd /usr/local/src/nginx-1.12.2
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
# make
# make install
2.1 生成带密码私钥 key
进入到 nginx.conf 所在的目录,源码安装后,该文件目录为 /usr/local/nginx/conf,如果是 yum安装,该文件目录为 /etc/nginx,进入目录后,创建 ssl_cert 目录,在该目录中生成相应的密钥,如下:
[root@masternode /]# cd /etc/nginx
[root@masternode nginx]# mkdir ssl_cert
[root@masternode nginx]# cd ssl_cert
[root@masternode ssl_cert]# pwd
/etc/nginx/ssl_cert
[root@masternode ssl_cert]# openssl genrsa -des3 -out tmp.key
Generating RSA private key, bit long modulus
..............+++
............................................................+++
e is (0x10001)
Enter pass phrase for tmp.key:
Verifying - Enter pass phrase for tmp.key:
[root@masternode ssl_cert]# ls -l
total
-rw-r--r-- root root Sep : tmp.key
生成私钥文件时需要输入密码,每次用浏览器访问 HTTPS 都需要输入密钥是不现实的,需要转换私钥,取消密码,如下步骤。
2.2 转换成无密码私钥 key
[root@masternode ssl_cert]# openssl rsa -in tmp.key -out moonxy.key
Enter pass phrase for tmp.key:
writing RSA key
[root@masternode ssl_cert]# ls -l
total
-rw-r--r-- root root Sep : moonxy.key
-rw-r--r-- root root Sep : tmp.key
[root@masternode ssl_cert]# rm -f tmp.key
[root@masternode ssl_cert]# ls -l
total
-rw-r--r-- root root Sep : moonxy.key
将带密码的 tmp.key 删除,只保留无密码的 moonxy.key 私钥。
2.3 生成证书请求文件
[root@masternode ssl_cert]# openssl req -new -key moonxy.key -out moonxy.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name ( letter code) [XX]:CN
State or Province Name (full name) []:HongKong
Locality Name (eg, city) [Default City]:HongKong
Organization Name (eg, company) [Default Company Ltd]:moonxy
Organizational Unit Name (eg, section) []:Linux
Common Name (eg, your name or your server's hostname) []:masternode
Email Address []:moonxy@qq.com Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:amxx
[root@masternode ssl_cert]# ls -l
total
-rw-r--r-- root root Sep : moonxy.csr
-rw-r--r-- root root Sep : moonxy.key
生成证书请求文件 moonxy.csr 后,我们将拿它和私钥 moonxy.key 文件一起生成最终的证书文件,也就是公钥。
2.4 生成公钥证书文件
[root@masternode ssl_cert]# openssl x509 -req -days -in moonxy.csr -signkey moonxy.key -out moonxy.crt
Signature ok
subject=/C=CN/ST=HongKong/L=HongKong/O=moonxy/OU=Linux/CN=masternode/emailAddress=moonxy@qq.com
Getting Private key
[root@masternode ssl_cert]# ls -l
total
-rw-r--r-- root root Sep : moonxy.crt
-rw-r--r-- root root Sep : moonxy.csr
-rw-r--r-- root root Sep : moonxy.key
这样最终生成了 CRT 证书文件 moonxy.crt,也就是上面提到的公钥。
三、Nginx 配置 SSL
在 /etc/nginx/vhost(如果是编译安装,通常为 /usr/local/nginx/conf/vhost)目录下创建新的配置文件 ssl.conf,并添加如下内容:
[root@masternode vhost]# vim /etc/nginx/vhost/ssl.conf
server {
listen ;
server_name moonxy.com;
index index.html index.php;
root /data/www/nginx/moonxy; ssl on;
ssl_certificate ssl_cert/moonxy.crt;
ssl_certificate_key ssl_cert/moonxy.key;
ssl_protocols TLSv1 TLSv1. TLSv1.;
}
然后检查配置文件语法,创建 index.html 并启动 nginx 服务,如下:
[root@masternode vhost]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@masternode vhost]# mkdir -p /data/www/nginx/moonxy
[root@masternode vhost]# vim /data/www/nginx/moonxy/index.html
This is SSL test for moonxy.com
[root@masternode vhost]# systemctl start nginx
[root@masternode vhost]# ps aux |grep nginx
root 0.0 0.2 ? Ss : : nginx: master process /usr/sbin/nginx
nginx 0.0 0.3 ? S : : nginx: worker process
root 0.0 0.0 pts/ R+ : : grep --color=auto nginx
然后在本地 hosts 文件中配置域名映射:
C:\Windows\System32\drivers\etc
192.168.150.140 www.moonxy.com moonxy.com
使用 Chrome 浏览器访问 https://moonxy.com,如下:
点击"高级",继续访问,如下所示:
点击"不安全",可以看到连接不安全的提示:
点击 "证书",可以看到我们自己的制作的证书根目录不受信任,CA(Certification Authority)机构是指颁发数字证书的机构,CA 证书则是由 CA 机构颁发的数字证书,如下:
如果我们信任该证书的根颁发机构,我们就可以将其添加到 "受信任的根证书颁发机构"列表中,这样浏览器以后就会信任该证书 。
下面我们通过阿里云申请受信的证书。
四、通过阿里云申请证书
可以通过阿里云申请免费的赛门铁克(Sysmantec)SSL 证书,注意右侧显示的购置费用为 0.00,如下:
申请完毕之后,点击右侧下载,如下:
解压之后,上传这两个文件到 ssl_cert 目录,其中 key 文件为私钥,pem 文件为公钥证书,如下:
部署方式与上面的相同,只需要修改 /etc/nginx/vhost/ssl.conf 中这两个参数为新的文件名称为:
ssl_certificate ssl_cert/2841973_moonxy.com.pem;
ssl_certificate_key ssl_cert/2841973_moonxy.com.key;
重启 nginx 之后访问,发现直接显示的是小绿锁,不会有风险提示,表示连接是安全的,浏览器信任该证书,如下:
综上可以看书,只有受信任的机构颁发的证书,才能被浏览器厂商所认可。
Linux 笔记 - 第二十二章 Nginx 配置 SSL的更多相关文章
- 第二十二章 Nginx性能优化
一.性能优化概述 1.我们需要了解 1.首先需要了解我们当前系统的结构和瓶颈,了解当前使用的是什么,运行的是什么业务,都有哪些服务,了解每个服务最大能支撑多少并发.比如nginx作为静态资源服务并发是 ...
- Linux 笔记 - 第二十四章 配置 Tomcat
一.前言 Tomcat 是 Apache 软件基金会(Apache Software Foundation)Jakarta 项目中的核心项目,由 Apache.Sun 和其他一些公司及个人共同开发.使 ...
- Linux 笔记 - 第十二章 Shell 脚本
博客地址:http://www.moonxy.com 一.前言 常见的编程语言分为两类:一类是编译型语言,如:C.C++ 和 Java等,它们远行前要经过编译器的编译.另一类是解释型语言,不需要编译, ...
- 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记
第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...
- 第二十二章 跳出循环-shift参数左移-函数的使用 随堂笔记
第二十二章 跳出循环-shift参数左移-函数的使用 本节所讲内容: 22.1 跳出循环 22.2 Shift参数左移指令 22.3 函数的使用 22.4 实战-自动备份mysql数据库和nginx服 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...
- 第二十二章 Django会话与表单验证
第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...
- Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验
Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...
- Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
随机推荐
- Android Activity之间的数据传递
1.向目标Activity传递数据: Intent intent=new Intent(this,Main2Activity.class); //可传递多种类型的数据 intent.putExtra( ...
- 1021--RemoveOutermostParentheses
public class RemoveOutermostParentheses { /* 解法一:栈,( 进栈,) 出栈,栈为空时,则找到原语,然后去括号. */ public String remo ...
- ios webview
//#pragma mark - UIWebView Delegate Methods -(void)webViewDidFinishLoad:(UIWebView *)webView{ //获取到w ...
- BERT安装与使用
环境: python 3.5 tensorflow 1.12.1 bert-serving-server 1.9.1 bert-serving-cline 1.9.1 官网上说要保证Python &g ...
- Win10更新后wireshark无法获取网络接口
一不小心win10自动更新了,打开wireshark发现它无法发现本地的网络接口. 其实解决的办法很简单,就是卸载npcap,安装Win10Pcap即可解决.
- Ansible 相关介绍
相关视频http://v.xue.taobao.com/learn.htm?spm=a220o.1000855.0.0.24c748e6QMQV0e&courseId=111848 Ansib ...
- win10系统易升更新不成功c盘也满了,解决方法
删除临时更新文件: 1)同时按下Windows键和R键,打开运行,输入services.msc 2)找到WindowsUpdate服务项,右键选择禁用. 3)打开c:\windows\Software ...
- VIJOS-P1232 核电站问题
VIJOS-P1232 核电站问题 JDOJ 1373 https://neooj.com/oldoj/problem.php?id=1373 题目描述 一个核电站有N个放核物质的坑, ...
- Nacos 解读:服务发现客户端
Nacos是阿里巴巴的微服务开源项目,用于服务发现和配置管理,开源以来我就一直关注,在此准备以几篇文章来窥其全貌,但大段大段贴代码就没必要了,这里用自己的一些理解和总结来帮助大家理解.文章将基于截止目 ...
- VNC远程登陆树莓派3(包括开机启动)
在树莓派上安装VNC需要使用命令行.如果需要远程操作安装VNC,就必须通过SSH登录到命令行界面(Raspbian的默认用户名是:pi,默认密码是:raspberry). 安装 命令行输入: sudo ...