如何生成含subject alternative name字段的HTTPS证书?

摘要:背景 最近,某个运维同事找到我,说测试环境的某个域名(他也在负责维护),假设域名为test.baidu.com,以前呢,证书都是用的生产的证书,最近不让用了。问为啥呢,说不安全,现在在整改了,因为证书和私钥肯定要一起部署在服务器上,既然测试
背景 最近,某个运维同事找到我,说测试环境的某个域名(他也在负责维护),假设域名为test.baidu.com,以前呢,证书都是用的生产的证书,最近不让用了。问为啥呢,说不安全,现在在整改了,因为证书和私钥肯定要一起部署在服务器上,既然测试环境的服务器部署了生产上的证书,那也就是说私钥也部署在测试服务器上,那自然是不安全。咱们小公司嘛,就是这个样子的,管理不是很规范。 那现在也就是说,要给这个test.baidu.com这个域名,弄一个测试环境的证书。然后,他是运维嘛,办公电脑上装软件的限制比较多,就问我,能不能帮忙生成个test.baidu.com的证书给他,就那种自签名的就行了。 问题 我一想,我们之前有个环境测试https,搞过一个自签名证书,直接发给他就行了,然后他就拿去部署到nginx了。 ssl on; ssl_certificate comkey.crt; ssl_certificate_key comkey.key; ssl_session_timeout 5m; ssl_protocols TLSv1.2; 结果,过了两天,他说部署上去后,有个客户端调用的时候报错,说证书里有个字段的值没对。 我给他的证书里,如上图所示,subject alternative name的内容为:DNS NAME = ma-dev.example.com.cn,而他拿去部署的网站的域名为test.example.com.cn,导致客户端校验出错了,说能不能重新生成下证书给他。 我本来吧,不想弄的,因为我也忘了之前这个证书,怎么会包含这个字段,我也不知道这个字段啥意思。 到后面,还是接了这个事。 尝试 网上找了个教程:https://cloud.tencent.com/document/product/1552/111585 可惜,生成出来的证书,根本就没有那个certifacate subject alternative name字段。 他这个生成证书,其实分了三个核心步骤。证书呢,里面一般是包含了公钥,这个是公开的,浏览器拿到证书后,会检查证书,有一堆规则,比如:验证证书是由合法的root CA签发的,没过期,没吊销等,如果都没问题,就认为证书有效,就会取出证书中包含的各个信息,如公钥信息。 这个公钥和服务端私密保存的私钥(也就是key文件,一般会配置到nginx里),是一一对应的,一般私钥发生了泄露,这个证书就算是废了。 所以,回到我们的证书生成环节,也是我们先生成一个私密的key,如上面的openssl genrsa -out server.key 2048这步。 然后呢,用这个key,去生成一个证书签名请求文件(CSR)。 CSR(Cerificate Signing Request),即证书请求文件,是证书申请者在申请数字证书时,生成私钥的同时生成证书请求文件。证书申请者把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件。 这个CSR里,就要包含我们希望放进证书的各种内容,比如我们本文提到的certifacate subject alternative name这些字段等。CSR准备好了后,提交给各个CA机构,然后CA机构理论上来说,会核查你、你的网站等各种身份信息,核查无误后,就会用它这家CA的私钥,对你的CSR进行签名,然后就生成了一个它这家CA认可的证书了。 后续,你就拿着这个证书,传输给用户的浏览器,用户浏览器中,有这家CA的公钥,自然就能发现你这个证书确实是这家CA的私钥签发的,就认可你的证书,后续就能正常通信。 回到我们的问题,首先,我们就必须要保证CSR文件中,包含我们的certifacate subject alternative name字段才行。 生成csr 由于这会在家里,连不上公司vpn了(正好到期了),也没法演示之前的各种错误了。所以就直接记录一下各种正确的方法。 方法1: addext选项 这个选项是openssl的1.1.1版本才有的。查看版本:openssl version。一般来说,linux服务器的openssl版本升级还是非常慎重的,如果发现版本不支持,那么,有个好办法,直接在windows上安装高版本的openssl来生成csr也是一样的: http://slproweb.com/products/Win32OpenSSL.html 这里可以下载,如(Win64 OpenSSL v3.4.1)。
阅读全文