引入:

如果自己搭建局域网的应用的话,我们是没必要向证书颁发机构购买证书的。因为如果什么证书都能颁发证书的机构买的话,一来价格不菲,二来,在小型局域网应用中,因为使用者群体都是指定的人,所以不存在问题,所以我们完全可以自己签发一个安全证书。这种情况下,对于证书的信任就不是靠CA去认可了,而完全取决于局域网内部彼此的信任,比如我自己签发了一个证书,如果大家信任我,那么他们当然就会把私密数据通过SSL通道发送到我架设的服务器上,如果大家不信任我,那么他们就不会把私密数据通过SSL通道发送到我架设的服务器上。


分析:

从上述的简单说明中可以看出,如果是自签名的证书的话,证书安全性的校验不由权威机构负责,而是我们自己来负责。我这里来实践下。


首先,我们建立自签名的证书(这里尤其要注意的是,CN必须和服务器所在的计算机名一样):

比如,我的机器的计算机名是Charles:

SSL证书相关技巧 -- 玩转自签名证书_第1张图片


那么我们证书的CN也必须为Charles:


SSL证书相关技巧 -- 玩转自签名证书_第2张图片


我们查看证书确保和我们设想一致:

SSL证书相关技巧 -- 玩转自签名证书_第3张图片

因为我们的服务器使用tomcat(假定),所以我们需要在HTTPS的连接器(Connector)上来启用这个证书,为了简单起见,我们把clientAuth仍然保留默认值"false",来表明我们用的是最简单的是单向认证。

SSL证书相关技巧 -- 玩转自签名证书_第4张图片


这时候,我们启动tomcat,利用https访问首页,因为我们启用了https,并且用了自己签名的证书,所以第一次访问肯定受到浏览器的保护:

SSL证书相关技巧 -- 玩转自签名证书_第5张图片



这个合情合理,因为就算在局域网中,也不是所有人都认识我Charles的,他们凭什么要把敏感数据发送到我架设的服务器处理呢?


现在假定局域网中要访问我的网站的用户都认识我了,也知道我是个好人,我的网站是正当网站,那么他们如何让他们自己的浏览器解除对于我架设的网站的HTTPS访问限制呢?


显然就用老办法,只要我把我的证书分享给局域网中每一个信任我的用户,然后让他们自己把我的证书文件导入到他们操作系统的证书管理器的“受信任的根证书颁发机构”就可以了,这样他们就知道,我颁发的证书对于他们来说是信任的。


为此,我需要先导出证书,因为我这里证书用的扩展名是.keystore,我必须导出为X.509证书的形式(扩展名为cer或者crt),我的用户才可以导入这个证书到他们证书管理器。


于是我导出证书为X.509证书:

wKioL1Lvi-XCMcR1AADo1ezIwbE716.jpg


然后通过某种方式(要么共享文件,要么邮件或者samba服务器等), 把我的证书分享给大家。


这时候,局域网内名叫“张三”的用户只要打开他操作系统的证书管理器,添加我提供的证书文件(crt或者cer文件)就可以了,方法是:右击“受信任的根证书颁发机构”->证书-> 所有任务->导入 :

SSL证书相关技巧 -- 玩转自签名证书_第6张图片


然后选择我提供给张三的证书文件(cer或者crt文件):

SSL证书相关技巧 -- 玩转自签名证书_第7张图片


这时候,张三再访问我架设的服务器 (https://charles:8443/),就会发现地址栏上的锁是绿色的了:

SSL证书相关技巧 -- 玩转自签名证书_第8张图片



总结:


1.面向局域网的应用无需向证书颁发机构购买证书,使用自签名的证书就可以了。

2.在局域网内部利用HTTPS访问自签名的证书的网站,其网站的合法性不由权威的CA认证,而是由彼此的信任来保证。

3.为了让服务器开启https,必须在对应的连接器上配置证书文件和密码,并且可以启用单向加密或者双向加密。

4.当建立信任后,如果希望局域网内部的其他用户访问此站点不受到操作系统的限制,需要让用户依次导入对应证书并且将其设为“受信任的根证书颁发机构”。

5.因为自己签名的证书格式不能被直接导入,所以它必须先导出为X.509证书规定的格式,然后才可以被目标用户系统的证书管理器正确导入。