腾讯云部署https请求

因为苹果公司要求所有的API接口都必须要https的,所以没办法只能升级一下。现在阿里和腾讯的证书都还不错。这里记录一下腾讯云部署HTTPS的整个过程期间遇到了很多问题。在这里非常感谢 54powerman 博客专家的帮助。前面会有些概念的东西,不感兴趣的可以不看,后面讲述整个过程。

什么是https?

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

区别

HTTPS和HTTP的区别

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

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

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

四、http的连接很简单,是无状态的;HTTP

https的工作原理是什么

     HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握 手过程中将确立双方加密传输数据的密码信息,通常情况下会配合数字证书实现。

TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用 非对称加密对称加密以及HASH算法

这里我们先看看这上面提到的几种技术(如果你对这些技术已经非常了解,那么请跳过该段落,直接到段落三)

  1. 数字证书

        数字证书是一种权威性的电子文档,由权威公正的第三方机构,即CA中心签发的证书。它以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性。 使用了数字证书,即使您发送的信息在网上被他人截获,甚至您丢失了个人的账户、密码等信息,仍可以保证您的账户、资金安全。 

     它能提供在Internet上进行身份验证的一种权威性电子文档,人们可以在互联网交往中用它来证明自己的身份和识别对方的身份。当然在数字证书认证的过程中证书认证中心(CA)作为权威的、公正的、可信赖的第三方,其作用是至关重要的.如何判断数字认证中心公正第三方的地位是权威可信的。VeriSign、GeoTrust、Thawte 是国际权威数字证书颁发认证机构的“三巨头”,其中,应用最广的为VerSign签发的电子商务数字证书。

CER(Canonical Encoding Rules,规范编码格式) 是数字证书的一种编码格式,它是BER(Basic Encoding Rules 基本编码格式) 的一个变种,比BER 规定得更严格。后缀的证书文件有两种编码:

DER(Distinguished Encoding Rule 卓越编码格式) 同样是BER的一个变种,DER使用定长模式。

PKCS(Public-Key Cryptography Standards,公钥加密标准) 由RSA实验室和其他安全系统开发商为公钥密码的发展而制定的一系列标准。

pfx是指以pkcs#12格式存储的证书和相应私钥。 

在Security编程中,有几种典型的密码交换信息文件格式: 
DER-encoded certificate: .cer, .crt 
PEM-encoded message: .pem 
PKCS#12 Personal Information Exchange: .pfx, .p12 
PKCS#10 Certification Request: .p10 .csr
PKCS#7 cert request response: .p7r 
PKCS#7 binary message: .p7b .p7c .spc

cer/.crt 是用于存放证书,它是2进制形式存放

pem 跟crt/cer的区别是它以Ascii来表示

pfx/p12 用于存放个人证书/私钥,他通常包含保护密码,2进制方式 

p10 .csr 是证书请求 

p7r是CA对证书请求的回复,只用于导入 

p7b .p7c .spc 以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥

 

 

  1. 非对称加密算法

          1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是"公开密钥系统"。相对于"对称加密算法"这种方法也叫做"非对称加密算法"。与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

       非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要,但加密和解密花费时间长、速度慢,它不适合于对文件加密而只适用于对少量数据进行加密。 经典的非对称加密算法如RSA算法等安全性都相当高. 非对称加密的典型应用是数字签名。采用双钥密码系统的加密方法,在一个过程中使用两个密钥,一个用于加密,另一个用于解密,这种加密方法称为非对称加密,也称为公钥加密,因为其中一个密钥是公开的(另一个则需要保密)。

DH (Diffie-Hellman)
       Diffie-Hellman算法(D-H算法),密钥一致协议。是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想。简单的说就是允许两名用户在公开媒体上交换信息以生成"一致"的、可以共享的密钥。换句话说,就是由甲方产出一对密钥(公钥、私钥),乙方依照甲方公钥产生乙方密钥对(公钥、私钥)。以此为基线,作为数据传输保密基础,同时双方使用同一种对称加密算法构建本地密钥(SecretKey)对数据加密。这样,在互通了本地密钥(SecretKey)算法后,甲乙双方公开自己的公钥,使用对方的公钥和刚才产生的私钥加密数据,同时可以使用对方的公钥和自己的私钥对数据解密。不单单是甲乙双方两方,可以扩展为多方共享数据通讯,这样就完成了网络交互数据的安全通讯!该算法源于中国的同余定理——中国馀数定理。

RSA
       RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

EL Gamal
         EL Gamal算法是公钥密码体制中的一种 ,在密码学中占有重要的地位。但该算法所采用的幂剩余计算耗时太多的问题 ,一直是制约其广泛应用的瓶颈问题。提出一种通过建表 ,以及对传统二进制算法进行改进 ,即将指数进行 2 k进制化 ,减少原 BR算法迭代次数 ,提高加密解密速度的算法。

ECC 
ECC (Elliptical Curve Cryptography,椭圆曲线加密)算法不椭圆曲线理论为基础,在创建密钥时可以更快,更小,并且更有效,它是用大质数的积来产生。

目前Java 6公提供了DH和RSA两种算法实现,通过Bouncy Castle可以实现Elmal算法支持,另ECC加密算法,目前没有开源组件提支持

  1. 对称加密算法

        对加密和解密使用相同密钥的加密算法。由于其速度,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。对称式数据加密的方式的工作原理如图。所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥实际上是一种算法,通信发送方使用这种算法加密数据,接收方再以同样的算法解密数据。因此对称式加密本身不是安全的。常用的对称加密有: 

DES、IDEA、RC2、RC4、SKIPJACK算法等 。

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

 

  1. HASH算法

常用的摘要算法包括MD5,SHA1,SHA256

消息摘要算法的特点:

① 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。
② 消息摘要看起来是“随机的”。这些比特看上去是胡乱的杂凑在一起的。
③ 一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。
④ 消息摘要函数是无陷门的单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息。
⑤ 好的摘要算法,无法找到两条消息,是它们的摘要相同。

 

消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。消息摘要采用单向Hash 函数将需加密 的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致 。这样这串摘要便可成为验证明文是否是"真身"的"指纹"了。


       HASH函数的抗冲突性使得如果一段明文稍有变化,哪怕只更改该段落的一个字母,通过哈希算法作用后都将产生不同的值。而HASH算法的单向性使得要找到到哈希值相同的两个不 同的输入消息,在计算上是不可能的。所以数据的哈希值,即消息摘要,可以检验数据的完整性。哈希函数的这种对不同的输入能够生成不同的值的特性使得无法找到两个具有相同哈希值的输入。因此,如果两个文档经哈希转换后成为相同的值,就可以肯定它们是同一文档。 所以,当希望有效地比较两个数据块时,就可以比较它们的哈希值。例如,可以通过比较邮件发送前和发送后的哈希值来验证该邮件在传递时是否修改


      消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在 密钥的管理与分发问题,适合于分布式网络相同上使用。由于其加密计算的工作量相当可观,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是 用不可逆加密算法加密的。

这里是分割线-----------------------------------------------------------------------------------------------------------------------------------------------

SSL证书申请

证书:

  1. 用JDK自带的keytool工具生成证书,可以用任意一台安装jdk的主机生成证书,无需申请,坏处是生成的证书没有通过认证,浏览器访问时,会出现不可信证书提醒,生成过程参考:http://lixor.iteye.com/blog/1532655

2、在第三方申请证书,国内外大多证书颁发单位都是收费的,也有部分是首年免费,本文档演示的是在腾讯云DV SSL 域名型证书申请,首年免费,其他颁发单位参考:Let's Encrypt、StartSSL、COMODO PositiveSSL、CloudFlare SSL、Wosign沃通SSL等。

腾讯云证书申请过程

1、登录腾讯云,选择SSL证书管理(https://console.qcloud.com/ssl)


证书列表

2、点击申请证书


申请证书

3、填写证书信息


填写资料

填写资料

注:
3.1 通用名称为需要配置https协议访问服务的域名
3.2 证书备注名随便填,方便记忆即可
3.3 私钥密码填写后必须留存,配置tomcat时需要用到

4、域名身份验证,第一种是手动DNS验证,这种方式需要用户在域名上解析一条腾讯云制定的二级域名,由于映射方式CNAME方式万网不提供,所以如果域名是在腾讯云上管理的可以采用这种方式,如果不是建议采用第二种文件验证


选择验证方式

5、文件验证
以下是官方提供的文件验证方法:
https://www.qcloud.com/document/product/400/4142#3.-.E6.96.87.E4.BB.B6.E9.AA.8C.E8.AF.81


文件验证
注意:

5.1 以tomcat为例,上诉的意思可以在Tomcat/webapp/Root文件夹下创建/.well-known/pki-validation文件目录,创建文件flieauth.htm,文件的内容是:根据证书详情中提供填写。


5.2 WINDOWS操作系统手动是无法创建.开头的文件夹,需要切换到DOS下,使用命令创建;
> md .well-known
5.3 windows server默认创建文本时隐藏了后缀名,所以最好是在本地创建好文件(确定文件后缀名是.htm)再放到服务器上;
5.4 配置好之后启动tomcat,访问路径,查看是否操作成功(tomcat中conf/server.xml入口端口需改成80);
5.5 配置成功后会腾讯云会自动进行验证,验证通过后会有短信提醒,时间大概是几分钟。
6、证书成功申请后,下载下来,将其中tomcat的证书解压到tomcat/conf目录下;
7、证书成功申请后,在证书管理列表中点击颁发进行证书颁发;
8、证书成功申请后,点击分配项目,分配到默认项目。

四、Tomcat配置

1、经过上述步骤我们已经得到了所需要的证书,将证书.jks文件放到tomcat/conf目录下

证书信息
2、打开conf/server.xml文件进行编辑

2.1 配置80端口节点修改如下
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" />
2.2 在80端口配置节点下添加如下配置

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
<Certificate certificateKeystoreFile="conf/www.abc.com.jks" certificateKeyAlias="www.abc.com"
            certificateKeystorePassword="sunrise2017"
                         type="RSA" />
        </SSLHostConfig>
</Connector>

注:certificateKeystoreFile是证书.jks文件的保存位置,此处是conf目录,如果是其他地址请填写完整目录;certificateKeyAlias是证书别名,建议放访问域名;certificateKeystorePassword是证书密码,在证书申请时填写保存的(很重要)。

2.3 修改

<Connector port="8009" protocol="AJP/1.3" redirectPort="443" />

2.4 修改后启动tomcat,以https协议通过443端口访问tomcat资源,如果正常访问,则配置成功

3、80端口到https端口的自动映射

上述配置完成之后80端口和443端口是单独访问的,为了让用户在访问80端口时自动跳转443端口,需要修改conf/web.xml文件,打开文件在倒数第二行添加如下代码即可:

<security-constraint>
    <web-resource-collection >
              <web-resource-name >SSL</web-resource-name>
              <url-pattern>/*</url-pattern>
       </web-resource-collection>                             
       <user-data-constraint>
       <transport-guarantee>CONFIDENTIAL</transport-guarantee>
       </user-data-constraint>
</security-constraint>
4、重启tomcat配置完成

特别注意:
1.此处配置的域名必须完成备案,否则80端口无法访问(如果没有备案,在申请证书验证的时候就无法通过,验证需要通过域名的80端口访问);
2.此处申请的证书绑定的是www顶级域名,亲测配置完成后二级域名也可使用https访问,但是会提示证书不安全,如有需要建议单独申请

如果你运气好,按照上面的方法可以成功。但是我并没有成功,找了很多问题。后来听上面的大神说 用nginx配证书 反代Tomcat试试,Tomcat证书不标准,自己一转搞不好转坏。然后再其他群里也有人说tomcat配置后启动成功,但是https还是不能访问。后来就转向了nginx配置。

nginx下载真是一波三折。遇到了SSL问题,make问题,pcre问题。后来还有各种问题,各种东西需要下载。最后听大神说用yum一行代码搞定。yum install openssl-devel nginx 

配置文件在/etc/nginx  日志在/usr/log/nginx

下载完成之后/etc/nginx/conf.d这个目录直接创建一个文件,名称就用你的域名吧。其它配置不需要改

server
{
        listen 443;
        server_name love.91lovelove.cn;
        ssl on;
        ssl_certificate 1_love.91lovelove.cn_bundle.crt;
        ssl_certificate_key 2_love.91lovelove.cn.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect   off;
            proxy_set_header Host $host;  
            proxy_set_header X-Real-IP $remote_addr;  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
            proxy_set_header X-Forwarded-Proto $scheme;  
    }
}
注意自己的配置文件和路径问题

配置文件参数说明
listen 443SSL访问端口号为443
ssl on启用SSL功能
ssl_certificate证书文件
ssl_certificate_key私钥文件
ssl_protocols使用的协议
ssl_ciphers配置加密套件,写法遵循openssl标准

 使用全站加密,http自动跳转https(可选)

对于用户不知道网站可以进行https访问的情况下,让服务器自动把http的请求重定向到https。
在服务器这边的话配置的话,可以在页面里加js脚本,也可以在后端程序里写重定向,当然也可以在web服务器来实现跳转。Nginx是支持rewrite的(只要在编译的时候没有去掉pcre)
在http的server里增加rewrite ^(.*) https://$host$1 permanent;
这样就可以实现80进来的请求,重定向为https了。

这里启动nginx;service nginx restart
如果异常
 nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
nginx: configuration file /etc/nginx/nginx.conf test failed 
default.conf里,把下面的两行:
    listen       80 default_server;
    listen       [::]:80 default_server;
改为:
    listen       80;
OK再次启动试试。如果成功了,用https访问应该就OK了。没问题。当然开发中的问题肯定不止这些,会有一些比较特殊的问题。我也是慢慢解决了。所以一定要静下心来,一步一步突破困难。


展开阅读全文

没有更多推荐了,返回首页