基本概念
HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议;使用 HTTPS 连接时,服务器要求有公钥和签名的证书。
SSL 证书是一种数字证书,实现信息的加密传输。需要ssl证书的网站类型包括银行、购物类交易网站。
如果某个网站要求你填写信用卡信息,首先你要检查该网页是否使用 https 加密连接,如果没有,那么请不要输入任何敏感信息如信用卡号。
服务器采用https必须从CA 申请一个用于证明服务器用途类型的证书,大多数CA都是收费的。VeriSign即是一个著名的国外CA机构,工行、建行、招行、支付宝、财付通等网站均使用VeriSign的证书,而网易邮箱等非金融网站采用的是中国互联网信息中心 CNNIC颁发的SSL证书。一般来说,一个证书的价格不菲,以VeriSign的证书为例,价格在每年8000元人民币左右。听说StartSSL针对个人的基础型证书是免费的。该证书只有用于对应的服务器的时候,客户端才信任此主机,客户通过信任该证书,从而信任了该主机. 其实这样做效率很低,但是银行更侧重安全。 所以目前所有的银行系统网站,关键部分应用都是https的。
为确保每个用户都从HTTPS中受益,我们应该将所有传入的HTTP请求重定向至HTTPS。这意味着任何一个访问网站的用户都将自动切换到HTTPS,从那以后他们的信息传输就安全了。验证用户名和密码只是web上用户身份验证的一部分:像淘宝一样我们还需要记住某个已经验证过的特定用户,最常见的办法是使用session cookies,这通常意味着浏览器sessionId存储在一个cookie中,服务器端的数据库知道这个sessionId对应某个特定的session,而那个session又对应着某个特定的已验证用户。如果有人用某种方式得到了用户的sessionId,那么在登陆之后,他就获得了用户所有的权限,这和知道密码没什么两样。
简而言之:由于允许访问用户账户的session cookie,仅仅保障登陆页面的安全是绝对不够的,除非用户已经连上了SSL,否则他们不应该传输任何机密信息,比如session cookie。
如何购买https证书?
一般https证书是免费的,但是免费的https证书会一直提示网络安全证书有问题,是不被浏览器等客户端识别的,如果不想一直提示,需要得到相关机构认可,需要购买相关认证机构的证书,比如 https://www.wosign.com/ 【注意】:证书一般是需要指定ip和域名的,如果要更改就得重新购买,所以在购买前,哪些产品需要用到此证书,一定考虑清楚相关ip和域名
如果是阿里云申请的SSL证书,下载tomcat版本的,里面会有xxx.pfx和密码文件
配置Tomcat服务器
购买后的https证书会以一个jks文件给使用公司,比如:www.abcd.com.jks,端口为2443,外网端口12443,需要在server.xml里配置https连接,
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="2443" />
<Connector port="8099" protocol="AJP/1.3" redirectPort="2443" />
//打开Tomcat根目录下的/conf/server.xml,找到Connector port="8443"配置段,修改为如下:
<Connector port="2443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/home/cxb/credential/https/abcd.com.jks" keystorePass="123321"
truststoreFile="/home/cxb/credential/https/abcd.com.jks" truststorePass="123321"/>
(tomcat要与生成的服务端证书名一致)
属性说明:
clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证
keystoreFile:服务器证书文件路径
keystorePass:服务器证书密码
truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书
truststorePass:根证书密码
以上配置好后,访问https://www.abcd.com:12443即可。
配置web.xml
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<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>
TLS与SSL(Secure Sockets Layer)
1、在理解的时候可以认为两者都是一致的,TLS协议是SSL协议的升级版。
协议是解决方案、标准,能够解决很多普适性的问题,在互联网开发中,TLS/SSL协议是最常见的安全解决方案,为什么呢?任何基于TCP/IP 的网络应用都会遇到安全问题,比如中间人攻击、无法对对端进行身份验证,传输的数据不具备机密性,这些问题都可以使用TLS/SSL协议解决。
对于应用层协议而言,它无需过多改变,引入TLS/SSL协议即可保证数据机密性和完整性。
2、中间人攻击概念
服务器传递给客户端的公钥可能被攻击者替换,这样安全性就荡然无存了。中间人攻击过程:
- 客户端向服务端发送请求,期望获取服务器的RSA公钥,攻击者劫持了这个请求
- 攻击者忽略客户端请求,向服务器发送请求,获取服务器的RSA公钥
- 攻击者自己生成一对RSA密钥对,然后将攻击者的RSA公钥发送给客户端
- 客户端通过攻击者的公钥加密密钥块A并发送给服务器,实际上发送给攻击者
- 攻击者用自己的私钥解密,然后用服务器的公钥加密得到密钥块B,发送给服务器
- 服务器用自己的私钥解密得到密钥块B
- 客户端使用攻击者的密钥块A,采用AES算法加密数据并发给服务器端,实际上是发送给攻击者。
- 攻击者采用AES算法解密出明文,客户端相当于泄露了隐私,攻击者使用密钥块B+AES算法加密明文后发送给服务器
- 服务器使用密钥块B,采用AES算法加密数据并发送给攻击者
- 攻击者使用密钥块B,采用AES算法解密出明文数据,此时服务器和客户端的加密数据被成功破解。
3、TLS/SSL协议中,客户端无法确认服务器端的真实身份,客户端访问某域名,接收到一个服务器公钥,但无法确定公钥是不是真正属于该域名,解决方案是引入证书
参考: