网站如何部署https
发表于 2019-06-23 21:15
为什么需要https?
宏观上来说,https主要作用,一是保证web内容的安全性,另一个是保证网站的可信。
防止信息泄露
web信息在传递过程中需要经过其他多方转发,而http协议使用明文传输,这意味着任何有想法的人,都可以在任意网络链路环节截获你的数据包,按照网络协议格式解包即可得到你发送的信息。包括手机号、密码、个人身份信息等敏感信息。https将发送的信息全文加密,第三方即便截获了我们发送的信息,因为没有解密手段,无法得到有效信息,有效防止信息泄露。
防止信息篡改
同样的,由于得不到有效的数据信息,篡改信息将会失去意义。另外因为https通讯双方使用统一的密钥进行通讯,篡改信息会被马上发现。
现在大量存在运营商劫持,运营商劫持是指,web内容经过相关的ISP时,ISP截获明文数据,在请求内容中,通过植入广告等内容盈利。使用https可以杜绝这种情况。
确保通讯双方的可信
网络攻击中,还存在欺骗攻击的方式,虽然无法获取正在通讯的双方的私密信息,但第三方仍然可以伪装成可信的通讯一方,按照正常的加密通讯流程进行通讯。https通过CA一般可信第三方,大大确保通讯双方的身份都是可信的。
https的基本原理和主要通讯流程
本节只是简单介绍,有关详细内容涉及到数学数论、计算机网络、网络协议、密码学等内容。不做详细展开。
对称加密和非对称加密算法
通常,在宏观上,信息的加解密是这样样子的:
明文 + 加密算法 + 密钥A = 密文
密文 + 解密算法 + 密钥B = 明文
当A和B是同一个时,我们把这种加解密称之为对称加密算法。
当A和B不是同一个时,这种加解密称之为非对称加密算法。
为什么要引入非对称加密?
在理想情况下,只要通讯双方拥有同一个密钥,双方就可以安全的进行通讯了,只要双方保证自己的密钥不泄露即可。但是关键在于,通讯双方怎么拥有同一个密钥,且不泄露呢?
假设通讯方1,生成的一个密钥,通讯方1必须有一种策略把密钥交给通讯方2。
但是不能将密钥直接通过网络发送给通讯方2,因为发送的密钥有被第三方截获的风险,一旦密钥被截获泄露,就没有任何安全性可言了。
天才的数学家找到了非对称加密算法。
密钥A称之为公钥,密钥B称之为私钥,在一般情况下,通讯方1用公钥加密数据,通讯方2用私钥解密数据,这样就巧妙的进行了“密钥协商”(见后面的流程)
另外,非对称加密的复杂度和性能消耗远大于对称加密。
https的基本流程
第一部分:准备
这个部分主要是发起连接,DNS解析等操作
第二部分:协商密钥
前面提到,利用非对称加密算法,巧妙完成密钥协商后,就可以转为使用消耗更低的对称加密算法了。
具体过程如下图。
第三部分:由非对称加密算法转为对称加密算法进行通讯
对称加密的密钥就是上一步得到的协商密钥,客户端和服务端都遵循
加密数据 - 发送 - 接收 - 解密数据
这样的逻辑进行加密通讯。为什么需要CA?
加密的逻辑没问题,但如果一开始服务器发送的证书就是不合法的,或者被替换成了第三方的,那么后面的过程就没有“信任”了。如何验证证书的合法性呢?这时候就需要一个“一般信任第三方机构”,也就是专门做证书的CA。CA负责统一管理证书,浏览器或操作系统会默认装了主流CA签发的根证书,用这些根证书,进而验证证书的合法性(当公钥和私钥的用法倒过来时,就是电子签名了)。
当然这里的信任机构也仅仅指大部分情况下,如果CA管理混乱或是受到政治影响,仍然可以导致非法的证书被“认为是合法的”。
扩展阅读:谷歌封杀赛门铁克事件
申请SSL证书
CA
CA的其实关系不是很大,有很多的CA机构都可以选择。有一种简单是方式就是查看大网站使用的CA。
例如,支付宝的CA机构是DigiCert Inc:
再比如中国工商银行-个人网上银行的CA是DigiCert Inc:
另外,还有一些其他代理机构,可以代为申请证书,例如阿里云就有相关的服务。
免费的证书也有很多,例如阿里云和腾讯云代办的赛门特克的证书。
申请证书
如果使用国内服务商提供的服务,申请证书就非常简单了。
只需要提供一些实名信息和域名信息就可以了。
需要注意的是,证书分为多种类型,单域名证书、多域名证书、通配符证书、泛域名证书等,区别主要是支持的域名数量不同。例如上面这个支付宝的证书,就属于泛域名证书,这意味着只要一级域名在alipay.com下的所有子域名都可以使用这个证书。
证书文件
我从腾讯云上申请了一个证书,腾讯云已经把证书的格式全部弄好了,直接部署到对应的服务器容器就可以了。
部署SSL证书 - Tomcat
将证书文件复制到tomcat实例目录的conf目录下,随便建个文件夹丢进去,比如cert
打开conf下的web.xml,找到http的connector
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
redirectPort="8443"
改成https的端口号,比如在此处,改成redirectPort="443"
(https默认端口)在下面,添加新的https connector
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="443" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" keystoreFile="conf/cert/www.mazhewei.cn.jks" keystorePass="密钥文件访问密码" clientAuth="false" sslProtocol="TLS" />
其中,port设置https的端口,keystoreFile指向证书文件,keystorePass填写密钥文件访问密码
腾讯云的密钥文件访问密码在keystorePass.txt文件中
在确保没有其他服务端口冲突的情况下,重启tomcat服务即可完成配置。
部署SSL证书 - Apache
将crt格式证书文件复制到Apache conf目录下的ssl.crt目录下
将key格式私钥文件复制到Apache conf目录下的ssl.key目录下
将csr格式私钥文件复制到Apache conf目录下的ssl.csr目录下
打开conf下的httpd.conf,找到mod_ssl模块
#LoadModule ssl_module modules/mod_ssl.so
将前面的#号去掉,表示启用ssl模块,如果本来就是启用的,则不用做其他修改
找到引入ssl配置文件的地方
#Include conf/extra/httpd-ssl.conf
将前面的#号去掉,表示引入ssl配置,如果本来就是启用的,则不用做其他修改
http重定向(可选):在httpd.conf末尾加上如下内容,可启用http到https的重定向
RewriteEngine onRewriteCond %{SERVER_PORT} !^443$RewriteRule ^/?(.*)$ https://%{SERVER_NAME}/$1 [L,R]
打开conf/extra/httpd-ssl.conf
找到常规定义,修改ServerName和ServerAdmin
ServerName www.mazhewei.cn:443ServerAdmin admin@mazhewei.cn
ssl证书配置
SSLCertificateFile "conf/ssl.crt/2_www.mazhewei.cn.crt"
私钥配置
SSLCertificateKeyFile "conf/ssl.key/3_www.mazhewei.cn.key"
证书链配置
SSLCertificateChainFile "conf/ssl.crt/1_root_bundle.crt"
httpd-ssl.conf完整配置参考:
Listen 443 SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES SSLHonorCipherOrder on SSLProtocol all -SSLv3 SSLProxyProtocol all -SSLv3 SSLPassPhraseDialog builtin SSLSessionCache "shmcb:C:/Servers/XAMPP/apache/logs/ssl_scache(512000)" SSLSessionCacheTimeout 300 #SSLUseStapling On #SSLStaplingCache "shmcb:${SRVROOT}/logs/ssl_stapling(32768)" #SSLStaplingStandardCacheTimeout 3600 #SSLStaplingErrorCacheTimeout 600 <VirtualHost *:443> DocumentRoot "C:/Servers/XAMPP/htdocs" ServerName www.mazhewei.cn:443 ServerAdmin admin@mazhewei.cn ErrorLog "C:/Servers/XAMPP/apache/logs/error.log" TransferLog "C:/Servers/XAMPP/apache/logs/access.log" SSLEngine on SSLCertificateFile "conf/ssl.crt/2_www.mazhewei.cn.crt" SSLCertificateKeyFile "conf/ssl.key/3_www.mazhewei.cn.key" SSLCertificateChainFile "conf/ssl.crt/1_root_bundle.crt" #SSLCACertificatePath "${SRVROOT}/conf/ssl.crt" #SSLCACertificateFile "${SRVROOT}/conf/ssl.crt/ca-bundle.crt" #SSLCARevocationPath "${SRVROOT}/conf/ssl.crl" #SSLCARevocationFile "${SRVROOT}/conf/ssl.crl/ca-bundle.crl" #SSLCARevocationCheck chain #SSLVerifyClient require #SSLVerifyDepth 10 #SSLSRPVerifierFile "${SRVROOT}/conf/passwd.srpv" #<Location /> #SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \ # and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \ # and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \ # and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \ # and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \ # or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/ #</Location> #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory "C:/Servers/XAMPP/apache/cgi-bin"> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-5]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 CustomLog "C:/Servers/XAMPP/apache/logs/ssl_request.log" \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost>
重启apache服务
部署SSL证书 - Nginx
将证书文件复制到nginx实例目录的conf目录下,随便建个文件夹丢进去,比如cert
打开conf下的nginx.conf,添加如下段落到http区域中
server { listen 443 ssl; server_name www.mazhewei.cn; ssl_certificate cert/1_www.mazhewei.cn_bundle.crt; ssl_certificate_key cert/2_www.mazhewei.cn.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
listen
设置端口、ssl_certificate
指向证书文件、ssl_certificate_key
指向私钥文件使用
nginx -s reload
重新载入配置或重启nginx部署SSL证书 - IIS
将证书文件复制到IIS实例目录下(默认是C:\inetpub),随便建个文件夹丢进去,比如cert
直接运行pfx文件,按照向导,输入keystorePass.txt中的证书访问密码后,完成证书导入
打开IIS管理器,在网站上右键——编辑绑定
添加——类型选https——选择导入的证书
重启IIS网站
部署注意事项
云服务器一般存在额外的安全组或者防护措施,需要注意是否开放了响应端口
域名需要备案才可以使用,否则容易被封禁导致只能服务器本机使用https
要将web容器程序添加到防火墙的允许通过列表中
如果有多个实例/多个web服务,需要注意端口冲突,查看端口占用
netstat -ano | findstr "443"
参考资料
Apache Tomcat 9 SSL/TLS Configuration How-To:https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html
Apache SSL/TLS Strong Encryption: How-To:http://httpd.apache.org/docs/2.4/en/ssl/ssl_howto.html
Nginx Configuring HTTPS servers:http://nginx.org/en/docs/http/configuring_https_servers.html
微软 Configuring SSL in IIS Manager:https://docs.microsoft.com/zh-cn/iis/manage/configuring-security/configuring-ssl-in-iis-manager
简书 https建立连接过程:https://www.jianshu.com/p/33d0f8631f90
cnBlog SSL证书原理详解:https://www.cnblogs.com/dinglin1/p/9279831.html
CSDNBlog HTTPS 建立连接的详细过程:https://blog.csdn.net/q781045982/article/details/78553212
阿里云帮助中心 SSL数字证书Tomcat配置部署指导:https://help.aliyun.com/video_detail/54217.html?spm=5176.2000002.0.0.7b3a3c8fEOrEmG&tdsourcetag=s_pctim_aiomsg
阿里云帮助中心 Tomcat服务器安装SSL证书:https://help.aliyun.com/knowledge_detail/95496.html?tdsourcetag=s_pctim_aiomsg
蓝点网 测试你的网络是否被运营商劫持:https://www.landiannews.com/archives/29272.html
CSDNBlog Tomcat配置ssl证书(.jks)实现HTTPS:https://blog.csdn.net/u010904188/article/details/80966515
cnBolg Apache配置HTTPS功能:https://www.cnblogs.com/liaojiafa/p/6028816.html
评论 (0人参与)
最新评论