因为CA收费,因此能够自建CA,经过将CA导入浏览器实现https的效果,曾经12306购票就须要自行导入网站证书。php
2015年阿里巴巴将旗下淘宝、天猫(包括移动客户端)全站启用HTTPS加密,并顺利经过“双十一”考验,成为全球最大的电商平台全站HTTPS改造案例。html
全站HTTPS须要解决3大问题。mysql
首先是性能,主要分三点:linux
其次,兼容性及周边:web
最后,为保证上线时的顺利切换,须要提早准备大量的预案,以应对各类可能出现的状况。算法
目前为止,国内大部分主流网站都已经完成了HTTP到HTTPS的迁移,如淘宝、京东、百度、B站、优酷等,仍在使用HTTP的有腾讯视频、爱奇艺、当当等网站。sql
如下先简介https与加密原理chrome
HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上经过传输加密和身份认证保证了传输过程的安全性。
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通讯提供安全及数据完整性的一种安全协议。数据库
HTTPS 在HTTP 的基础上加入SSL 层,以SSL加密技术为安全基础。 HTTPS 与HTTP的默认端口不一样,并存在一个加密/身份验证层(在 HTTP与 TCP 之间,即应用层与传输层之间)。apache
SSL协议可分为两层:
搭建https的流程主要与SSL握手协议有关。
HTTP协议传输的数据都是未加密的,也就是明文的,所以使用HTTP协议传输隐私信息很是不安全,为了保证这些隐私数据能加密传输,因而网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。
简单来讲,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。
HTTPS和HTTP的区别主要以下:
一、https协议须要到CA(Certificate Authority 即颁发数字证书的机构)申请证书,通常免费证书较少,于是须要必定费用。
二、http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议。
三、http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。
四、http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
采用单钥密码系统的加密方法,同一个密钥能够同时用做信息的加密和解密,也称为单密钥加密。
举例:凯撒密码
凯撒密码是罗马扩张时期朱利斯• 凯撒(Julius Caesar)创造的,用于加密经过信使传递的做战命令。它将字母表中的字母移动必定位置而实现加密。例如若是向右移动 2 位,则 字母 A 将变为 C,字母 B 将变为 D,…,字母 X 变成 Z,字母 Y 则变为 A,字母 Z 变为 B。
优势:
算法公开、计算量小、加密速度快、加密效率高。
缺点:
若是一方的秘钥被泄露,加密信息也就不安全了。
非对称加密算法须要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。
公钥与私钥是一对,若是用公钥对数据进行加密,只有用对应的私钥才能解密,相反,也能够先用私钥加密,再使用公钥解密。由于加密和解密使用的是两个不一样的密钥,因此这种算法叫做非对称加密算法。
非对称加密算法实现机密信息交换的基本过程是:
甲方生成一对密钥并将公钥公开,须要向甲方发送信息的其余角色(乙方)使用该密钥(甲方的公钥)对机密信息进行加密后再发送给甲方;甲方再用本身私钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用本身的私钥来进行解密。
优势:
一方密钥的丢失不会致使通讯被破解,相对更安全。
缺点:
加密和解密花费时间长、速度慢,只适合对少许数据进行加密。
模拟一个通讯场景:
有A、B、C、D四个用户,A想让B、C、D与本身进行私密通讯。
若是使用对称加密,则A-B、A-C、A-D之间分别须要协商一份密钥。
若是使用非对称加密,则只须要A保留私钥,将本身的公钥分发给B、C、D。
不管B、C、D哪一方使用公钥加密消息,都只有A才能用私钥解密。
安全性考虑:
通讯前须要提早协商密钥。
使用对称加密
A与其余用户协商密钥的消息,若是被抓包截获,就很容易受到“中间人攻击”,即通讯数据被攻击者侦测或掉包。
使用非对称加密
A一样须要与其余用户协商密钥,A须要构造一对公私钥,将公钥发送给B、C、D,本身保留私钥。
此时,若A发送给B、C、D的消息被黑客E截获,E就能够保留A的公钥,而后构造一对新的公私钥,将私钥保留,本身的公钥发给B、C、D。
按照非对称加密,E就成了通讯的中间人:
B、C、D使用E的公钥加密数据并发送给A,E劫持通讯数据后,使用本身的私钥解密数据,再使用A的公钥加密数据发送给A。
对于用户A、B、C、D而言,他们并不知道本身的通讯对于中间人而言是曝光的。
怎样才能使通讯安全:
利用非对称加密来确认双方身份创建链接,即SSL握手。
此时须要引入一个公信机构F,用于为用户证实身份,不然在当前通讯环境中,我的是没法为本身证实身份的。
这个机构即是CA。
CA本身有一对公私钥,公钥公开给全部用户,私钥本身保留。
当A想要向B证实本身时,只须要先请求CA给本身的消息用CA私钥加密一下(签名),再把消息发送给B,若是B用CA的公钥能解密,说明这条消息是被CA认证过的,没有被其余人篡改过。
此时中间人攻击就再也不奏效,由于即使截获了A发送给B的数据,中间人也只能用CA的公钥解密出消息内容——“这是一条被CA认证过,由A发送给B的数据”。但中间人没法对消息内容进行篡改,由于B只会用CA的公钥去验证这条消息是否被CA认证过,中间人用本身的私钥加密的数据,B用CA的公钥没法解开。
安全证书CA的权力是巨大的,曾经发生的CNNIC证书事件,CNNIC做为受信任的根CA,若是它愿意,它能够随便伪造国内外任何站点的SSL证书,配合防火墙DNS污染,它能够在国内发起对任何网站的中间人攻击、截获通讯数据。
再考虑对称加密:
就对称加密而言,公信机构没法达到认证效果。 由于对称加密只有一个密钥,一旦公开任何人均可以对加密信息进行篡改。
以上是对称加密与非对称加密使用时比较大的区别,对称加密只能两两之间,而非对称加密既能够用本身的私钥加密数据,告诉拥有公钥的人这条消息是我发的,也可让拥有公钥的人放心发送数据,由于只有拥有私钥的人才能解密数据。
考虑通讯效率:
若是须要频繁通讯,每次通讯都使用非对称加密须要花费较多的时间。
对称加密与非对称加密各自拥有优势,二者结合才能更好的发挥做用。
在实际使用中,是使用非对称加密创建链接,经过非对称加密的安全链接协商一个用于对称加密的密钥。
因为协商密钥的过程是安全的,因此协商的密钥不会再被篡改,以后就可使用该密钥进行后续对称加密的快速通讯。
如下介绍https的实际流程:
实验环境:
检查OpenSSL,若是版本低于1.0.1f 建议升级,由于1.0.1f版本之下的OpenSSL有一个Heartbleed漏洞。
版本查看:$openssl version
版本更新:$sudo yum update openssl
首先创建myCA目录用于存放自建CA的相关信息:
cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA
myCA用于存放 CA 根证书,证书数据库,以及后续服务器生成的证书,密钥以及请求。
signedcerts保存签名证书的 copy,private包含私钥。
以后配置myCA相关参数,在myCA目录下进行:
echo '01'>serial && touch index.txt
而后建立 caconfig.cnf 文件(自建CA的配置文件):
vim ~/myCA/caconfig.cnf
caconfig.cnf文件内容以下:
# My sample caconfig.cnf file. # # Default configuration to use when one is not provided on the command line. # [ ca ] default_ca = local_ca # # # Default location of directories and files needed to generate certificates. # [ local_ca ] dir = /home/<username>/myCA certificate = $dir/cacert.pem database = $dir/index.txt new_certs_dir = $dir/signedcerts private_key = $dir/private/cakey.pem serial = $dir/serial # # # Default expiration and encryption policies for certificates. # default_crl_days = 365 default_days = 1825 default_md = SHA256 # policy = local_ca_policy x509_extensions = local_ca_extensions # # # Default policy to use when generating server certificates. The following # fields must be defined in the server certificate. # [ local_ca_policy ] commonName = supplied stateOrProvinceName = supplied countryName = supplied emailAddress = supplied organizationName = supplied organizationalUnitName = supplied # # # x509 extensions to use when generating server certificates. # [ local_ca_extensions ] subjectAltName = DNS:localhost basicConstraints = CA:false nsCertType = server # # # The default root certificate generation policy. # [ req ] default_bits = 2048 default_keyfile = /home/<username>/myCA/private/cakey.pem default_md = SHA256 # prompt = no distinguished_name = root_ca_distinguished_name x509_extensions = root_ca_extensions # # # Root Certificate Authority distinguished name. Change these fields to match # your local environment! # [ root_ca_distinguished_name ] commonName = MyOwn Root Certificate Authority # CA机构名 stateOrProvinceName = JS # CA所在省份 countryName = CN # CA所在国家(仅限2个字符) emailAddress = XXXX@XXX.com # 邮箱 organizationName = XXX # organizationalUnitName = XXX # # [ root_ca_extensions ] basicConstraints = CA:true
其中dir和default_keyfile的路径须要改为本身的username
生成 CA 根证书和密钥:
export OPENSSL_CONF=~/myCA/caconfig.cnf #该命令用于给环境变量 OPENSSL_CONF 赋值为caconfig.cnf。 openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825 # 生成 CA 根证书和密钥
该步骤须要用户设置一个密码,请牢记。
以上步骤生成了 CA 自签名根证书,和 RSA 公/私密钥对,证书的格式是 PEM,有效期是1825天。
/myCA/cacert.pem: CA 根证书
/myCA/private/cakey.pem: CA 私钥
生成服务器配置文件exampleserver.cnf:
vim ~/myCA/exampleserver.cnf
exampleserver.cnf文件内容以下:
# # exampleserver.cnf # [ req ] prompt = no distinguished_name = server_distinguished_name [ server_distinguished_name ] commonName = localhost # 服务器域名 stateOrProvinceName = JS # 服务器所在省份 countryName = CN # 服务器所在国家(仅限2个字符) emailAddress = XXXX@XXX.com # 邮箱 organizationName = XXX # organizationalUnitName = XXX #
生成服务器证书和密钥:
export OPENSSL_CONF=~/myCA/exampleserver.cnf # 该命令设置环境变量 OPENSSL_CONF,使得 openssl 更换配置文件。 openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
一样的,须要设置密码。
以后,有2种对临时密钥的操做,选择其一便可:
1.将临时私钥转换为 unencrypted key,即密钥不加密状态:
penssl rsa -in tempkey.pem -out server_key.pem
须要输入密码短语。
2.若是但愿将 key 保持为加密状态,直接更名:
mv tempkey.pem server_key.pem
二者的区别是,第二种须要在服务器启动时输入私钥的密码,不然会致使服务器启动失败,但第二种安全性高于第一种,能够更好的保护密钥。
使用 CA key 对服务器证书签名:
export OPENSSL_CONF=~/myCA/caconfig.cnf openssl ca -in tempreq.pem -out server_crt.pem
删除临时证书和密钥:
rm -f tempkey.pem && rm -f tempreq.pem
如今,自签名的服务器证书和密钥对便产生了:
如下经过LAMP搭建一个网站进行验证
第一步:安装Apache服务程序(apache服务的软件包名称叫作httpd)
yum install httpd -y
第二步: 将Apache服务添加到开机自启中
systemctl start httpd systemctl enable httpd
第三步:打开浏览器 测试 127.0.0.1,能够看到默认主页
httpd主要目录:
安装php72w须要配置额外的yum源,不然会报错不能找到相关软件包。
php高版本的yum源地址,有两部分,其中一部分是epel-release,另一部分来自webtatic,若是跳过epel-release安装webtatic的时候会有错误。
安装须要的命令是:
rpm -Uvh https://dl.Fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
也能够选择下面的这个命令,是同样的效果:
yum install epel-release -y rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
为了防止CentOS上面发生php冲突,因此,这个命令仍是先执行一下更好些:
yum -y remove php*
事实上,这里面的对应扩展库不少,必定要注意的有cli和fpm这两个包,其它的相关包看须要:
yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-mysql
因为后面要用MySQL,因此mysql包也是须要的。
比较全的版本:
yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-pdo php72w-xml
在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了须要,仍是要在系统中安装MySQL,并且安装完成以后能够直接覆盖掉MariaDB。
网络环境容许的话直接安装:
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm yum -y install mysql-community-server
mysql-community-server较大若是下载很慢,能够到国内镜像源下载:
http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/
下载后解压到图中文件目录下:
注意文件权限,再安装:
yum -y install mysql57-community-release-el7-10.noarch.rpm yum -y install mysql-community-server
mysql有初始默认密码,使用如下命令查找:
grep "password" /var/log/mysqld.log
输入初始密码,此时不能作任何事情,由于MySQL默认必须修改密码以后才能操做数据库。
修改密码:
mysql -uroot -p ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
新密码设置的时候若是设置的过于简单会报错, 缘由是由于MySQL有密码设置的规范,具体是与validate_password_policy的值有关,能够先尝试大小写加下划线的长密码。
MySQL完整的初始密码规则查看
SHOW VARIABLES LIKE 'validate_password%';
能够经过以下命令修改:
mysql> set global validate_password.policy=0; mysql> set global validate_password.length=1;
以后能够从新设置简单密码。
ssl须要如下模块:
修改ssl.conf:
cd /etc/httpd/conf.d sudo vim ssl.conf
修改DocumentRoot到本身的网页目录,并更改证书密钥来源为自建CA:
将须要的网站文件夹复制到/var/www/html/目录下
修改/etc/httpd/conf/httpd.conf文件中的网站文件名:
建立本身网站须要的数据库:
create database myzoo; use myzoo; create table Person(PersonID int primary key auto_increment, Password varchar(100),Salt varchar(100),Username varchar(100),Token varchar(100),Zoobars int default 10, Profile varchar(5000));
重启httpd查看当前网页:
setenforce 0 sudo systemctl restart httpd
先关闭selinux,否则会报错,服务启动前会验证以前设置的证书密码(网站的那个,不是CA的)。
目前是普通的http链接,由于并无将自建CA导入浏览器。
因为网站的证书是自建CA签名的,浏览器并不信任,因此须要手动导入CA证书。
以chrome为例:设置->高级->隐私设置和安全性->管理证书
能够查看证书详细信息和导入自建CA证书
由于以前配置网站证书时设置的域名是localhost,因此须要经过localhost域名进行https链接,不能使用127.0.0.1。
地址栏访问状态出现一把绿色的锁,成功搭建https。