【自签名证书】如何解决访问蓝鲸平台时,提示网站不安全问题?

上一篇文章中我们介绍了HTTPS中用到的证书了,也知道对于我们开发者来说最常用到的其实是自签名证书,可自签名证书也不是能随便生成的。

如果还没读过的可以点击HTTPS那些事儿(一),网络中的身份证——SSL证书!

今天我给大家分析一下蓝鲸平台自带的证书的问题,并且和如何去生成和使用一个自签名证书。

为什么要替换蓝鲸自带证书?

因为蓝鲸平台自带的证书也是个自签名证书,但是却是个“有问题”的证书。为什么说它是有问题的呢?首先打开蓝鲸paas首页时大家应该都会出现以下页面:

因为用的是自签名证书浏览器会提示这个链接不安全,这时候如果用的是windows系统的浏览器会有个“继续前往xxx”的选项来忽略这个警告继续访问,但如果是linux系统的浏览器就没那么好说话了,会显示以下界面(ubuntu系统的chrome浏览器):

31451e85a34b4e1a9b9fc89b0d0a44c1.pnguploading.4e448015.gif转存失败重新上传取消

没有“继续前往xxx”的选项,原因还是因为这个证书是“有问题”的,而windows可以选择对这个“残废”的证书睁一只眼闭一只眼但linux下更为严格的验证机制不允许这种情况发生。

说到这其实大家肯定觉得这不是什么大问题,毕竟linux系统比较小众,除了笔者这种觉得敲命令行比windows方便的开发者基本没几个人会去用。

但问题是——我们写的代码99%的情况下是跑在linux系统的服务器上的!而这个证书的问题除了浏览器没有“继续前往xxx”的选项外带来的后果还有在使用linux的curl命令时会出现如下图所示的报错:

就算你百度了centos、ubuntu如何信任证书并将这个证书加入到系统的受信任证书根目录依然还会有这个错误。

有些同学可能会说我们可以给curl命令加上“-k”选项来忽略证书验证问题,但这样做只是一种掩耳盗铃的方式,实际上是把https当http用了,那我们用https就没意义了起不到防护中间人攻击的目的。

自签名证书被浏览器提示不安全并不是说它真的起不到安全的作用,而是浏览器不认识这个证书,但实际上当我们知道这个证书是安全的并信任它时它就是安全的,而加“-k”和“继续访问xxx”实际上是不管什么证书都认为是安全的,就跟没证书一样。

到了这里大家可能还是觉得问题不大,因为除了测试接口我们好像也不需要用到curl啊。但我要告诉你除了curl其它编程语言里的http相关的包里的发送请求部分其实都是有这个问题的,比如python语言的requests包,当你试图运行以下代码时会出现报错(别提verify=False了,那个和curl -k是一样的)。

还有在3.5.x版本的CMDB里设置事件推送时如果设置的url是paas平台上部署的接口将会无法推送,因为配置平台的代码里并没有忽略证书的验证,就会产生这个问题。好了,说了一大圈我好像还是没有解释为什么说这个证书是“有问题”的。

点开上图画圈的地方找到这个页面:

再找个知名的网站看看相同的页面:

会发现下面的证书的路径多了几层证书,这就叫证书链。还记得我们上篇说的证书需要由CA颁发的事吗,这个页面就是显示这个证书是从哪来的。

因为根CA一般是不会直接颁发证书的,而是给二级CA颁发证书,二级CA又给三级CA颁发证书……就像我们办身份证不会直接去北京的公安部办而是去辖区派出所办一样,这样子的层级关系就形成了一个链条就叫证书链。

观察蓝鲸的证书我们可以发现它只有一级,上面没有其它层级了。当然并不是说只有一级就不行,如果这个证书是CA的话就算只有一级它的证书链也是完整的,可以被linux系统验证。问题就出在这个证书恰恰不是CA。怎么知道的呢?我们来看另一个自签名证书:

也是只有一级,但详细信息里还有这一行:

基本约束的“Subject Type=CA”说明这个证书本身就是CA,所以它的证书链是完整的,CA本身可以证明这个证书自己是合法证书。但对于蓝鲸自带的证书来说它就没有这个基本约束,因此这个证书不是CA,但又不是CA颁发的证书,它的证书链就不是完整的,没人能为它作证。这就是它“残废”的原因,也是它在linux平台上即使在代码里信任了或者加到系统的受信任根证书目录里了也不能通过验证的原因。

 

生成并替换蓝鲸平台自带SSL证书

生成自签名证书

生成自签名证书最常用的工具是openssl,windows和linux平台都可以使用这一工具,由于笔者使用的开发机器是linux系统的因此只给大家介绍在linux系统下的openssl的操作方法。

一般linux系统都会预装有openssl,但版本一般都是比较旧的1.0.x的,建议大家还是先升级一下openssl的版本,因为新版的openssl命令比较方便可以直接生成“使用者备用名称”(subjectAltName)这一约束,这个约束是比较重要的东西,证书里缺了这个的话chrome会出现下面这个问题。

所以建议大家使用如下图所示版本的openssl,接下来的操作也是基于这个版本而实现的。

升级完openssl的版本之后就可以生成证书了,命令如下:

稍微解释一下命令的参数:

  • req openssl 的证书请求文件管理模块。
  • -x509 证书格式为x509。
  • -newkey 和前面的x509结合表示创建一个自签名证书和私钥。
  • rsa:4096 RSA加密算法的位数,建议2048起步,小于2048会被浏览器认为是不安全的。
  • -sha256 摘要算法。
  • -days 3650 证书有效期为3650天。
  • -nodes 不加密私钥。
  • -keyout 私钥的存放路径和文件名。
  • -out 生成的自签名证书的存放路径和文件名。
  • -addext 1.1.1 以上才有的选项,可以很方便的添加特定扩展名,如上文提示的SAN, subjectAltName=DNS:*.bking.com,DNS:paas.bking.com,DNS:cmdb.bking.com表示证书适用的域名,格式为DNS:x.x.x,多个域名用逗号隔开,这样就可以一个证书用在多个环境的平台上,比如:开发环境、联调环境、生产环境共用一个证书。

敲完命令按回车后出现一个交互式窗口让你填一些信息:

不想填的话直接按回车跳过就行了......如此就生成了一个bk_domain.crt证书文件和一个bk_domain.key私钥文件。

替换蓝鲸自带证书

将上面生成的两个文件复制到蓝鲸平台的nginx角色服务器(可以用cat /data/install/install.config命令查看哪台是nginx角色服务器)上替换/data/bkee/cert目录下的同名文件后重启nginx(重启命令nginx -s reload)。

客户端信任证书

经过上面的操作后你会发现你打开浏览器还是会报网站不安全,配置平台事件订阅还是失败,curl命令还是要加-k才能执行。因为我们还需要在客户端上信任证书才行,说一下几种类型的客户端的信任方法:

windows浏览器

最简单,如下图所示先把导出来:

双击打开导出的证书,点击“安装证书”,如下图所示选择即可。

再打开浏览器访问蓝鲸平台就不会提示网站不安全了!

linux服务器

这种主要是要解决代码访问接口时认证问题,比如配置平台的事件订阅功能和部署在paas平台上的saas应用调接口时要启用ssl验证问题。以蓝鲸平台要求的cetos发行版linux为例:

  • 将bk_domain.crt文件上传到配置平台和appt,appo的服务器的/etc/pki/ca-trust/source/anchors目录下。
  • 输入update-ca-trust后回车。

如此即可完成信任操作,配置平台事件订阅配paas平台的接口地址时将不会报错,python代码里的requests调用接口时verify=”证书文件”也不会报错。curl命令也可以不加-k执行。

作者:陈喜科

出品:嘉为科技

更多优质文章

HTTPS那些事儿(一),网络中的身份证——SSL证书!

运维流程管理:保障运维管理效能的推手

【案例分析】如何实现企业SSL证书有效管理和监控?

猜你喜欢

转载自blog.csdn.net/weixin_42556618/article/details/105436933