参考:
https://baike.baidu.com/item/https/285356
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之间)。
也就是说它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询 [2]
HTTPS和HTTP的区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下四点:
一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
信任主机的问题
采用https的服务器必须从CA (Certificate Authority)申请一个用于证明服务器用途类型的证书。该证书只有用于对应的服务器的时候,客户端才信任此主机。所以所有的银行系统网站,关键部分应用都是https 的。客户通过信任该证书,从而信任了该主机。其实这样做效率很低,但是银行更侧重安全。这一点对局域网对内提供服务处的服务器没有任何意义。局域网中的服务器,采用的证书不管是自己发布的还是从公众的地方发布的,其客户端都是自己人,所以该局域网中的客户端也就肯定信任该服务器。
通讯过程中的数据的泄密和被篡改
1. 一般意义上的https,就是服务器有一个证书。
a) 主要目的是保证服务器就是他声称的服务器,这个跟第一点一样。
i. 具体讲,是客户端产生一个对称的密钥,通过服务器的证书来交换密钥,即一般意义上的握手过程。
ii. 接下来所有的信息往来就都是加密的。第三方即使截获,也没有任何意义,因为他没有密钥,当然篡改也就没有什么意义了。
2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书。
a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码,还有一个CA 认证过的身份。因为个人证书一般来说是别人无法模拟的,所有这样能够更深的确认自己的身份。
b) 目前大多数个人银行的专业版是这种做法,具体证书可能是拿U盘(即U盾)作为一个备份的载体。
CA 相关术语:
◆Issuer (证书的发布机构)
指出是什么机构发布的这个证书,也就是指明这个证书是哪个公司创建的(只是创建证书,不是指证书的使用者)。对于上面的这个证书来说,就是指"SecureTrust CA"这个机构。
◆Valid from , Valid to (证书的有效期)
也就是证书的有效时间,或者说证书的使用期限。 过了有效期限,证书就会作废,不能使用了。
◆Public key (公钥)
这个我们在前面介绍公钥密码体制时介绍过,公钥是用来对消息进行加密的,第2章的例子中经常用到的。这个数字证书的公钥是2048位的,它的值可以在图的中间的那个对话框中看得到,是很长的一串数字。
◆Subject (主题)
这个证书是发布给谁的,或者说证书的所有者,一般是某个人或者某个公司名称、机构的名称、公司网站的网址等。 对于这里的证书来说,证书的所有者是Trustwave这个公司。
◆Signature algorithm (签名所使用的算法)
就是指的这个数字证书的数字签名所使用的加密算法,这样就可以使用证书发布机构的证书里面的公钥,根据这个算法对指纹进行解密。指纹的加密结果就是数字签名(第1.5节中解释过数字签名)。
◆Thumbprint, Thumbprint algorithm (指纹以及指纹算法)
这个是用来保证证书的完整性的,也就是说确保证书没有被修改过,这东西的作用和2.7中说到的第3个问题类似。 其原理就是在发布证书时,发布者根据指纹算法(一个hash算法)计算整个证书的hash值(指纹)并和证书放在一起,使用者在打开证书时,自己也根据指纹算法计算一下证书的hash值(指纹),如果和刚开始的值对得上,就说明证书没有被修改过,因为证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。 注意,这个指纹会使用"SecureTrust CA"这个证书机构的私钥用签名算法(Signature algorithm)加密后和证书放在一起。
注意,为了保证安全,在证书的发布机构发布证书时,证书的指纹和指纹算法,都会加密后再和证书放到一起发布,以防有人修改指纹后伪造相应的数字证书。这里问题又来了,证书的指纹和指纹算法用什么加密呢?他们是用证书发布机构的私钥进行加密的。可以用证书发布机构的公钥对指纹和指纹算法解密,也就是说证书发布机构除了给别人发布证书外,他自己本身也有自己的证书。证书发布机构的证书是哪里来的呢???这个证书发布机构的数字证书(一般由他自己生成)在我们的操作系统刚安装好时(例如windows xp等操作系统),这些证书发布机构的数字证书就已经被微软(或者其它操作系统的开发机构)安装在操作系统中了,微软等公司会根据一些权威安全机构的评估选取一些信誉很好并且通过一定的安全认证的证书发布机构,把这些证书发布机构的证书默认就安装在操作系统里面了,并且设置为操作系统信任的数字证书。这些证书发布机构自己持有与他自己的数字证书对应的私钥,他会用这个私钥加密所有他发布的证书的指纹作为数字签名。
如何向证书的发布机构去申请证书
举个例子方便大家理解,假设我们公司"ABC Company"花了1000块钱,向一个证书发布机构"SecureTrust CA"为我们自己的公司"ABC Company"申请了一张证书,注意,这个证书发布机构"SecureTrust CA"是一个大家公认并被一些权威机构接受的证书发布机构,我们的操作系统里面已经安装了"SecureTrust CA"的证书。"SecureTrust CA"在给我们发布证书时,把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式写到证书里面,然后用一个指纹算法计算出这些数字证书内容的一个指纹,并把指纹和指纹算法用自己的私钥进行加密,然后和证书的内容一起发布,同时"SecureTrust CA"还会给一个我们公司"ABC Company"的私钥给到我们。我们花了1000块钱买的这个证书的内容如下:
×××××××××××××××证书内容开始×××××××××××××××××
Issuer : SecureTrust CA
Subject : ABC Company
Valid from : 某个日期
Valid to: 某个日期
Public Key : 一串很长的数字
…… 其它的一些证书内容……
{证书的指纹和计算指纹所使用的指纹算法}[SecureTrust CA的私钥|RSA] //这个就是"SecureTrust CA"对这个证书的一个数字签名,表示这个证书确实是他发布的,有什么问题他会负责(收了我们1000块,出了问题肯定要负责任的)
×××××××××××××××证书内容结束×××××××××××××××××
// {} 表示RSA加密后的内容,[ | ]表示用什么密钥和算法进行加密
我们"ABC Company"申请到这个证书后,我们把证书投入使用,我们在通信过程开始时会把证书发给对方,对方如何检查这个证书的确是合法的并且是我们"ABC Company"公司的证书呢?首先应用程序(对方通信用的程序,例如IE、OUTLook等)读取证书中的Issuer(发布机构)为"SecureTrust CA" ,然后会在操作系统中受信任的发布机构的证书中去找"SecureTrust CA"的证书,如果找不到,那说明证书的发布机构是个水货发布机构,证书可能有问题,程序会给出一个错误信息。 如果在系统中找到了"SecureTrust CA"的证书,那么应用程序就会从证书中取出"SecureTrust CA"的公钥,然后对我们"ABC Company"公司的证书里面的指纹和指纹算法用这个公钥进行解密,然后使用这个指纹算法计算"ABC Company"证书的指纹,将这个计算的指纹与放在证书中的指纹对比,如果一致,说明"ABC Company"的证书肯定没有被修改过并且证书是"SecureTrust CA" 发布的,证书中的公钥肯定是"ABC Company"的。对方然后就可以放心的使用这个公钥和我们"ABC Company"进行通信了。
到此我们已经大概了解https是什么?能做些什么?如何工作的?下面自己生成一个自己证书,然后开启https
方式一:使用keytool
keytool支持以下参数
C:\Program Files\Java\jdk1.8.0_171\bin>keytool
密钥和证书管理工具
命令:
-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令
使用 "keytool -command_name -help" 获取 command_name 的用法
C:\Program Files\Java\jdk1.8.0_171\bin>
生成JKS密钥库,并查看证书
C:\Program Files\Java\jdk1.8.0_171\bin>keytool -genkey -alias "tomcat_store" -keyalg "RSA" -keysize 2048 -validity 3650 -keypass "microstack_tomcat" -keystore "D:\tomcat_store.keystore" -storetype JKS -storepass "microstack_store" -dname "CN=Sleeber, OU=Hazelnuts, O=MicroStack, L=ChaoYang, ST=BeiJing, C=China"
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore D:\tomcat_store.keystore -destkeystore D:\tomcat_store.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
C:\Program Files\Java\jdk1.8.0_171\bin>keytool -importkeystore -srcalias "tomcat_store" -srckeystore D:\tomcat_store.keystore -srcstorepass "microstack_store" -srckeypass "microstack_tomcat" -destkeystore D:\tomcat_store.keystore -deststoretype pkcs12 -destkeypass "microstack_tomcat"
警告: PKCS12 密钥库不支持其他存储和密钥口令。正在忽略用户指定的-destkeypass值。
Warning:
已将 "D:\tomcat_store.keystore" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "D:\tomcat_store.keystore.old" 进行了备份。
C:\Program Files\Java\jdk1.8.0_171\bin>keytool -list -v -keystore "D:\tomcat_store.keystore" -storepass "microstack_store"
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: tomcat_store
创建日期: 2018-8-16
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=Sleeber, OU=Hazelnuts, O=MicroStack, L=ChaoYang, ST=BeiJing, C=China
发布者: CN=Sleeber, OU=Hazelnuts, O=MicroStack, L=ChaoYang, ST=BeiJing, C=China
序列号: 3df65df6
有效期为 Thu Aug 16 16:05:06 CST 2018 至 Sun Aug 13 16:05:06 CST 2028
证书指纹:
MD5: 7F:E5:D2:28:8F:E1:17:C1:CF:2B:4A:5B:40:44:3B:21
SHA1: BF:21:1E:30:61:1E:F5:B6:4F:9C:36:16:F1:03:A7:D5:26:3D:AD:77
SHA256: 1D:D8:99:0F:91:6D:0E:1C:19:4A:45:83:E6:4A:90:D6:C9:C9:3B:7C:C5:8E:55:E4:66:34:67:2E:F8:3A:0A:28
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: F7 04 54 5E 4D 7C 86 91 4E B1 27 EB 49 7F 6A A0 ..T^M...N.'.I.j.
0010: B1 A8 24 6A ..$j
]
]
*******************************************
*******************************************
C:\Program Files\Java\jdk1.8.0_171\bin>keytool -list -rfc -keystore "D:\tomcat_store.keystore" -storepass "microstack_store"
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: tomcat_store
创建日期: 2018-8-16
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
-----BEGIN CERTIFICATE-----
MIIDfzCCAmegAwIBAgIEPfZd9jANBgkqhkiG9w0BAQsFADBwMQ4wDAYDVQQGEwVD
aGluYTEQMA4GA1UECBMHQmVpSmluZzERMA8GA1UEBxMIQ2hhb1lhbmcxEzARBgNV
BAoTCk1pY3JvU3RhY2sxEjAQBgNVBAsTCUhhemVsbnV0czEQMA4GA1UEAxMHU2xl
ZWJlcjAeFw0xODA4MTYwODA1MDZaFw0yODA4MTMwODA1MDZaMHAxDjAMBgNVBAYT
BUNoaW5hMRAwDgYDVQQIEwdCZWlKaW5nMREwDwYDVQQHEwhDaGFvWWFuZzETMBEG
A1UEChMKTWljcm9TdGFjazESMBAGA1UECxMJSGF6ZWxudXRzMRAwDgYDVQQDEwdT
bGVlYmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5RR9u3EPSqsY
n85wAZbE+NnK7defcPU32JJTaQUZWl4z37qiE+/6Tj6sI6XR1IIW8Fid4nGrgIZA
AtHFg43kjSyu/nry0ZGt16gLLeUFc0uBSFBBHlGzTEaGPyE5RILd/acSvMstYFVf
hJNnENLjcAAqTiqtERIbWEn70R6EEBv+gpOpA81cs0MWo0tavbdc7mZpX+iNTG/i
3VJJBpgc+8iY8p/q9fIgDi3Ks4Bg8Ua51lrHpDpVPFOYyy0MlJapShok/HPJbmag
Wb7lNzZW9uVCVhY3Ixw0iEmARwpv/MhKcvkmpn1e7/E0Nr32T1YpfcwLMWb/XK5y
KphSf+kc4QIDAQABoyEwHzAdBgNVHQ4EFgQU9wRUXk18hpFOsSfrSX9qoLGoJGow
DQYJKoZIhvcNAQELBQADggEBABOnntJoq7fY/jbXuU+C4dy1sPEtnwxXSvWFE4RS
CqNonOVZOKBoHhNi3+v63lUojT4Gh7aaP6QFlrRIsnU5MS4aTJKZCPl67JFQrRmp
HROHu5XRI2942IwXmbxgjo/tbkGnM/hh63XwpbLwGa3qJCNwtjw46H4RpsJVPO7A
x4FxSG4JXHpTQO5cC17NgQfv6G4esMOhEV9ftK2dB4DRHEFU+SRQ6BnH13/ud9al
djrLoinSNG+83vmMIHJ7/feWw17u3JDPSOfQ9i+L4hIiiQPIHzabfQejAdrzEMZj
HDWvdEwNEhxsJnkNquEfgyOryDmg7BZYQm9AH6rNxx4RjKc=
-----END CERTIFICATE-----
*******************************************
*******************************************
C:\Program Files\Java\jdk1.8.0_171\bin>
或是采用下面语句:
C:\Program Files\Java\jdk1.8.0_171\bin>keytool -genkey -alias "tomcat_store" -keyalg "RSA" -keysize 2048 -validity 3650 -keypass "microstack_tomcat" -keystore "D:\tomcat_store.keystore" -storetype PKCS12 -storepass "microstack_store" -dname "CN=Sleeber, OU=Hazelnuts, O=MicroStack, L=ChaoYang, ST=BeiJing, C=China"
警告: PKCS12 密钥库不支持其他存储和密钥口令。正在忽略用户指定的-keypass值。
C:\Program Files\Java\jdk1.8.0_171\bin>keytool -list -v -keystore "D:\tomcat_store.keystore" -storepass "microstack_store"
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: tomcat_store
创建日期: 2018-8-16
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=Sleeber, OU=Hazelnuts, O=MicroStack, L=ChaoYang, ST=BeiJing, C=China
发布者: CN=Sleeber, OU=Hazelnuts, O=MicroStack, L=ChaoYang, ST=BeiJing, C=China
序列号: 57f1f548
有效期为 Thu Aug 16 16:09:38 CST 2018 至 Sun Aug 13 16:09:38 CST 2028
证书指纹:
MD5: 93:88:FD:FF:4F:26:7A:07:99:40:2A:15:57:A1:91:73
SHA1: 22:13:C9:0F:BF:3A:85:3E:D0:2A:14:6A:E5:02:1A:93:25:74:F2:99
SHA256: 71:9E:5B:91:7C:33:0D:83:7E:33:5C:DC:AC:EA:33:AD:A4:FD:DD:C5:33:05:77:9D:B4:01:92:81:21:CD:2E:E2
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: A6 3E F8 77 8C DE 1A 7F AE 26 2F 7F E2 1C 5F B5 .>.w.....&/..._.
0010: C5 09 B5 36 ...6
]
]
*******************************************
*******************************************
C:\Program Files\Java\jdk1.8.0_171\bin>
导出证书CA
C:\Program Files\Java\jdk1.8.0_171\bin>keytool -export -alias "tomcat_store" -keystore "D:\tomcat_store.keystore" -storetype PKCS12 -storepass "microstack_store" -rfc -file "D:\tomcat_store.cer"
存储在文件 <D:\tomcat_store.cer> 中的证书
C:\Program Files\Java\jdk1.8.0_171\bin>keytool -printcert -file "D:\tomcat_store.cer"
所有者: CN=Sleeber, OU=Hazelnuts, O=MicroStack, L=ChaoYang, ST=BeiJing, C=China
发布者: CN=Sleeber, OU=Hazelnuts, O=MicroStack, L=ChaoYang, ST=BeiJing, C=China
序列号: 3df65df6
有效期为 Thu Aug 16 16:05:06 CST 2018 至 Sun Aug 13 16:05:06 CST 2028
证书指纹:
MD5: 7F:E5:D2:28:8F:E1:17:C1:CF:2B:4A:5B:40:44:3B:21
SHA1: BF:21:1E:30:61:1E:F5:B6:4F:9C:36:16:F1:03:A7:D5:26:3D:AD:77
SHA256: 1D:D8:99:0F:91:6D:0E:1C:19:4A:45:83:E6:4A:90:D6:C9:C9:3B:7C:C5:8E:55:E4:66:34:67:2E:F8:3A:0A:28
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: F7 04 54 5E 4D 7C 86 91 4E B1 27 EB 49 7F 6A A0 ..T^M...N.'.I.j.
0010: B1 A8 24 6A ..$j
]
]
C:\Program Files\Java\jdk1.8.0_171\bin>
这个CA证书就是发给客户端用来验证服务器的。
tomcat配置:
这里使用的是apache-tomcat-8.5.32 windows 版本:
修改conf/server.xml文件中以下章节:
1、注释掉8080端口配置
<!--
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
2、取消注释8443端口配置,将生成的正式和密码配置到keystoreFile="**\tomcat.keystore" keystorePass="*****"
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
keystoreFile="C:\program.files\apache-tomcat-8.5.32\tomcat_store.keystore" keystorePass="microstack_store">
<!--
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
-->
</Connector>
3、重新启动tomcat,使用https://localhost:8443/ 访问就可以了