小明: OK,我已经申请好HTTPS的凭证了,只要把ca_bundle.crt
, certificate.crt
, private.key
放入Server我们网站就有HTTPS啰。
小美: 太好了,是说这三个档案到底是什么呢?
小明: ㄜ ...我记得HTTPS是用非对称式加密,会有把公钥,有把私钥,然后浏览器端透过公钥加密,然后传到Server上透过私钥来解密,对吧?
小美: 可是这三个档案好像不是非对称式加密那么简单,certificate.crt
叫做凭证,ca_bundle.crt
叫做中间凭证,我压根没看到公钥的档案啊。
小明: ...让我Google一下...
不知道大家是否有遇到以上状况,我在以前透过凭证来替Server安装HTTPS时,其实我只是将凭证安装完毕,但是并不知道实作内容到底是什么样子,这篇文章就来介绍一下HTTPS的概念。
将会介绍
非对称式加密数位签章凭证的作用实际上HTTPS是怎么运作信任链非对称式加密
我们可以先有个简单的观念就是:
资料可以透过公钥加密,但无法透过公钥解密,只能透过私钥解密。
资料可以透过私钥加密,但无法透过私钥解密,只能透过公钥解密。
因为只能靠不同把钥匙解密,所以我们称为「非对称」
为什么要这样呢?
因为如果可以靠「同一把」钥匙解密,虽然我们理想上可以透过下图加密资料:
但实际上很容易因为钥匙被拦截,而导致资料外洩:
所以需要非对称加密
如果加密资料不能用「同一把」钥匙解密,就可以避免这个问题了,所以套到拦截的情境会变成下图:
但是攻击者如果有自己的公钥与私钥呢?
这是个更棘手的状况,因为攻击者可以趁机替换小明拿到的公钥,如下图:
小明的资料还是照样被偷走了,那要怎么办呢?
我们需要一个公正的第三方证明,此公钥是此Server的
所以我们需要凭证证明此公钥,而证明的方法就是「数位签章」
我们可以先有个简单的概念:
凭证 = 公钥 + 此公钥是属于哪个Server的资讯 + 数位签章
我们的公钥可以透过一个有公信力的第三方来证明是此Server的公钥,而不是来路不明的攻击者,此方法是透过数位签章。
数位签章与加密相反,他是透过「私钥加密,公钥解密」,他让我们的公钥是有第三方签名的,如图:
这个签名拥有这个公钥的属于哪个Server的资讯,而签章要解密就需要公钥,所以我们的浏览器都有这些「第三方公钥库」,浏览器配合第三方公钥库可以这样验证凭证:
所以套回攻击者的情境就会变成下图:
小明的浏览器就会跳出下图,就是说明此凭证不是第三方公钥库拥有的:
在攻击者无法进行任何攻击手段时,正常安全的Client与Server沟通流程如下:
有趣的是,其实不止浏览器,我们的任何程式,都有类似的第三方公钥库去验证HTTPS的签章是否符合正常,比如说Node.js在询问到没看过的HTTPS签章时就会出现下图:
实际上HTTPS是怎么运作
接下来,介绍一下HTTPS实际怎么运作,
其实Client并不会每次都用非对称加密与Server沟通,只有在「第一次」,而已,可以参考此篇文章
里面的图讲解的很清楚,在此贴上
图的意思整体是说:
透过「非对称式加密」,让浏览器可以「安全的」传送一个钥匙给Server,我们称为Session KEY,之后浏览器与Server沟通就透过此Session KEY来做「对称式加密」
为什么要这样呢?因为非对称式加密的数学演算较久,而对称式加密较快,我们可以透过非对称式加密来达到「安全传送钥匙」的效果,再透过此钥匙用一般的对称加密,就可以又快又安全了~
信任练
虽然我们整个流程貌似完全安全了,但还有最后一个破口,就是「第三方」,如果第三方的私钥被偷窃,那所有透过此第三方签出去的凭证都会有安全上的危险,因为偷窃者可以使用此私钥来製作一模一样的签章。
那要怎么分散风险呢?最简单的方法就是:
不要很常用这个我们称为「根凭证」的原始私钥,把他一直藏着,就不会被偷啦!
是不是让人觉得这方法很没技术性?但仔细想想,这的确就是最根本的解决办法xdd,我们可以看看知名的第三方组织Let's Encrypt的根凭证保护方法,是将根凭证「离线储存在安全地点」,
但我们还是需要签证呀,总不能每次签证都要请人员跑道安全地点拿私钥来签证吧,为此第三方会再做出多组公私钥,并用根凭证的私钥签这些公钥,这些签完的公钥就将我们称为「中间凭证」,根凭证的私钥签完就可以先离线储存在安全地点了,我们后来的签证都靠中间凭证的私钥来做。
如果我们Server去请第三方帮忙签章,第三方都会用此中间凭证的私钥来签章,这样一来,如果中间凭证的私钥被偷,也只有被这组签发的凭证会报销。
小叮咛
这边提出我当初学习常常有的误解:
HTTPS的作用用来保证Client与Server沟通的安全,但没办法确保Server不对Client做坏坏的事。HTTPS能保证Client与Server沟通时资料不会外洩,但如果攻击者在拦截封包时直接将封包丢掉,那Client还是收不到封包,这不是HTTPS要解决的事情。HTTPS跟资料库的明码没有关係,并不会因为有HTTPS而导致资料库的明码受到加密。谢谢你的观看,也欢迎指正交流~感谢!